【CSS】きみは "擬似クラス" 何個言えるかな？？

## はじめに
あなたは **"擬似クラス"** 何個言えますか？

擬似クラスには、`:hover` や `:active`、`:focus`といったよく使うものから、
`:is()`や`:where()`、`:has()`といったこれからサポートされていくものまで
たくさん種類があるのは、ご存知ではないでしょうか？

でも、**"擬似クラス"** 何個言えますか？と聞かれると数個くらいしか思い出せないと言う方は多いのではないでしょうか？

もしかしたら、15個以上言えたら、CSS玄人と言えるかも知れません。

この記事では、たくさん種類があるのは知っているけど、詳しくはわからない **"擬似クラス"** が、
何種類あるか、どんな擬似クラスがあるかをまとめました。

知らなかった **"擬似クラス"** の数を数えながら、読んでいただけると嬉しいです。



## 擬似クラス
### 擬似クラスとは？
擬似クラスとは、セレクタのあとにつけることで、
指定した要素の状態に応じて、指定した要素のスタイルを変化させることができるものです。

また、`:first-of-type`ようにHTMLの要素に関するものだけではなく、
`:visited`・`:hover`のような外的な要因(閲覧履歴・カーソル)との関係でも
スタイルを変化させることができます。


### 擬似要素との違い
よく技術ブログ等でも、擬似クラスと擬似要素をごちゃごちゃに書いているのを目にするので、
擬似クラスと擬似要素の違いにも触れておきます。

:::note
**擬似クラス**と**擬似要素**の違いは、
**擬似クラス**が、指定した要素の**状態**に応じて変化させるのに対し、
**擬似要素**は、指定した要素の**一部分**を変化させるかです。
:::

例えば、有名な擬似要素 `::before` では、指定した要素の前(before)を変化させます。
また、`::first-line`では、指定した要素の１行目を変化させます。



## 擬似クラス 一覧
では早速、**"擬似クラス"** をまとめていきます。
*※ 主要ブラウザーでまだ対応されていないものは、:tools: ← このアイコンをつけておきます。*


:sound: ~~ 🎶 ~~ 🎶 ~~

キミはもう、たっぷり "擬似クラス" 覚えた？
 "擬似クラス" 全部覚えたキミも、
まだまだのキミも、
「"擬似クラス" 何個言えるかな？」に挑戦だ！

:sound: ~~ 🎶 ~~ 🎶 ~~
 
🎶 ラ・ラ・ラ 言えるかな？ 🎶
🎶 キ・ミ・は 言えるかな？ 🎶
🎶 "擬似クラス"のなまえ！ 🎶

:sound: ~~ 🎶 ~~ 🎶 ~~


### 組み合わせ擬似クラス
#### 1. `:is()`
`:is()` は、`()`の中に含まれているセレクタと一致する要素のスタイルを変化させます。
`:where( )`との違いは、`:is( )`の詳細度にカウントされますが、`:where( )`の詳細度が0であることです。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/3c0bef1d-e23e-f9e0-0b63-5cb9faec78b5.png)

#### 2. `:not()`
`:not()`は、`()`の中に含まれるセレクタと一致しない要素のスタイルを変化させます。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9d04b4e6-a0d0-4846-66dc-8250ddf001c2.png)

#### 3. `:where()`
`:where()` は、`()`の中に含まれているセレクタと一致する要素のスタイルを変化させます。
`:is( )`との違いは、`:is( )`の詳細度にカウントされますが、`:where( )`の詳細度が0であることです。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/ea0f4eaf-e9eb-b3a2-9adf-6226836e91b7.png)

#### 4. `:has()` :tools:
`:has()` は、 `()`の中に含まれているセレクタが子要素に含まれている要素のスタイルを変化させます。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/a644726b-520f-0e54-6957-f14d59600de0.png)

### 言語擬似クラス
#### 5. `:dir()` :tools:
`:dir()`は、`()`で指定した書字方向に応じて、要素のスタイルを変化させます。
`ltr`で左から右へのテキスト→、 `rtl`で右から左へのテキスト←を指定します。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/f3de586a-a46d-b9d8-7586-7f3985c52423.png)

