CSS セレクター
すべてのCSSセレクターのクイックリファレンス
Basic Selectors
| Selector | Description | Example |
|---|---|---|
*
|
Universal selector — matches every element | * { box-sizing: border-box; } |
div
|
Type selector — matches all elements of a given tag name | p { color: #333; } |
.class
|
Class selector — matches elements with this class attribute | .btn { padding: 8px 16px; } |
#id
|
ID selector — matches the element with this unique id | #header { height: 60px; } |
.class1.class2
|
Multiple classes — matches elements having both classes | .btn.btn-primary { background: blue; } |
div, p, span
|
Selector list (group) — matches any element in the list | h1, h2, h3 { font-family: sans-serif; } |
div.class
|
Type + class — matches div elements with this class | a.active { font-weight: bold; } |
div#id
|
Type + ID — matches div element with this specific ID | section#main { max-width: 1200px; } |
:root
|
Matches the root element (html in HTML documents) | :root { --primary: #007bff; } |
html
|
Matches the top-level html element | html { font-size: 16px; } |
Combinators
| Selector | Description | Example |
|---|---|---|
A B
|
Descendant combinator — B anywhere inside A | nav a { color: white; } |
A > B
|
Child combinator — B that is a direct child of A | ul > li { list-style: disc; } |
A + B
|
Adjacent sibling combinator — B immediately after A | h1 + p { margin-top: 0; } |
A ~ B
|
General sibling combinator — all B siblings after A | h2 ~ p { color: #666; } |
A || B
|
Column combinator — B within a table column A (CSS Grid Level 1) | col.selected || td { background: yellow; } |
Pseudo-classes
| Selector | Description | Example |
|---|---|---|
:hover
|
Matches when the user hovers the mouse over the element | a:hover { text-decoration: underline; } |
:focus
|
Matches when the element is focused (keyboard/click) | input:focus { outline: 2px solid blue; } |
:focus-visible
|
Matches focus only when it should be visually indicated | button:focus-visible { outline: 3px solid orange; } |
:active
|
Matches when the element is being activated (clicked) | button:active { transform: scale(0.98); } |
:visited
|
Matches anchor links that have been visited | a:visited { color: purple; } |
:link
|
Matches unvisited anchor links | a:link { color: blue; } |
:checked
|
Matches checked checkboxes, radio buttons, or options | input:checked + label { font-weight: bold; } |
:disabled
|
Matches form elements that are disabled | input:disabled { opacity: 0.5; } |
:enabled
|
Matches form elements that are enabled | input:enabled { border-color: #ccc; } |
:required
|
Matches form elements with the required attribute | input:required { border-left: 3px solid red; } |
:optional
|
Matches form elements without the required attribute | input:optional { border-color: #eee; } |
:valid
|
Matches form elements whose value is valid | input:valid { border-color: green; } |
:invalid
|
Matches form elements whose value is invalid | input:invalid { border-color: red; } |
:placeholder-shown
|
Matches an input element displaying placeholder text | input:placeholder-shown { font-style: italic; } |
:first-child
|
Matches an element that is the first child of its parent | li:first-child { border-top: none; } |
:last-child
|
Matches an element that is the last child of its parent | li:last-child { margin-bottom: 0; } |
:nth-child(n)
|
Matches elements based on their position among siblings | tr:nth-child(even) { background: #f5f5f5; } |
:nth-last-child(n)
|
Matches elements counting from the last sibling | li:nth-last-child(2) { color: red; } |
:first-of-type
|
Matches the first sibling of its type | p:first-of-type { font-size: 1.2em; } |
:last-of-type
|
Matches the last sibling of its type | p:last-of-type { margin-bottom: 0; } |
:nth-of-type(n)
|
Matches siblings of its type at position n | p:nth-of-type(odd) { background: #fafafa; } |
:only-child
|
Matches an element that is the only child of its parent | li:only-child { list-style: none; } |
:only-of-type
|
Matches an element that is the only sibling of its type | img:only-of-type { display: block; margin: auto; } |
:empty
|
Matches elements that have no children or text | div:empty { display: none; } |
:not(selector)
|
Negation pseudo-class — matches elements that do not match | input:not([type=submit]) { border: 1px solid #ccc; } |
:is(selector-list)
|
Matches any element in the selector list (forgiving) | :is(h1, h2, h3) { line-height: 1.2; } |
:where(selector-list)
|
Like :is() but with zero specificity | :where(header, footer) a { color: inherit; } |
:has(selector)
|
Matches parent if it contains the given selector | div:has(img) { padding: 0; } |
:target
|
Matches the element whose id matches the URL fragment | :target { background: yellow; } |
:lang(code)
|
Matches elements with a specific language attribute | :lang(fr) { font-style: italic; } |
Pseudo-elements
| Selector | Description | Example |
|---|---|---|
::before
|
Inserts content before the element's actual content | .quote::before { content: '\201C'; } |
::after
|
Inserts content after the element's actual content | .required::after { content: ' *'; color: red; } |
::first-line
|
Matches the first line of a block-level element | p::first-line { font-weight: bold; } |
::first-letter
|
Matches the first letter of a block-level element | p::first-letter { font-size: 2em; float: left; } |
::selection
|
Matches the portion of text selected by the user | ::selection { background: #005fcc; color: white; } |
::placeholder
|
Matches the placeholder text of form inputs | input::placeholder { color: #aaa; font-style: italic; } |
::marker
|
Matches the marker box of a list item (bullet/number) | li::marker { color: red; font-size: 1.2em; } |
::backdrop
|
Matches the backdrop behind dialog or fullscreen elements | dialog::backdrop { background: rgba(0,0,0,0.5); } |
::file-selector-button
|
Matches the button of a file input element | input[type=file]::file-selector-button { padding: 4px 8px; } |
Attribute Selectors
| Selector | Description | Example |
|---|---|---|
[attr]
|
Matches elements with the attribute present (any value) | [disabled] { opacity: 0.5; } |
[attr=value]
|
Matches elements where attr equals value exactly | [type=submit] { background: blue; } |
[attr~=value]
|
Matches elements where attr contains value as a whole word in a space-separated list | [class~=btn] { cursor: pointer; } |
[attr|=value]
|
Matches elements where attr equals value or starts with value- (for language codes) | [lang|=en] { font-family: Georgia; } |
[attr^=value]
|
Matches elements where attr starts with value | a[href^=https] { color: green; } |
[attr$=value]
|
Matches elements where attr ends with value | a[href$=.pdf]::after { content: ' (PDF)'; } |
[attr*=value]
|
Matches elements where attr contains value as a substring | a[href*=example] { color: orange; } |
[attr=value i]
|
Case-insensitive attribute value matching | [type=TEXT i] { border: 1px solid #ccc; } |
[attr=value s]
|
Case-sensitive attribute value matching (explicit) | [data-theme=Dark s] { background: #000; } |
よくある質問
CSS詳細度は、複数のルールが同じ要素を対象にしているときにどのスタイルルールが優先されるかを決定します。4つの部分(インライン、ID、クラス/属性/疑似クラス、要素/疑似要素)の値として計算されます。インラインスタイルは(1,0,0,0)、IDセレクター(#id)は(0,1,0,0)、クラスセレクター・属性セレクター・疑似クラスはそれぞれ(0,0,1,0)、要素セレクターと疑似要素は(0,0,0,1)を得ます。最も高い詳細度を持つセレクターが勝ちます。詳細度が同じ場合は、スタイルシートの後に書かれたルールが適用されます。!important宣言はすべての詳細度ルールを上書きします。
1つのコロン(:)は疑似クラスを表し、状態や位置に基づいて要素を選択します。例えば :hover、:focus、:nth-child()、:not() などです。2つのコロン(::)は疑似要素を表し、要素の特定の部分を選択してスタイルを適用します。例えば ::before、::after、::first-line、::placeholder などです。2つのコロンの構文はCSS3で疑似要素と疑似クラスを区別するために導入されました。後方互換性のため、ほとんどのブラウザは :before や :after のような古い疑似要素に対して1つのコロンも引き続き受け入れます。
:nth-child(n)は要素の種類に関わらず、親のn番目の子である要素を選択します。つまり p:nth-child(2) は親の2番目の子である場合のみ
を選択します。:nth-of-type(n)は同じ要素タイプのn番目の兄弟を選択します。つまり p:nth-of-type(2) は他の要素タイプの中での位置に関わらず、兄弟の中の2番目の
を選択します。実際には、コンテナ内に異なる要素タイプが混在している場合、:nth-of-type() の方が通常より予測しやすいです。
属性セレクターはHTML属性の有無や値に基づいて要素を選択します。[attr]はその属性を持つ要素を選択します。[attr="値"]は属性が値に完全一致する要素を選択します。[attr^="値"]は属性が値で始まる場合に一致します。[attr$="値"]は値で終わる場合に一致します。[attr*="値"]は属性にどこかで値が含まれる場合に一致します。[attr~="値"]は属性がスペース区切りのリストで値を含む場合に一致します。例えば a[href^="https"] は"https"で始まるすべてのリンクを対象にします。
はい。セレクターはいくつかの方法で組み合わせられます。グルーピング(A, B)は同じスタイルを複数のセレクターに適用します。チェーン(A.B や A:hover)はすべての条件を同時に満たす要素を対象にします。例えば div.active はクラス"active"を持つ
に一致します。結合子は関係を定義します:スペース(A B)は子孫、>(A > B)は直接の子、+(A + B)は隣接する兄弟、~(A ~ B)はすべての後続の兄弟を対象にします。これらの技法を組み合わせると、追加のクラスやIDなしで非常に具体的なルールを書けます。