CSSの便利なセレクタ10選

以下は[CSS MENU MAKER](http://cssmenumaker.com/)というメニューCSS作成サイト内にあるブログ、[10 Handy CSS Selectors](http://cssmenumaker.com/blog/10-handy-css-selectors/)の日本語訳です。
いつも以上に意訳というか適当訳多め。

# 10 Handy CSS Selectors

空の要素、特定の要素、または任意の要素をターゲットにできる強力なCSSセレクタのことを知っていますか？
経験豊富なフロントエンド開発者は皆知っています。
古い開発者はこれらの使用を嫌がるかもしれません。
しかしブラウザの開発はこんにち益々加速しており、今更使用を躊躇するべきではありません。
上記を念頭に置いて、今すぐ使い始めることができる便利なセレクタを10種類、以下に用意しました。
古のIEはサポートしていませんが、そのために[Polyfill](http://selectivizr.com/)というものが存在します。

## +

ある要素の直後に存在する要素だけを装飾したい、そのような場合は隣接 しぶりんセレクタ ( Adjacent Sibling Selector ) の出番です。
たとえば、入力欄にカーソルを置いたときにツールチップを表示させることができます。

```css:CSS
	input + span {  
	  opacity: 0;
	  transition: all 0.3s;
	}

	input:hover + span {  
	  opacity: 1;
	  padding-left: 10px;
	}
```

```html:HTML
	<input placeholder="Type here" /><span>I'm a tooltip</span>  
```
このようになります。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/26088/98761231-80fc-4edc-9e00-1a0636b8d229.png)


## ~

直後のひとつだけではなく、当てはまる要素を全て選択するためには、代わりに一般 しぶりんセレクタ ( General Sibling Selector ) を使用します。
これによって、ある要素"より後ろ"にある要素の全てを選択することができます。
ある要素"より前"にある要素を選択するセレクタはありません。

```css:CSS
	input ~ span {  
	  opacity: 0;
	  transition: all 0.3s;
	}

	input:hover ~ span {  
	  opacity: 1;
	  padding-left: 10px;
	}
```
```html:HTML
	<input placeholder="Type here" /><span>★</span><span>★</span><span>★</span>  
```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/26088/6eb8614f-8271-4c2c-2b4d-03b3e0dea8c3.png)


## *