#### 6. `:lang()`
`:lang()`は、`()`で指定した言語設定に応じて要素のスタイルを変化させます。
`ja`で日本語、`en`で英語、`fr`でフランス語など。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/aabc0122-ec7e-59e5-7def-b30cc160abb9.png)


### 場所擬似クラス
#### 7. `:any-link`
`:any-link`は、`href`属性を持つ、`<a>`・`<area>`要素のスタイルを変化させます。
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/098b5379-98cd-9c4e-5042-27b50ebe0e06.png)

#### 8. `:link`
`:link`は、まだ訪問していない`href`属性を持つ、`<a>`・`<area>`要素のスタイルを変化させます。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/f2d34bd5-d3b2-719b-aa91-4887f2bdd511.png)

#### 9. `:visited`
`:visited`は、訪問したことがある`href`属性を持つ、`<a>`・`<area>`要素のスタイルを変化させます。
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5383e40c-912b-2ffe-3498-d3ab6a50c609.png)

#### 10. `:local-link` :tools:
`:local-link`は、ページ内のリンクの`href`属性を持つ、`<a>`・`<area>`要素のスタイルを変化させます。
![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c7dff94f-bbe9-e053-3bfd-fc804f85cc60.png)

#### 11. `:target`
`:target`は、ページ内リンクの対象である要素のスタイルを変化させます。
![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/908f78db-9123-a094-5bf0-5d983d1a7047.png)

#### 12. `:target-within`
`:target-within`は、ページ内リンクの対象である子要素を持つ要素のスタイルを変化させます。
![image12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/0123f9b6-86b8-eaf9-3e20-f1d7d736ec38.png)

#### 13. `:scope` 
`:scope`は、scope属性を持つ要素のスタイルを変化させます。
![image13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c1295366-2fe5-0d49-ab34-b6f2963e2510.png)


### ユーザーアクション擬似クラス
#### 14. `:hover`
`:hover`は、マウスポインターが触れた要素のスタイルを変化させます。
![image14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/670e8513-1139-3da6-a5e7-230da62eacae.png)

#### 15. `:active`
`:active`は、クリックなどでアクティブになった要素のスタイルを変化させます。
![image15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/193059ea-b262-c79b-1af8-1cdc75c11efd.png)

#### 16. `:focus`
`:focus`は、フォーカスが当たっている要素のスタイルを変化させます。
![image16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/031405de-07e5-04d7-0547-efd88da5c85b.png)

#### 17. `:focus-visible`
`:focus-visible`は、tabフォーカスされている要素のスタイルを変化させます。
![image17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/6fe6021e-370a-4d8c-11a8-c903955c7ebd.png)

#### 18. `:focus-within`
`:focus-within`は、フォーカスされている子要素に持つ要素のスタイルを変化させます。
![image18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/7a90bc45-74e4-41c8-f7c6-2cdf37108970.png)


### 時間擬似クラス
#### 19. `:current` :tools:
`:current`は、字幕のようなタイムラインに沿って、現在表示されている要素のスタイルを変化させます。
![image19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/864b30b9-696a-424d-dff1-0539a86386a3.png)

#### 20. `:post` :tools:
`:post`は、`:current`の前に発生する要素のスタイルを変化させます。
![image20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/734b2765-19b8-00d2-5b09-2051478435df.png)

#### 21. `:future` :tools:
`:future`は、`:current`のあとに発生する要素のスタイルを変化させます。
![image21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/e1adcde1-eb92-45b2-716e-a3da01bc42b9.png)

### リソース擬似クラス
#### 22. `:playing` :tools:
`:playing`は、再生可能なメディア要素が再生中の時にスタイルを変化させます。
![image22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/4bb7b9db-6465-7db5-bf65-2e4d44cc1266.png)