全称セレクタ ( Universal Selector ) は、文字通り全ての要素に適用されるので、使用には注意してください。
今日ではその主な用途は[border-box](http://paulirish.com/2012/box-sizing-border-box-ftw/)を適用するためのものですが、他にも[楽しい使い方](http://css-tricks.com/things-it-might-be-funuseful-to-try-the-universal-selector-on/)が幾つか存在します。

```css:CSS
	* {
	  -moz-box-sizing: border-box;
	  -webkit-box-sizing: border-box;
	  box-sizing: border-box;
	}
```


## [attr]

おそらく普段はclassやidでのセレクタをよく使っていることでしょうが、要素の属性でもセレクトできることを知っていますか？
属性セレクタ ( Attribute Selector ) の最もよく見かける使い方は`input type`ですが、それ以外の任意の属性、またHTML5の`data-*`属性を使うこともできます。
さらに、特定の単語で始まる場合など、属性値に対して[フィルタリングを行う](https://developer.mozilla.org/en-US/docs/CSS/Attribute_selectors)ことも可能です。

```css:CSS
	input[type=text] {  
	  border-color: green;
	}

	input[type=password] {  
	  border-color: blue;
	}
```

![03.png](https://qiita-image-store.s3.amazonaws.com/0/26088/0579762e-61b0-de76-865d-c3b629d3b76b.png)


## :empty

:empty疑似クラス ( Empty Selector ) はおそらく滅多に使われませんが、必要なときには便利です。
ショッピングカートにアイテムを突っ込むとその画像が表示される`<div>`タグがあったとして、カートが空の場合は要素の中身は空っぽで何も表示されません。
`div:empty`にスタイルを設定すると、カートが空の場合にだけ特別な表示を行うことができます。

```css:CSS
	div:empty {  
	  background: url(images/empty.png) no-repeat center;
	}
```

![04.png](https://qiita-image-store.s3.amazonaws.com/0/26088/efc399cb-b7d6-10a7-3816-584e34a2edc2.png)


## :target

ページ内の要素にIDを振っている場合、:target疑似クラス ( Target Selector ) を使うことができます。
:target疑似クラスは、[リンク先の要素にスタイルを適用する](https://qiita.com/junya/items/c9741fbddb667992a1ef)ことができるセレクタです。

```css:CSS
	#target-example:target {
	  background: #FFF9D8;
	}
```

## :only-of-type

:only-of-type疑似クラス ( Only of Type Selector )は、`nth-of-type`や`nth-child`セレクタとよく似ています。
それらが複数の子要素に対するものであるのに対して、`only-of-type`は唯一の子要素であるかどうかを確認することができます。
例えば、あるページに3個のボックスがあり、ブログの最新投稿などが表示されているとします。
古くなった記事は表示されなくなるとすると、あるときは3点とも表示され、またあるときはひとつだけしか表示されないこともあります。
ひとつしか無い場合だけは空のボックスを出さずに、全幅で表示するようにすることができます。

```html:HTML
	<section class="blog-content">  
	  <article>Hi, I'm an article</article>
	  <article>Hi, I'm an article</article>
	  <article>Hi, I'm an article</article>
	</section>
```

```css:CSS
	article {  
	  background: #FAFAFA;
	  border: 1px solid #999;
	  float: left;
	  line-height: 100px;
	  margin-right: 10px;
	  width: 100px;
	}

	article:only-of-type {  
	  width: 100%;
	  margin-right: 0;
	}
```

![05.png](https://qiita-image-store.s3.amazonaws.com/0/26088/faecfbed-94b9-174b-f913-94ad79c00a99.png)

普段はこう見えますが、articleがひとつしか存在しない場合は以下のようになります。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/26088/1f2d08b7-d077-fac5-2ff2-350caa9b6f8b.png)

## :checked

Checked疑似クラス ( Checked Selector ) は、いうまでもなく、チェックボックスがチェックされたときにアクティブになります。
これは上に出てきた一部のセレクタと組み合わせると非常に便利で、さらに[チェックボックスのハック](https://css-tricks.com/the-checkbox-hack/)にも使用できます。

```css:CSS
	input[type=checkbox]:checked {  
	  box-shadow: 0 0 3px green;
	}
```

## :not()

このスーパー便利なセレクタ、否定擬似クラス( Negation Selector )は特定の要素を指定して除外させます。
not以下にスタイルを適用したくないセレクタを追加することもできます。
以下は、段落内のリンクの色を全て赤色にします。
ただし最初の`p`段落だけはその対象外とします。

```css:CSS
	p:not(:first-child) a {  
	  color: red;
	}
```

![07.png](https://qiita-image-store.s3.amazonaws.com/0/26088/eb012df4-e873-236f-6c22-1ab0a1845931.png)

## :before/:after

最後は疑似要素 ( Pseudo-element ) です。
これらのセレクタは、CSSを通して実際に新しい要素を生成します。
要素にアイコンや画像などを追加するようなことにしばしば使用されています。
疑似要素はとても強力ですが、使い方はとても簡単です。
たとえば、`p`の最初に`★`を、最後に`☺`を追加したい場合、以下のようにするだけです。

```css:CSS
	p:before {  
	  content: '★';
	}

	p:after {  
	  content: '☺';
	}
```

![08.png](https://qiita-image-store.s3.amazonaws.com/0/26088/b4d37246-6b5d-58ec-b07e-c5c4225abc42.png)

## Russell Taylor

[Russell Taylor](http://cssmenumaker.com/blog/author/russell/)はコンピュータエンジニアにしてインターネット中毒者です。
10年以上ウェブデザイン/開発業界で働いていて、リモートワークをエンジョイしているよ。

# まとめ

専門サイトだから何かすごいのが出てくるかと思って訳してみたが、本当に基本的なものしか書いてなかった。
あと:target疑似クラスのところは壊れてたので中身を全部書き換えた。

今後は しぶりんセレクタ という呼び名を積極的に普及させていきたい所存。