#### 23. `:paused` :tools:
`:paused`は、再生可能なメディア要素が一時停止中の時にスタイルを変化させます。
![image23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/dfecf4d0-f588-5871-7821-6f1c76ba79c6.png)

### 入力擬似クラス
#### 24. `:autofill`
`:autofill`は、ブラウザーによって自動補完された入力要素のスタイルを変化させます。
![image24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/32f784ff-e539-32e2-f514-28c51bb770cb.png)

#### 25. `:enabled`
`:enabled`は、有効な入力要素のスタイルを変化させます。
![image25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/c990ea86-31f0-be06-bd2a-e1ab41060e8d.png)

#### 26. `:disabled`
`:disabled`は、無効な入力要素のスタイルを変化させます。
![image26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/94839c06-2b5e-269c-56d6-f8d234d8aaae.png)

#### 27. `:read-only`
`:read-only`は、ユーザーが変更することができない入力要素のスタイルを変化させます。
![image27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/98b5ba98-c932-5078-a8d5-2fc7effb3c83.png)

#### 28. `:read-write`
`:read-write`は、ユーザーが変更することができる入力要素のスタイルを変化させます。
![image28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/10468a76-5e4a-9fc7-d847-8c405295d2e5.png)

#### 29. `:placeholder-shown`
`:placeholder-shown`は、プレイスホルダーが有効な要素のスタイルを変化させます。
![image29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/25c6b795-92ee-f165-7d81-e254934b2b49.png)

#### 30. `:default`
`:default`は、ラジオボタン・チェックボックス・セレクトで、デフォルトになっている入力要素のスタイルを変化させます。
![image30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/a724f219-a422-60f5-77f9-f1398e4126e7.png)

#### 31. `:checked`
`:checked`は、ラジオボタン・チェックボックス・セレクトで、ON状態になっている入力要素のスタイルを変化させます。
![image31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/2a4f32d8-9fc8-ce71-9299-d60641890f3e.png)

#### 32. `:indeterminate`
`:indeterminate`は、ラジオボタン・チェックボックス・セレクトで、中間の状態になっている入力要素のスタイルを変化させます。
![image32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/ad40217f-e5c2-da77-70a2-1a817d39de84.png)

#### 33. `:blank` :tools:
`:blank` は、必須・任意関係なく、何も入力されていない入力要素のスタイルを変化させます。
![image33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/e2f63f96-a294-7627-bc6f-c0026652f246.png)

#### 34. `:valid`
`:valid`は、入力形式が正しく有効な入力要素のスタイルを変化させます。
![image34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/315e59c9-42f1-9ba2-1c79-bfbe67416de2.png)

#### 35. `:invalid`
`:invalid`は、入力形式が正しなく無効な入力要素のスタイルを変化させます。
![image35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/65e7c617-79d2-c4b3-f1f9-b77d791cc2b8.png)

#### 36. `:in-range`
`:in-range`は、入力された値が範囲内にあり、範囲制限のある入力要素のスタイルを変化させます。
![image36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/0f61a3ee-560c-face-ea49-a9a752a12e1c.png)

#### 37. `:out-of-range`
`:out-range`は、入力された値が範囲外にあり、範囲制限のある入力要素のスタイルを変化させます。
![image37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/134dc9e2-37bd-14eb-47b4-241628180a62.png)

#### 38. `:required`
`:required`は、必須要素である入力要素のスタイルを変化させます。
![image38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/48e354d7-13f1-2521-a425-55c6ce693c43.png)

#### 39. `:optional`
`:optional`は、任意要素である入力要素のスタイルを変化させます。
![image39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/2b86348c-ba70-43ac-45fd-1850f597ce61.png)

#### 40. `:user-invalid` :tools:
`:user-invalid`は、ユーザーの操作の後に有効と判断されなかった入力要素のスタイルを変化させます。
![image40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/6fc1ec07-416a-15df-87e2-317a932e4a7c.png)



### 表示状態擬似クラス
#### 41. `:modal`
`:modal`は、モーダル ダイアログの要素のスタイルを変化させます。
![image41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/417d76b8-4ac1-2f5f-bc92-641ad135247f.png)

#### 42. `:fullscreen` :tools:
`:fullscreen`は、フルスクリーンモードになっている要素のスタイルを変化させます。
![image42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/f4dc20b0-b02d-1e1f-e6d5-d08d677c8da2.png)

#### 43. `:picture-in-picture` :tools:
`:picture-in-picture`は、メディア属性がピクチャ・イン・ピクチャモードになっている要素のスタイルを変化させます。![image43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/26409a3b-8f95-aa2d-0a42-9bd2f134fd34.png)


### ツリー構造擬似クラス
#### 44. `:root`
`:root`は、DOMツリーのルート要素のスタイルを変化させます。
![image44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/8f9926ee-47d5-23cf-2143-0bba2bff6982.png)

#### 45. `:empty`
`:empty`は、子を持たない要素のスタイルを変化させます。
![image45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/467ee36c-6987-4ecb-4531-7cd33368f0e9.png)

#### 46. `:nth-child`
`:nth-child`は、 兄弟要素の中で前から数えた特定の位置にある要素のスタイルを変化させます。
![image46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/442b59f0-5ffe-51d2-b95b-b1cb92115704.png)

#### 47. `:nth-last-child`
`:nth-last-child`は、 兄弟要素の中で後ろから数えた特定の位置にある要素のスタイルを変化させます。
![image47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/676140ed-266f-d3ff-9864-2a4767e9e4c4.png)

#### 48. `:first-child`
`:first-child`は、 兄弟要素の中で1番最初の要素のスタイルを変化させます。
![image48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b3ce2927-1798-c45d-060c-fcce565cfb19.png)

#### 49. `:last-child`
`:last-child`は、 兄弟要素の中で1番最後の要素のスタイルを変化させます。
![image49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/3acc23a6-4722-b4e8-3053-8c599896e6a6.png)

#### 50. `:only-child`
`:only-child`は、 兄弟要素がいない要素のスタイルを変化させます。
![image50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5c013db9-7703-adfd-eea0-872c70a3803d.png)

#### 51. `:nth-of-type`
`:nth-of-type`は、タグ名を指定して、兄弟要素の中で前から数えた特定の要素のスタイルを変化させます。
![image51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/17c03afb-6893-ef91-5f35-c2a12bf481b7.png)

#### 52. `:nth-last-of-type`
`:nth-last-of-type`は、タグ名を指定して、兄弟要素の中で後ろから数えた特定の要素のスタイルを変化させます。
![image52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/e397f6df-1a71-dac4-6a67-96d3822e2cd7.png)

#### 53. `:first-of-type`
`:first-of-type`は、タグ名を指定して、兄弟要素の中で1番最初の特定の要素のスタイルを変化させます。
![image53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b1e83b79-d6d7-7758-3fe5-872dd5db5fd8.png)

#### 54. `:last-of-type`
`:last-of-type`は、タグ名を指定して、兄弟要素の中で1番最後の特定の要素のスタイルを変化させます。
![image54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/1ae069df-7c70-0d66-b034-c5128c41944d.png)

#### 55. `:only-of-type`
`:only-of-type`は、タグ名を指定して兄弟要素がいない特定の要素のスタイルを変化させます。
![image55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/604b783e-03cc-b455-5dbf-8805bf8f37e0.png)


## まとめ

:sound: ~~ 🎶 ~~ 🎶 ~~
 
🎶 ラ・ラ・ラ 言えたかな？ 🎶
🎶 キ・ミ・は 言えたかな？ 🎶
🎶 "擬似クラス"のなまえ！ 🎶

:sound: ~~ 🎶 ~~ 🎶 ~~

知らなかった "擬似クラス" の数は、何個でしたでしょうか？
もしよかったら、知ってた・知らなかった "擬似クラス" の数コメントで教えてください。
数はちょっと.. という方は、CSS玄人であることをおしえてください。笑


---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaに記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510