CSSセレクタ早見表と個別の解説
CSSで使えるセレクタの一覧表です。本項目で使用しているE
という言葉は参照される要素(Element)を表します。F
はそれに付随する要素です。foo
やvar
は名称や値を示す変数となります。各セレクタの具体的な書き方は、それぞれの解説およびサンプルコードを参照してください。
要素指定セレクタ
結合子・コンビネーター
構文 | 名称 | 説明 |
---|---|---|
E, F | セレクタ・リスト | E 要素とF 要素を選択 |
E F | 子孫結合子 | E 要素の子孫であるF 要素を選択 |
E > F | 子結合子 | E 要素の子であるF 要素を選択 |
E + F | 次接兄弟結合子 | E 要素の直後にある同一階層のF 要素を選択 |
E ~ F | 後続兄弟結合子 | E 要素の後に配置された同一階層のF 要素を選択 |
F || E | カラム結合子 | F 列に所属するE 要素を選択 |
名前指定セレクタ
属性セレクタ
構文 | 名称 | 説明 |
---|---|---|
E[foo] | 属性セレクタ | foo 属性が指定されたE 要素を選択 |
E[foo="var"] | 属性セレクタ | foo 属性の値がvar と完全に一致するE 要素を選択 |
E[foo="var" i] | 属性セレクタ | foo 属性のvar 値を大文字、小文字を区別せずに選択 |
E[foo="var" s] | 属性セレクタ | foo 属性のvar 値を大文字、小文字を区別して選択 |
E[foo~="var"] | 属性セレクタ | foo 属性に複数の空白区切りの値がある場合にvar を持つE 要素を選択 |
E[foo^="var"] | 属性セレクタ | foo 属性の値が前方一致のvar である場合にE 要素を選択 |
E[foo$="var"] | 属性セレクタ | 属性の値が後方一致のvar である場合にE 要素を選択 |
E[foo*="var"] | 属性セレクタ | foo 属性の値が部分一致でvar を含む場合のE 要素を選択 |
E[foo|="var"] | 属性セレクタ | foo 属性がハイフン区切りの値である場合に前方一致のvar を持つE 要素を選択 |
擬似クラス・条件判定
構文 | 名称 | 説明 |
---|---|---|
E:not(F) | :not擬似クラス | 条件F を含まないE 要素を選択 |
E:is(F) | :is擬似クラス | 条件F に当てはまるE 要素を選択 |
E:where(F) | :where擬似クラス | 条件F に当てはまるE 要素を選択 |
E:has(F) | :has擬似クラス | 条件F を持つE 要素を選択 |
擬似クラス・位置関係
構文 | 名称 | 説明 |
---|---|---|
:root | :root擬似クラス | ドキュメントのルートにあたる要素を選択 |
E:empty | :empty擬似クラス | E 要素の内容が空の場合に選択 |
E:nth-child(n) | :nth-child擬似クラス | 共通の親を持つ全ての要素の先頭から(n番目)のE 要素を選択 |
E:nth-last-child(n) | :nth-last-child擬似クラス | 共通の親を持つ全ての要素の最後から(n番目)のE 要素を選択 |
E:first-child | :first-child擬似クラス | 共通の親を持つ全ての要素の先頭に置かれたE 要素を選択 |
E:last-child | :last-child擬似クラス | 共通の親を持つ全ての要素の最後に置かれたE 要素を選択 |
E:only-child | :only-child擬似クラス | 親要素の中で子要素がE 要素のみの場合を選択 |
E:nth-of-type(n) | :nth-of-type擬似クラス | 兄弟関係にあたるE 要素の先頭から(n番目)のE 要素を選択 |
E:nth-last-of-type(n) | :nth-last-of-type擬似クラス | 兄弟関係にあたるE 要素の最後から(n番目)のE 要素を選択 |
E:first-of-type | :first-of-type擬似クラス | 兄弟関係にあたるE 要素の最初のE 要素のみを選択 |
E:last-of-type | :last-of-type擬似クラス | 兄弟関係にあたるE 要素の最後のE 要素のみを選択 |
E:only-of-type | :only-of-type擬似クラス | 親要素の中で唯一のE 要素を選択 |
擬似クラス・アンカー
構文 | 名称 | 説明 |
---|---|---|
E:any-link | :any-link擬似クラス | リンク指定されたE 要素を選択 |
E:link | :link擬似クラス | リンク先が未訪問であるE 要素を選択 |
E:visited | :visited擬似クラス | リンク先が訪問済みであるE 要素を選択 |
E:target | :target擬似クラス | リンク先のターゲットに指定されたE 要素を選択 |
E:scope | :scope擬似クラス | スコープのルートにあたる要素を選択 |
擬似クラス・状態参照
構文 | 名称 | 説明 |
---|---|---|
E:hover | :hover擬似クラス | ポインターが重なったE 要素を選択 |
E:active | :active擬似クラス | ユーザーの操作でアクティブになったE 要素を選択 |
E:focus | :focus擬似クラス | フォーカスされたE 要素を選択 |
E:focus-within | :focus-within擬似クラス | 自身か子孫がフォーカスされたE 要素を選択 |
E:focus-visible | :focus-visible擬似クラス | ユーザーエージェントがフォーカスすべきと判定したE 要素を選択 |
擬似クラス・入力項目
構文 | 名称 | 説明 |
---|---|---|
E:enabled | :enabled擬似クラス | 有効状態(enabled)であるE 要素を選択 |
E:disabled | :disabled擬似クラス | 無効状態(disabled)であるE 要素を選択 |
E:read-write | :read-write擬似クラス | 編集可能な状態のE 要素を選択 |
E:read-only | :read-only擬似クラス | 編集不可能な状態の読み取り専用のE 要素を選択 |
E:placeholder-shown | :placeholder-shown擬似クラス | プレースホルダーが表示されている状態のE 要素を選択 |
E:default | :default似クラス | 既定値の状態になっているE 要素を選択 |
E:checked | :checked擬似クラス | チェック状態であるE 要素を選択 |
E:indeterminate | :indeterminate擬似クラス | 不確定の状態であるE 要素を選択 |
E:valid | :valid擬似クラス | 入力内容の検証を通過したE 要素を選択 |
E:invalid | :invalid擬似クラス | 検証に失敗したE 要素を選択 |
E:in-range | :in-range擬似クラス | 制限範囲に収まる値を持つE 要素を選択 |
E:out-of-range | :out-of-range擬似クラス | 制限範囲に収まらない値を持つE 要素を選択 |
E:required | :required擬似クラス | required 属性を付与されているE 要素を選択 |
E:optional | :optional擬似クラス | required 属性を付与されていないE 要素を選択 |
E:user-valid | :user-valid擬似クラス | 制約検証で有効と判断できたE 要素を選択 |
E:user-invalid | :user-invalid擬似クラス | 制約検証で有効と判断できなかったE 要素を選択 |
擬似クラス・書字言語
擬似要素
構文 | 名称 | 説明 |
---|---|---|
::backdrop | ::backdrop擬似要素 | 全画面モードや最上位のレイヤーに配置された要素の直下に投影される要素 |
::before | ::before擬似要素 | 要素の開始直後に装飾的な内容を追加 |
::after | ::after擬似要素 | 要素の終了直前に装飾的な内容を追加 |
::first-letter | ::first-letter擬似要素 | 要素に含まれる最初の一文字を表す |
::first-line | ::first-line擬似要素 | 要素に含まれる最初の一行を表す |
::marker | ::marker擬似要素 | リスト項目のマーカーを表す |
::placeholder | ::placeholder擬似要素 | 入力項目のプレースホルダーを表す |
::selection | ::selection擬似要素 | ユーザーが選択した範囲の文字を表す |
ユニバーサルセレクタ(Universal selector)
- 構文
- *
- 説明
- 全ての要素を選択
- レベル
- 2
ユニバーサルセレクタ(Universal selector)は、記号のアスタリスク(*
)で表し、文書に含まれる全ての要素を選択します。日本語では「全称セレクタ」とも呼ばれます。一般的には、CSSファイルの最上部付近に置いて、サイト全体に共通するスタイルの指定を行います。
/* 全ての要素と擬似要素に一致 */
*, ::before, ::after {
box-sizing: border-box;
min-inline-size: 0;
padding-block: 0;
padding-inline: 0;
margin-block: 0;
margin-inline: 0;
border-style: solid;
border-width: 0;
}
/* 特定の条件下の子要素に一致 */
.container :where(.entry > *+*) {
margin-block-start: 1rem;
}
タイプセレクタ(Type selector)
- 構文
- E(elementname)
- 説明
E
という名称の要素を選択- レベル
- 1
タイプセレクタ(Type selector)は、任意の要素の名前で表します。一致した要素は、内容や属性に限らず全てが選択されます。一般的には、サイト全体の基本的なスタイルを定義する場合に使用します。また、親子関係を利用して対象を絞り込む場合などに用います。
<div class="sample-block">
<h1>見出しテキスト</h1>
<p>段落の内容</p>
</div>
/* 見出し要素に一致 */
h1 {
color: blue;
}
/* 段落要素に一致 */
p {
margin-block: 1em 0;
}
/* 特定のclassに属する見出し要素に一致 */
.sample-block h1 {
font-size: 1.5rem;
}
セレクタ・リスト(Selector list)
- 構文
- E, F
- 説明
E
要素とF
要素を選択- レベル
- -
セレクタ・リスト(Selector list)は、複数のセレクタをカンマ(,
)区切りで表し、一致した要素に共通のスタイルを適用します。この記法は要素名に限らず、あらゆるセレクタをリスト化できます。
セレクタの末尾に記載するカンマの後ろは改行しても構いませんが、他のセレクタを続けて配置することが求められます。最後のセレクタの後ろにカンマが残っているとスタイルが適用されないので、消し忘れに注意しましょう。
<div class="sample-block">
<h1>見出しテキスト</h1>
<h2>小見出しのテキスト</h2>
<p>段落のテキスト</p>
</div>
/* 複数の要素に同じスタイルを指定する場合 */
h1 { font-family: sans-serif;}
h2 { font-family: sans-serif;}
p { font-family: sans-serif;}
/* セレクタ・リストで一括指定が可能 */
h1, h2, p {
font-family: sans-serif;
}
/* 擬似要素に共通のスタイルを指定 */
.archive::before,
.archive::after {
max-width: 300px;
}
子孫結合子(Descendant combinator)
- 構文
- E F
- 説明
E
要素の子孫であるF
要素を選択- レベル
- 1
子孫結合子(Descendant combinator)は、親要素となるセレクタの後に続くホワイトスペース(
)で表します。最初に示したセレクタがノードの起点となり、そこに含まれる子孫を特定するセレクタを続けて書きます。親要素から子要素を飛び越えて孫要素を選択することも可能で、さらにホワイトスペースで区切ったセレクタを複数組み合わせることで、条件を絞り込んでいくこともできます。
例えば、要素名とクラス名を連結させてdiv.item
と記載した場合は、item
というクラス名を持つdiv
要素という意味のセレクタになりますが、これらをホワイトスペースで区切ってdiv .item
と記載すると、div
要素を親に持つitem
クラスのセレクタという意味になります。
<nav class="side-menu">
<ul class="contents">
<li><a href="/">Item</a></li>
<li><a href="/">Item</a></li>
<li><a href="/">Item</a></li>
</ul>
</nav>
/* nav要素に含まれるul要素に一致 */
nav ul {
padding: 0;
}
/* クラスの子要素に配置されたli要素を全て選択 */
.side-menu li {
border-inline-start: 3px solid #0099ff;
}
/* 子孫結合子の組み合わせで条件を絞り込む */
.contents li > a {
display: block;
}
子結合子(Child combinator)
- 構文
- E > F
- 説明
E
要素の子であるF
要素を選択- レベル
- 2
子結合子(Child combinator)は、親要素となるセレクタの後に続く不等号(>
)で表します。最初に示したセレクタがノードの起点となり、そこに含まれる直接の子要素を特定するセレクタを続けて書きます。親要素から子要素を飛び越えて孫要素を選択することはできません。特定の階層に属する要素だけにスタイルを適用したい場合に有効です。
<nav class="side-menu">
<ul class="contents">
<li><a href="/">Item</a></li>
<li><a href="/">Item</a></li>
<li><a href="/">Item</a></li>
</ul>
</nav>
/* nav要素の直接子要素であるul要素に一致 */
nav > ul {
padding: 0;
}
/* 子結合子を連結して条件を絞り込む */
.contents > li > a {
display: block;
}
/* 条件に一致していないため選択されない */
.side-menu > li {
border-inline-start: 3px solid #0099ff;
}
次接兄弟結合子(Next sibling combinator)
- 構文
- E + F
- 説明
E
要素の直後にある同一階層のF
要素を選択- レベル
- 2
次接兄弟結合子(Next sibling combinator)は、二つのセレクタを区切る加算記号(+
)で表します。両者は共通の親を持ち、同じ階層に属する隣接した要素であることが求められます。最初に示すセレクタは二番目のセレクタよりもソースコードの前に配置されたものであり、二番目のセレクタは最初のセレクタに一致した要素よりも後に配置され、かつ最初の要素である必要があります。
<article class="post-content">
<h1 class="post-title">投稿記事のタイトル</h1>
<p>記事の内容を表すテキスト。</p>
<p>記事の内容を表すテキスト。</p>
<section class="pr">
<a href="pr">[PR]おすすめの記事</a>
</section>
<p>記事の内容を表すテキスト。</p>
<p>記事の内容を表すテキスト。</p>
</nav>
/* 見出し要素に続く最初の段落に一致 */
h1 + p {
margin-block-start: 2rem;
}
/* classセレクタに一致する要素に続く段落 */
.pr + p {
border-block-start: 1px dotted #ccc;
}
/* 条件に一致した親要素に含まれる全ての隣接要素 */
.post-content :where(*+*) {
margin-block-start: 1rem;
}
/* 後続する要素が隣接していないため無効 */
.post-title + .pr {
display: none;
}
後続兄弟結合子(Subsequent sibling combinator)
- 構文
- E ~ F
- 説明
E
要素の後に配置された同一階層のF
要素を選択- レベル
- 3
後続兄弟結合子(Subsequent sibling combinator)は、二つのセレクタを区切るチルダ(~
)で表します。両者は共通の親を持ち、同じ階層に属する要素であることが求められます。最初のセレクタは二番目のセレクタよりも前に配置された要素であり、二番目のセレクタはその後に置かれた要素である必要があります。ただし、二つの要素は必ずしも隣接しているとは限りません。
<article class="post-content">
<h1 class="post-title">投稿記事のタイトル</h1>
<p>記事の内容を表すテキスト。</p>
<p>記事の内容を表すテキスト。</p>
<section class="pr">
<a href="pr">[PR]おすすめの記事</a>
</section>
<p>記事の内容を表すテキスト。</p>
<p>記事の内容を表すテキスト。</p>
</nav>
/* 見出しの後に続く同じ階層の段落に一致 */
h1 ~ p {
margin-block-start: 1rem;
}
/* classセレクタの後に配置された別のclassセレクタに一致 */
.post-title ~ .pr {
display: block;
}
/* 最初配置された段落の後に続く段落に一致 */
.post-content :where(p~p) {
margin-block-start: 1rem;
}
/* 同じ階層に存在しないため無効 */
.post-title ~ a {
color: #ff0066;
}
カラム結合子(Column combinator)
- 構文
- F || E
- 説明
F
列に所属するE
要素を選択- レベル
- 4
カラム結合子(Column combinator)は、二つのセレクタを区切るパイプ記号(||
)で表します。両者は、列要素とその列に属するセルとの関係を表します。
<table class="table">
<col class="name">
<col span="2" class="category">
<tr>
<th scope="col">項目</td>
<th scope="col">見出し</td>
<th scope="col">見出し</td>
</tr>
<tr>
<th scope="row">項目</th>
<td>セル</td>
<td>セル</td>
</tr>
<tr>
<th scope="row">項目</th>
<td>セル</td>
<td>セル</td>
</tr>
</nav>
/* 特定の列に属するセルを選択 */
col.name || td {
white-space: nowrap;
}
col.category || td {
overflow-wrap: anywhere;
}
クラスセレクタ(Class selector)
- 構文
- .class
- 説明
class
属性の値に一致する要素を選択- レベル
- 1
クラスセレクタ(Class selector)は、要素のclass
属性に指定した値で表します。一致した要素は、たとえ別の種類の要素であっても同じスタイルが適用されます。ページの中で何度も使い回すパーツを作成したり、共通のプロパティを複数の要素に適用する際に使用します。
このセレクタはHTML要素のclass
属性に指定された値を参照します。CSSの記法では、その値の先頭にピリオド(.
)を追加します。例えば、要素名とクラス名を連結させてdiv.item
と記載した場合は、item
というクラス名を持つdiv
要素という意味のセレクタになります。これをホワイトスペースで区切ってdiv .item
と記載すると、div
要素を親に持つitem
クラスのセレクタという意味になります。
<div class="sample-block">
<h1 class="heading">見出しテキスト</h1>
<p class="inline">段落の内容</p>
</div>
/* class属性の値に一致 */
.sample-block {
padding-inline: 1rem;
}
/* 要素名とclass属性の値に一致 */
h1.heading {
border-block-end: 1px solid gray;
}
/* 子要素に配置されたclass属性の値に一致 */
div .inline {
line-height: 1.75;
}
IDセレクタ(ID selector)
- 構文
- #id
- 説明
id
属性の値に一致する要素を選択- レベル
- 1
IDセレクタ(ID selector)は、要素のid
属性に指定した値で表します。id
属性の値は、ひとつのページの中で重複してはならないというルールがあります。そのため、特別なパーツやレイアウト用のコンテナなど、個別のスタイルが必要な場合に使用します。
このセレクタはHTML要素のid
属性に指定された値を参照します。CSSの記法では、その値の先頭にシャープ(#
)を追加します。例えば、要素名とクラス名を連結させてdiv#item
と記載した場合は、item
というID名を持つdiv
要素という意味のセレクタになります。これをホワイトスペースで区切ってdiv #item
と記載すると、div
要素を親に持つitem
IDのセレクタという意味になります。
<div id="sample-block">
<h1 id="title">サイトタイトル</h1>
<h2 id="subtitle">サブタイトル</h2>
</div>
/* id属性の値に一致 */
#title {
font-family: Helvetica Neue, Arial, sans-serif;
}
/* 要素名とid属性の値に一致 */
h2#subtitle {
font-size: 0.75rem;
}
/* 特定の条件でid値を絞り込む */
.sample-block #title {
text-decoration: underline;
}
属性セレクタ(Attribute selector)
- 構文
- E[foo]
- 説明
foo
属性が指定されたE
要素を選択- レベル
- 2
属性セレクタ(Attribute selector)は、要素に与えられた属性の名前で表します。[
と]
の中に指定した内容と一致する属性が全て選択対象となります。要素単位ではなく属性単位で共通のパターンを作成したり、要素の中で特定の属性を持つものだけ絞り込む場合に使用します。
このセレクタはHTML要素に指定できる属性名の文字列を参照します。例えば、要素名と属性名を連結させてdiv[title]
と記載した場合は、title
属性を持つdiv
要素という意味のセレクタになります。これをホワイトスペースで区切ってdiv [title]
と記載すると、div
要素を親に持つ[title]
属性を与えられた要素のセレクタという意味になります。
<nav aria-label="サイトメニュー">
<ul class="list menu" data-columns="4">
<li><a href="/" title="Home">Home</a></li>
<li><a href="/blog" title="Blog">Blog</a></li>
<li><a href="/photo" title="Photo">Photo</a></li>
<li><a href="/about" title="About">About</a></li>
</ul>
</nav>
/* aria-label属性を持つnav要素に一致 */
nav[aria-label] {
padding-inline: 1rem;
}
/* nav要素の子孫に配置されたdata-columns属性に一致 */
nav [data-columns] {
display: grid;
}
/* classセレクタ等と組み合わせることも可能 */
.list[data-columns] {
gap: 0.25rem;
}
属性セレクタ:値の一致
- 構文
- E[foo="var"]
- 説明
foo
属性の値がvar
と完全に一致するE
要素を選択- レベル
- 2
属性セレクタで値を特定する形式です。[
と]
の中に選択したい要素の属性と値をそのまま書きます。ダブルクォーテーションは省略可能ですが、値の文字列は完全一致でなければなりません。属性の値によって異なるスタイルを適用したい場合に使用します。
このセレクタはHTML要素に指定された属性と値を両方参照します。そのため、どちらか一方でも異なる文字が混じっているとスタイルは適用されません。複数の値が指定されていたり、動的に値が変動するような要素にスタイルを適用したい場合は、属性名と値を結ぶイコール(=
)の前に記号を追加して正規表現のように文字を検索できる方法があるので、そちらを採用してください。
<nav aria-label="サイトメニュー">
<ul class="list menu" data-columns="4">
<li><a href="/" title="Home">Home</a></li>
<li><a href="/blog" title="Blog">Blog</a></li>
<li><a href="/photo" title="Photo">Photo</a></li>
<li><a href="/about" title="About">About</a></li>
</ul>
</nav>
/* data-columns属性の値が4のul要素に一致 */
ul[data-columns="4"] {
grid-template-columns: repeat(4, 1fr);
}
/* nav要素の子孫の中で特定の属性と値を持つ要素に一致 */
nav [title="Home"] {
background-color: #ccc;
}
/* 複数の値を持つ属性も選択可能 */
nav [class="list menu"] {
gap: 0.5rem;
}
/* 値の文字列が一致しないため選択されない */
nav [class="menu"] {
gap: 0.5rem;
}
属性セレクタ i識別子
- 構文
- E[foo="var" i]
- 説明
foo
属性のvar
値を大文字、小文字を区別せずに選択- レベル
- 4
属性セレクタの閉じ括弧(]
)の直前にi
またはI
識別子を置くと、値は大文字と小文字を区別することなく評価されます。例えば、要素のclass
属性の値が"var"
だった場合に、既定値であれば"Var"
や"VAR"
は対象から外れますが、この識別子を追加するとどちらも一致します。
<div class="sample-block">
<div class="item">item</div>
<div class="Item">Item</div>
<div class="ITEM">ITEM</div>
</div>
/* 共通のスタイル */
.sample-block {
display: grid;
}
.sample-block div {
padding: 0.5rem;
border-block-end: 1px solid gray;
}
/* i識別子を追加すると大文字・小文字を区別しない */
[class="item" i] {
color: red;
}
属性セレクタ s識別子(β)
- 構文
- E[foo="var" s]
- 説明
foo
属性のvar
値を大文字、小文字を区別して選択- レベル
- 4
属性セレクタの閉じ括弧(]
)の直前にs
またはS
識別子を置くと、値は大文字と小文字を区別して評価されます。この識別子を追加しなくとも、既定値で大文字・小文字は区別されます。対応していないブラウザでは、一致している値も無効になってしまうため、将来的な機能の一部とみなされます。
<div class="sample-block">
<div class="item">item</div>
<div class="Item">Item</div>
<div class="ITEM">ITEM</div>
</div>
/* 共通のスタイル */
.sample-block {
display: grid;
}
.sample-block div {
padding: 0.5rem;
border-block-end: 1px solid gray;
}
/* s識別子を追加すると大文字・小文字を区別する */
[class="item" s] {
color: red;
}
属性セレクタ:値のリスト検索
- 構文
- E[foo~="var"]
- 説明
foo
属性に複数の空白区切りの値がある場合にvar
を持つE
要素を選択- レベル
- 2
属性セレクタの値を参照するイコール(=
)の前にチルダ(~
)を追加すると、空白区切りで複数の値を指定しているリストの中から、文字列に一致する値を検索できます。通常の属性セレクタでは、複数の値を全て記載しなければなりませんが、キーワードに一致するものだけを特定したい場合に有効です。
<div class="sample-block">
<p class="text-red-600 font-sans font-bold">段落の内容を表すテキスト。</p>
<p class="text-green-600 font-sans">段落の内容を表すテキスト。</p>
<p class="text-blue-600 font-serif">段落の内容を表すテキスト。</p>
</div>
/* 共通のスタイル */
.sample-block p {
margin-block: 1rem 0;
}
/* class属性の値が部分一致するセレクタ */
[class~="text-red-600"] {
color: rgb(220 38 38);
}
[class~="text-green-600"] {
color: rgb(22 163 74);
}
[class~="text-blue-600"] {
color: rgb(37 99 235);
}
[class~="font-sans"] {
font-family: Hiragino Kaku Gothic ProN, Meiryo, sans-serif;
}
[class~="font-serif"] {
font-family: Hiragino Mincho ProN, Yu Mincho, serif;
}
[class~="font-bold"] {
font-weight: bold;
}
属性セレクタ:先頭一致
- 構文
- E[foo^="var"]
- 説明
foo
属性の値が前方一致のvar
である場合にE
要素を選択- レベル
- 3
属性セレクタの値を参照するイコール(=
)の前にキャレット(^
)を追加すると、空白区切りで複数の値を指定しているリストの中から、先頭の文字列に一致する値を検索できます。これは正規表現の前方一致と似た記法です。値の順序を入れ替えて、別のプロパティを適用したい場合などに有効です。
<div class="sample-block">
<p class="red green blue">red green blue</p>
<p class="green blue red">green blue red</p>
<p class="blue red green">blue red green</p>
</div>
/* 共通のスタイル */
.sample-block p {
margin-block: 1rem 0;
}
/* class属性の値が前方一致するセレクタ */
[class^="red"] {
color: red;
}
[class^="green"] {
color: green;
}
[class^="blue"] {
color: blue;
}
属性セレクタ:後方一致
- 構文
- E[foo$="var"]
- 説明
- 属性の値が後方一致の
var
である場合にE
要素を選択 - レベル
- 3
属性セレクタの値を参照するイコール(=
)の前にドルマーク($
)を追加すると、空白区切りで複数の値を指定しているリストの中から、最後の文字列に一致する値を検索できます。これは正規表現の後方一致と似た記法です。値の順序を入れ替えて、別のプロパティを適用したい場合などに有効です。
<div class="sample-block">
<p class="red green blue">red green blue</p>
<p class="green blue red">green blue red</p>
<p class="blue red green">blue red green</p>
</div>
/* 共通のスタイル */
.sample-block p {
margin-block: 1rem 0;
}
/* class属性の値が後方一致するセレクタ */
[class$="red"] {
color: red;
}
[class$="green"] {
color: green;
}
[class$="blue"] {
color: blue;
}
属性セレクタ:部分一致
- 構文
- E[foo*="var"]
- 説明
foo
属性の値が部分一致でvar
を含む場合のE
要素を選択- レベル
- 3
属性セレクタの値を参照するイコール(=
)の前にアスタリスク(*
)を追加すると、指定された文字列に一致する部分を持つ値を検索できます。これは値ごとの単位で完全一致していなくても、部分的に一致していればプロパティを適用する場合に有効です。ただし、ありふれた名前を扱うと意図しない箇所にスタイルが反映されてしまうため、命名規則を決めてから実装してください。
<div class="sample-block">
<p class="border-redColor">border-redColor</p>
<p class="border-greenColor">border-greenColor</p>
<p class="border-blueColor">border-blueColor</p>
</div>
/* 共通のスタイル */
.sample-block p {
margin-block: 1rem 0;
}
/* class属性の値が部分一致するセレクタ */
[class*="border"] {
border-block-end: 2px solid;
}
[class*="red"] {
border-color: red;
}
[class*="green"] {
border-color: green;
}
[class*="blue"] {
border-color: blue;
}
属性セレクタ:ハイフンで連結した値の部分一致
- 構文
- E[foo|="var"]
- 説明
foo
属性がハイフン区切りの値である場合に前方一致のvar
を持つE
要素を選択- レベル
- 2
属性セレクタの値を参照するイコール(=
)の前にパイプ(|
)を追加すると、指定された文字列に完全に一致するか、ハイフン(-
)で連結された名前の最初の文字列に一致するものを検索できます。命名規則が整っているフレームワークやコンポーネントを操作する場合に有効です。
<div class="sample-block">
<p class="border-red">border-red</p>
<p class="border-green">border-green</p>
<p class="border-blue">border-blue</p>
</div>
/* 共通のスタイル */
.sample-block p {
margin-block: 1rem 0;
}
/* class属性の値が完全一致かハイフン前先頭一致するセレクタ */
[class|="border"] {
border-block-end: 2px solid;
}
/* 条件に一致しないため適用されない */
[class|="red"] {
border-color: red;
}
[class|="green"] {
border-color: green;
}
[class|="blue"] {
border-color: blue;
}
:not擬似クラス
- 構文
- E:not(F)
- 説明
- 条件
F
を含まないE
要素を選択 - レベル
- 3/4
:not
擬似クラスは、要素を選択しない条件を表します。条件の定義はカッコ()
の中にセレクタを指定する形式で行います。複数のセレクタをカンマ(,
)区切りのリストで指定することもできます。このリストは複雑なセレクタリスト(<complex-selector-list>)として扱われるため、無効なセレクタが含まれていた場合は、クラス全体の機能を停止します。
このクラス自体は詳細度を持ちませんが、引数として指定されたセレクタの詳細度は継承します。複数のセレクタを指定した場合は、より大きい方の詳細度が採用されます。さらに、他のセレクタと連結した場合は詳細度が加算されます。例えば、#foo:not(#var)
という指定は二つのIDセレクタの詳細度を持ちます。
注意点として、このクラスのカッコ内には擬似要素を指定することができません。条件に::before
や::after
などが含まれていると、文法的には合っていてもスタイルは適用されません。
/* p要素ではない全ての要素に一致 */
:not(p) {}
/* div要素のうちitemクラスを持たないもの */
div:not(.item) {}
/* div要素のうちitemクラスを持たないもの(強調) */
div:not(:is(.item)) {}
/* header要素の中のnav要素以外に一致 */
header :not(nav) {}
/* クラスセレクタ内の先頭に配置されたp要素を除外 */
.entry > p:not(:first-child) {}
/* クラスセレクタ内の特定のクラス名を持つp要素を除外(複数指定) */
.entry > p:not(.meta, .comment) {}
:is擬似クラス
- 構文
- E:is(F)
- 説明
- 条件
F
に当てはまるE
要素を選択 - レベル
- 4
:is
擬似クラスは、要素を選択する条件を表します。条件の定義はカッコ()
の中にセレクタを指定する形式で行います。複数のセレクタをカンマ(,
)区切りのリストで指定することもできます。このリストは寛容なセレクタリスト(<forgiving-selector-list>)として扱われるため、無効なセレクタが含まれていた場合は、それを無視して有効なセレクタのみを採用します。
このクラス自体は詳細度を持ちませんが、引数として指定されたセレクタの詳細度は継承します。複数のセレクタを指定した場合は、より大きい方の詳細度が採用されます。そのため、スタイルを優先的に上書きしたい場合に有効です。詳細度を上げずに条件を指定したい場合は、:where
擬似クラスを使用してください。
注意点として、このクラスのカッコ内には擬似要素を指定することができません。条件に::before
や::after
などが含まれていると、文法的には合っていてもスタイルは適用されません。
/* p要素であれば一致 */
:is(p) {}
/* div要素がitemクラスを持っていれば一致 */
div:is(.item) {}
/* div要素にhoverイベントが発生したら一致 */
div:is(:hover) {}
/* header要素の中にnav要素があれば一致 */
header :is(nav) {}
/* クラスセレクタ内の先頭に配置されたp要素に一致 */
.entry > p:is(:first-child) {}
/* クラスセレクタ内の特定のクラス名を持つp要素に一致(複数指定) */
.entry > p:is(.meta, .comment) {}
/* 階層が深い場所に配置された見出しを一括で選択 */
section > :is(h1, h2, h3) :is(h1, h2, h3) {}
:where擬似クラス
- 構文
- E:where(F)
- 説明
- 条件
F
に当てはまるE
要素を選択 - レベル
- 4
:where
擬似クラスは、要素を選択する条件を表します。条件の定義はカッコ()
の中にセレクタを指定する形式で行います。複数のセレクタをカンマ(,
)区切りのリストで指定することもできます。このリストは寛容なセレクタリスト(<forgiving-selector-list>)として扱われるため、無効なセレクタが含まれていた場合は、それを無視して有効なセレクタのみを採用します。
このクラスで指定されたセレクタは詳細度を0
に保ちます。そのため、スタイルの優先度を低くしておきたい場合に有効です。詳細度を上げてスタイルを優先的に上書きしたい場合は、:is
擬似クラスを使用してください。
注意点として、このクラスのカッコ内には擬似要素を指定することができません。条件に::before
や::after
などが含まれていると、文法的には合っていてもスタイルは適用されません。
/* p要素であれば一致 */
:where(p) {}
/* div要素がitemクラスを持っていれば一致 */
div:where(.item) {}
/* div要素にhoverイベントが発生したら一致 */
div:where(:hover) {}
/* header要素の中にnav要素があれば一致 */
header :where(nav) {}
/* クラスセレクタ内の先頭に配置されたp要素に一致 */
.entry > p:where(:first-child) {}
/* クラスセレクタ内の特定のクラス名を持つp要素に一致(複数指定) */
.entry > p:where(.meta, .comment) {}
/* 階層が深い場所に配置された見出しを一括で選択 */
section > :where(h1, h2, h3) :where(h1, h2, h3) {}
:has擬似クラス
- 構文
- E:has(F)
- 説明
- 条件
F
を持つE
要素を選択 - レベル
- 4
:has
擬似クラスは、任意のセレクタを持つ条件を表します。条件の定義はカッコ()
の中にセレクタを指定する形式で行います。複数のセレクタをカンマ(,
)区切りのリストで指定することもできます。このリストは寛容な相対セレクタリスト(<forgiving-relative-selector-list>)として扱われるため、無効なセレクタが含まれていた場合は、クラス全体の機能を停止します。
このクラス自体は詳細度を持ちませんが、引数として指定されたセレクタの詳細度は継承します。複数のセレクタを指定した場合は、より大きい方の詳細度が採用されます。
この機能は子孫を包含する親要素の状態を判別してスタイルを適用したい場合に有効です。特に、ユーザーの操作やスクリプトで内容が動的に変化するコンテンツの管理に役立ちます。
注意点として、このクラスのカッコ内には擬似要素を指定することができません。条件に::before
や::after
などが含まれていると、文法的には合っていてもスタイルは適用されません。
/* p要素を子孫に持つdiv要素に一致 */
div:has(p) {}
/* p要素を直接の子に持つdiv要素に一致 */
div:has(> p) {}
/* div要素がredまたはblueクラスの子孫を持つ場合に一致 */
div:has(.red, .blue) {}
/* div要素がredおよびblueクラスの子孫を持つ場合に一致 */
div:has(.red):has(.blue) {}
/* div要素の子孫でhoverイベントが発生した子孫を持つ要素に一致 */
div :has(:hover) {}
/* 隣接する見出しがある場合の見出しに一致 */
:where(h1, h2, h3):has(+h2, +h3) {}
/* 子にtocクラスを持つul要素を除外 */
ul > :has(:not(.toc)) {}
:root擬似クラス
- 構文
- :root
- 説明
- ドキュメントのルートにあたる要素を選択
- レベル
- 3
:root
擬似クラスは、文書のツリー構造のルート、つまりドキュメントツリーの最上部を選択します。HTML文書であれば<html>
要素を指します。この効果はタイプセレクタでhtml
を指定した場合と同じです。一般的には、CSS全体で使い回すグローバル変数を定義する場合などに用いられます。
/* サイト全体で使うグローバル変数を定義 */
:root {
--font-family-sans: Hiragino Kaku Gothic ProN, Meiryo, sans-serif;
--font-family-serif: Hiragino Mincho ProN, Yu Mincho, serif;
--color-text: #080808;
--color-base: #f8f8f8;
--global-padding-inline: 1rem;
}
:empty擬似クラス
- 構文
- E:empty
- 説明
E
要素の内容が空の場合に選択- レベル
- 3
:empty
擬似クラスは、その要素が子要素や文字内容を持たないことを表します。内容にはホワイトスペース(
)も含まれますが、コメント、スクリプト、擬似要素で生成されたものは含まれません。
このセレクタは、何らかの理由で中身が空っぽの要素が配置される可能性のある箇所に対して、中身が空であることを条件に特別なスタイルを用意しておきたい場合に有効です。例えば、ユーザーの操作で後から内容が生成されるコンテンツなどで、スクリプトの処理が完了するまで要素を隠しておくなどの対応が行えます。
ただし、<input>
や<textarea>
などのフォームパーツは、内容を属性値として扱うため意図した効果を発揮しません。
/* 全ての空要素に一致 */
:empty {
display: none;
}
/* ul要素の子要素に空の項目があれば一致 */
ul > :empty {
block-size: 1lh;
}
/* 段落要素が空でなかった場合に一致 */
p:not(:empty) {
margin-block-start: 1rem;
}
以下の例では、順序つきリストの中に空の項目があった場合の処理を表しています。visibility
プロパティで非表示にして番号を飛ばしています。ここに要素の高さを詰めるなどのスタイルを追加することもできます。
<ol class="sample-list">
<li>Item</li>
<li>Item</li>
<li></li>
<li>Item</li>
<li>Item</li>
</ol>
/* 共通のスタイル */
.sample-list li {
border-bottom: 1px solid gray;
}
/* 順序リストの中に空項目があった場合に飛ばす */
.sample-list > li:empty {
visibility: hidden;
}
:nth-child擬似クラス
- 構文
- E:nth-child( An+B [of S]? )
- 説明
- 共通の親を持つ全ての要素の先頭から(n番目)の
E
要素を選択 - レベル
- 3
:nth-child
擬似クラスは、共通の親を持つ兄弟要素の順序を表します。カウントの対象は全ての要素です。異なるタグ名を持つ要素ごとに順序を摘出したい場合は、:nth-of-type
を使用してください。
順序を定義するカウンターは親要素を閉じた地点で止まります。新たな階層ごとに順序はリセットされるため、条件が一致すれば同じ順序に配置された別の階層の要素が選択されることになります。注意点としては、順序を選択してから条件の揃うセレクタを一致させるため、その場所に該当する要素が存在しなければスタイルは無視されます。
条件を表す式はカッコ()
の中にAn+B [of S]
で記載します。予約されたキーワードとして奇数番目を表すodd
と、偶数番目を表すeven
が使えます。
A
:整数の刻み値を表しますn
:0から始まる正の整数ですB
:整数の加算値を表しますS
:省略可能なセレクタリストです
/* 同じ階層の全ての順番を選択して無条件に一致 */
:nth-child(n) {}
/* 同じ階層の1番目を選択してp要素であれば一致 */
p:nth-child(1) {}
/* 同じ階層の2番目の倍数の順序を選択してli要素に一致 */
li:nth-child(2n) {}
/* 0から始まるnの起点を1にして2つごとのli要素に一致 */
li:nth-child(2n+1) {}
/* 9番目を起点にさかのぼり3つごとのli要素に一致 */
li:nth-child(-3n+9) {}
/* 5番目以降に配置されたクラスセレクタに一致 */
.item:nth-child(n+5) {}
/* 5番目以前に配置されたクラスセレクタに一致 */
.item:nth-child(-n+5) {}
/* テーブルセルの奇数番目(1,3,5...)に一致 */
tr > td:nth-child(odd) {}
/* テーブルセルの偶数番目(2,4,6...)に一致 */
tr > td:nth-child(even) {}
以下のサンプルを操作して、実際にスタイルが適応される範囲を確かめてみましょう。セレクトボックスで条件を指定すると、一致した要素の背景色が変化します。この例では、共通の親を持つ<li>
要素を扱っていますが、同じ階層に属する任意の要素に代用できます。
:nth-last-child擬似クラス
- 構文
- E:nth-last-child( An+B [of S]? )
- 説明
- 共通の親を持つ全ての要素の最後から(n番目)の
E
要素を選択 - レベル
- 3
:nth-last-child
擬似クラスは、共通の親を持つ要素の中で最後に配置されたものからさかのぼる順序の条件を表します。カウントの対象は全ての要素です。異なるタグ名を持つ要素ごとに順序を摘出したい場合は、:nth-last-of-type
を使用してください。
順序を定義するカウンターは親要素を閉じた地点で止まります。新たな階層ごとに順序はリセットされるため、条件が一致すれば同じ順序に配置された別の階層の要素が選択されることになります。注意点としては、順序を選択してから条件の揃うセレクタを一致させるため、その場所に該当する要素が存在しなければスタイルは無視されます。
条件を表す式はカッコ()
の中にAn+B [of S]
で記載します。予約されたキーワードとして奇数番目を表すodd
と、偶数番目を表すeven
が使えます。
A
:整数の刻み値を表しますn
:0から始まる正の整数ですB
:整数の加算値を表しますS
:省略可能なセレクタリストです
/* 同じ階層の全ての順番を選択して無条件に一致 */
:nth-last-child(n) {}
/* 最後から1番目を選択してp要素であれば一致 */
p:nth-last-child(1) {}
/* 最後から2番目の倍数の順序を選択してli要素に一致 */
li:nth-last-child(2n) {}
/* 0から始まるnの起点を1にして最後から2つごとのli要素に一致 */
li:nth-last-child(2n+1) {}
/* 最後から数えて9番目を起点に3つごとのli要素に一致 */
li:nth-last-child(-3n+9) {}
/* 最後から数えて5番目以前のクラスセレクタに一致 */
.item:nth-last-child(n+5) {}
/* 最後から数えて5番目以降のクラスセレクタに一致 */
.item:nth-last-child(-n+5) {}
/* テーブルセルの最後を起点(1)として奇数番目(10,8,6...)に一致 */
tr > td:nth-last-child(odd) {}
/* テーブルセルの最後を起点(1)として偶数番目(9,7,5...)に一致 */
tr > td:nth-last-child(even) {}
以下のサンプルを操作して、実際にスタイルが適応される範囲を確かめてみましょう。セレクトボックスで条件を指定すると、一致した要素の背景色が変化します。この例では、共通の親を持つ<li>
要素を扱っていますが、同じ階層に属する任意の要素に代用できます。
:first-child擬似クラス
- 構文
- E:first-child
- 説明
- 共通の親を持つ全ての要素の先頭に置かれた
E
要素を選択 - レベル
- 2
:first-child
擬似クラスは、共通の親を持つ要素の中で最初に配置されている子要素を表します。このクラス自体は要素の種類を特定しません。対象を絞り込む場合は、コロン(:
)の前に要素名やクラス名などを指定します。
<ul class="sample-list">
<li><span>Category</span>
<ol>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ol>
</li>
<li><span>Category</span>
<ol>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ol>
</li>
<li><span>Category</span>
<ol>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ol>
</li>
</ul>
/* 共通のスタイル */
.sample-list {
padding-inline: 1rem 0;
margin-block: 1rem 0;
}
/* 共通の親要素を持つ兄弟の最初の要素だけが一致 */
.sample-list span:first-child {
display: block;
padding-inline: 0.5rem;
background-color: #ccc;
}
.sample-list li:first-child {
background-color: #fcc;
}
:last-child擬似クラス
- 構文
- E:last-child
- 説明
- 共通の親を持つ全ての要素の最後に置かれた
E
要素を選択 - レベル
- 3
:last-child
擬似クラスは、共通の親を持つ要素の中で最後に配置されている子要素を表します。このクラス自体は要素の種類を特定しません。対象を絞り込む場合は、コロン(:
)の前に要素名やクラス名などを指定します。
<div class="sample-block">
<div class="item">
<h2>見出し要素</h2>
<p>段落の内容を表すテキスト。</p>
<div>この階層の最終要素:div</div>
</div>
<div class="item">
<h2>見出し要素</h2>
<p>段落の内容を表すテキスト。</p>
<span>この階層の最終要素:span</span>
</div>
<div class="item">
<h2>見出し要素</h2>
<p>段落の内容を表すテキスト。</p>
<aside>この階層の最終要素:aside</aside>
</div>
</div>
/* 共通のスタイル */
.sample-block .item {
margin-block: 1rem 0;
}
.sample-block h2 {
margin: 0;
font-size: 1rem;
}
.sample-block p {
margin: 0;
}
/* class名がitemの最後の要素に一致 */
.sample-block .item:last-child {
text-align: right;
}
/* class名がitemの親に属する最後の子要素に一致 */
.sample-block .item :last-child {
color: red;
}
:only-child擬似クラス
- 構文
- E:only-child
- 説明
- 親要素の中で子要素が
E
要素のみの場合を選択 - レベル
- 3
:only-child
擬似クラスは、共通の親を持つ兄弟要素が他にない唯一の要素であることを表します。対象となる階層の中で最初の要素かつ最後の要素であることが条件です。他に要素とみなされる物がひとつでも配置されていれば、選択されません。
<ul class="sample-list">
<li>Item</li>
</ul>
<ul class="sample-list">
<li>Item</li>
<li>Item</li>
</ul>
<ul class="sample-list">
<li>Item
<ul class="sample-list">
<li>Item</li>
</ul>
</li>
<li>Item</li>
<li>Item</li>
</ul>
/* 共通のスタイル */
.sample-list {
padding-inline: 1.5rem;
border: 1px solid gray;
}
/* リストに含まれる唯一の項目だった場合に一致 */
li:only-child {
color: red;
}
:nth-of-type擬似クラス
- 構文
- E:nth-of-type( An+B )
- 説明
- 兄弟関係にあたる
E
要素の先頭から(n番目)のE
要素を選択 - レベル
- 3
:nth-of-type
擬似クラスは、共通の親を持つ兄弟要素の型(type)ごとの配置順を表します。同じ階層に属する要素であっても異なるタグ名を持つ要素であれば、個別にカウントされます。
対象のコンテナの中に複数の異なるタグ名を持つ要素が混在している場合は、それぞれ最初に配置されたものを一番目としてカウントします。全ての兄弟要素を一つのカウンターで数えたい場合は:nth-child
を使用してください。
条件を表す式はカッコ()
の中にAn+B
で記載します。予約されたキーワードとして奇数番目を表すodd
と、偶数番目を表すeven
が使えます。
A
:整数の刻み値を表しますn
:0から始まる正の整数ですB
:整数の加算値を表します
/* 同じ階層のp要素だけをカウントして全てに一致 */
p:nth-of-type(n) {}
/* 同じ階層に配置された要素の中で最初のspanに一致 */
span:nth-of-type(1) {}
/* 要素ごとに2の倍数の順番を選択して.itemクラスであれば一致 */
.item:nth-of-type(2n) {}
/* 0から始まるnの起点を1にして2つごとに.itemクラスであれば一致 */
.item:nth-of-type(2n+1) {}
/* 10番目以降のtd要素に一致(thがあっても数がずれない) */
td:nth-of-type(n+10) {}
/* 2番目以前のtd要素に一致(thがあっても数がずれない) */
td:nth-of-type(-n+2) {}
/* テーブルの奇数番目(1,3,5...)に配置された行のセルに一致 */
tr:nth-of-type(odd) td {}
/* テーブルの偶数番目(2,4,6...)に配置された行のセルに一致 */
tr:nth-of-type(even) td {}
以下の例では、複数の行と列を持つテーブルに対して、内包するセルの装飾を:nth-of-type
擬似クラスを用いて行っています。対象の型(type)を絞り込むために親要素と組み合わせたり、セル自身に擬似クラスを追加してスタイルを適用しています。
<table class="sample-table">
<tr>
<th>A1行<th>B列<th>C列<th>D列<th>E列<th>F列
</tr>
<tr>
<th>A2行<td>B2<td>C2<td>D2<td>E2<td>F2
</tr>
<tr>
<th>A3行<td>B3<td>C3<td>D3<td>E3<td>F3
</tr>
<tr>
<th>A4行<td>B4<td>C4<td>D4<td>E4<td>F4
</tr>
<tr>
<th>A5行<td>B5<td>C5<td>D5<td>E5<td>F5
</tr>
<tr>
<th>A6行<td>B6<td>C6<td>D6<td>E6<td>F6
</tr>
</table>
/* 先頭のth要素だけに幅を指定する */
th:nth-of-type(1) {
inline-size: 14%;
}
/* 奇数行に含まれるセルの背景色を変える */
tr:nth-of-type(odd) td {
background-color: #ffffee;
}
/* 偶数行に含まれるセルの背景色を変える */
tr:nth-of-type(even) td {
background-color: #eeffff;
}
/* 2番目以前のtd要素の文字色を変える */
td:nth-of-type(-n+2) {
color: red;
}
/* 4番目以降のtd要素の文字色を変える */
td:nth-of-type(n+4) {
color: green;
}
:nth-last-of-type擬似クラス
- 構文
- E:nth-last-of-type( An+B )
- 説明
- 兄弟関係にあたる
E
要素の最後から(n番目)のE
要素を選択 - レベル
- 3
:nth-last-of-type
擬似クラスは、共通の親を持つ兄弟要素の型(type)ごとの配置順を逆順に表します。同じ階層に属する要素であっても異なるタグ名を持つ要素であれば、個別にカウントされます。最後から先頭に向かってカウントするという点を除いて:nth-of-type
擬似クラスと同等の機能です。
対象のコンテナの中に複数の異なるタグ名を持つ要素が混在している場合は、それぞれ最後に配置されたものを一番目としてカウントします。全ての兄弟要素を一つのカウンターで数えたい場合は:nth-last-child
を使用してください。
条件を表す式はカッコ()
の中にAn+B
で記載します。予約されたキーワードとして奇数番目を表すodd
と、偶数番目を表すeven
が使えます。
A
:整数の刻み値を表しますn
:0から始まる正の整数ですB
:整数の加算値を表します
/* 同じ階層のp要素だけをカウントして全てに一致 */
p:nth-last-of-type(n) {}
/* 同じ階層に配置された要素の中で最後のspanに一致 */
span:nth-last-of-type(1) {}
/* 最後から2の倍数の順でさかのぼり.itemクラスであれば一致 */
.item:nth-last-of-type(2n) {}
/* 0から始まるnの起点を1にして最後から2つごとに.itemクラスであれば一致 */
.item:nth-last-of-type(2n+1) {}
/* 最後から5番目以前のtd要素に一致(thがあっても数がずれない) */
td:nth-last-of-type(n+5) {}
/* 最後から5番目以降のtd要素に一致(thがあっても数がずれない) */
td:nth-last-of-type(-n+5) {}
/* テーブルの奇数番目(1,3,5...)に配置された行のセルに一致 */
tr:nth-last-of-type(odd) td {}
/* テーブルの偶数番目(2,4,6...)に配置された行のセルに一致 */
tr:nth-last-of-type(even) td {}
以下の例は、グリッドコンテナに配置された複数の<div>
要素と複数の<span>
要素に対して、:nth-last-of-type
を用いて背景色を追加するものです。この擬似セレクタで要素ごとの順番をカウントし、要素名やクラス名の条件に一致するものを適用対象にします。
セレクトボックスを操作して、実際にスタイルが適応される範囲を確かめてみましょう。:nth-last-of-type
は最後から先頭に向かって順番を数える点に注意してください。
:first-of-type擬似クラス
- 構文
- E:first-of-type
- 説明
- 兄弟関係にあたる
E
要素の最初のE
要素のみを選択 - レベル
- 3
:first-of-type
擬似クラスは、共通の親を持つ兄弟要素の型(type)ごとの先頭の配置順を表します。同じ階層に属する要素であっても異なるタグ名を持つ要素であれば、最初に配置してあるものが一番目として数えられます。
対象のコンテナの中に複数の異なるタグ名を持つ要素が混在している場合、それぞれ最初に配置されたものに対して個別のスタイルを適用したい場合に有効です。いかなる要素であっても最初に配置されたものだけを選択したい場合は、:first-child
擬似クラスを使用してください。
<div class="sample-block">
<h2>h2:見出し要素</h2>
<p>p:段落の内容を表すテキスト。</p>
<p>p:段落の内容を表すテキスト。</p>
<h2>h2:見出し要素</h2>
<p>p:段落の内容を表すテキスト。</p>
<p>p:段落の内容を表すテキスト。</p>
<aside>aside:余談を表す内容。</aside>
</div>
/* 同じタグ名の最初に配置された要素に背景を敷く */
.sample-block :first-of-type {
background-color: transparent;
background-image: linear-gradient(to right, #00ffcc 0%, #00ff66 100%);
background-repeat: no-repeat;
background-position: left bottom;
background-size: 100% 50%;
}
:last-of-type擬似クラス
- 構文
- E:last-of-type
- 説明
- 兄弟関係にあたる
E
要素の最後のE
要素のみを選択 - レベル
- 3
:last-of-type
擬似クラスは、共通の親を持つ兄弟要素の型(type)ごとの末尾の配置順を表します。同じ階層に属する要素であっても異なるタグ名を持つ要素であれば、最後に配置してあるものが一番目として数えられます。
対象のコンテナの中に複数の異なるタグ名を持つ要素が混在している場合、それぞれ最後に配置されたものに対して個別のスタイルを適用したい場合に有効です。いかなる要素であっても最後に配置されたものだけを選択したい場合は、:last-child
擬似クラスを使用してください。
<div class="sample-block">
<h2>h2:見出し要素</h2>
<p>p:段落の内容を表すテキスト。</p>
<p>p:段落の内容を表すテキスト。</p>
<h2>h2:見出し要素</h2>
<p>p:段落の内容を表すテキスト。</p>
<p>p:段落の内容を表すテキスト。</p>
<aside>aside:余談を表す内容。</aside>
</div>
/* 同じタグ名の最後に配置された要素に背景を敷く */
.sample-block :last-of-type {
background-color: transparent;
background-image: linear-gradient(to right, #00ffcc 0%, #00ff66 100%);
background-repeat: no-repeat;
background-position: left bottom;
background-size: 100% 50%;
}
:only-of-type擬似クラス
- 構文
- E:only-of-type
- 説明
- 親要素の中で唯一の
E
要素を選択 - レベル
- 3
:only-of-type
擬似クラスは、同じ型(type)の兄弟関係を持たない要素を表します。これは、同じ階層に属する要素のうち、同じタグ名を持つ要素が他にない場合に一致します。
共通の親を持つ兄弟要素が他にあったとしても、タグ名が異なっていれば条件に一致します。全ての型に対して唯一存在しているものを示す場合は、:only-child
擬似クラスを使用してください。
このセレクタがカウントするのは要素の型です。例え属性やクラス名が異なっていても、同じ階層に同じタグ名の要素が存在している場合は一致しません。ただし、コロン(:
)の前にクラスセレクタやIDセレクタなどを追加して、条件を指定することはできます。
/* ドキュメントの中で唯一存在しているタグに一致 */
:only-of-type {}
/* ul要素の子孫で唯一存在するタグに一致 */
ul :only-of-type {}
/* main要素の子要素で唯一存在するタグのうちクラスセレクタに一致 */
main > .post:only-of-type {}
/* 唯一存在するタグに属性セレクタが見つかれば一致 */
.entry [data-open]:only-of-type {}
/* article要素に兄弟がなかった場合に子のクラスセレクタに一致 */
article:only-of-type > .open {}
:any-link擬似クラス
- 構文
- E:any-link
- 説明
- リンク指定された
E
要素を選択 - レベル
- 4
:any-link
擬似クラスは、ハイパーリンクを指定された全ての要素を表します。このクラスは、HTMLのhref
属性を持つ<a>
要素および<area>
要素を対象に、未訪問(:link
)であっても訪問済み(:visited
)であっても一致します。
このクラスを使用する場合、CSSのソースコード上では:link
や:visited
よりも前に配置し、詳細度を低く保ちます。リンクが未訪問か訪問済みかに関わらず共通するスタイルを適用した上で、個別のスタイルを上書きするためです。
/* 全てのハイパーリンクに一致 */
:any-link {}
/* 詳細度を上げずに指定する */
:where(:any-link) {}
/* href属性を持つ全てのa要素に一致 */
a:any-link {}
/* href属性を持つa要素にhoverイベントが発生した場合に一致 */
a:any-link:hover {}
/* メディアクエリのany-hoverが有効なデバイス向けの指定 */
@media (any-hover: hover) {
:where(:any-link):hover {
--hover-on: initial;
--hover-off: ;
}
}
:link擬似クラス
- 構文
- E:link
- 説明
- リンク先が未訪問である
E
要素を選択 - レベル
- 1
:link
擬似クラスは、ハイパーリンクを指定された要素の未訪問の状態を表します。このクラスは、HTMLのhref
属性を持つ<a>
要素および<area>
要素を対象に、リンク先がまだ訪問されていない場合に一致します。
訪問済みのリンクを対象とする場合は、:visited
擬似クラスを使用します。どちらの状態であっても適用したいスタイルは、:any-link
擬似クラスで指定します。
これらのクラスを併用する場合は、先に:link
、次に:visited
、それに続く形で:hover
や:active
などの状態の変化を定義します。
/* 全ての未訪問のハイパーリンクに一致 */
:link {}
/* 詳細度を上げずに指定する */
:where(:link) {}
/* href属性を持つ未訪問のa要素に一致 */
a:link {}
/* 未訪問のa要素にhoverイベントが発生した場合に一致 */
a:link:hover {}
/* メディアクエリのany-hoverが有効なデバイス向けの指定 */
@media (any-hover: hover) {
:where(:link):hover {
--hover-on: initial;
--hover-off: ;
}
}
:visited擬似クラス
- 構文
- E:visited
- 説明
- リンク先が訪問済みである
E
要素を選択 - レベル
- 1
:visited
擬似クラスは、ハイパーリンクを指定された要素の訪問済みの状態を表します。このクラスは、HTMLのhref
属性を持つ<a>
要素および<area>
要素を対象に、リンク先が既に訪問されたものである場合に一致します。
未訪問のリンクを対象とする場合は、:link
擬似クラスを使用します。どちらの状態であっても適用したいスタイルは、:any-link
擬似クラスで指定します。
これらのクラスを併用する場合は、先に:link
、次に:visited
、それに続く形で:hover
や:active
などの状態の変化を定義します。
/* 全ての訪問済みのハイパーリンクに一致 */
:visited {}
/* 詳細度を上げずに指定する */
:where(:visited) {}
/* href属性を持つ訪問済みのa要素に一致 */
a:visited {}
/* 訪問済みのa要素にhoverイベントが発生した場合に一致 */
a:visited:hover {}
/* メディアクエリのany-hoverが有効なデバイス向けの指定 */
@media (any-hover: hover) {
:where(:visited):hover {
--hover-on: initial;
--hover-off: ;
}
}
:target擬似クラス
- 構文
- E:target
- 説明
- リンク先のターゲットに指定された
E
要素を選択 - レベル
- 3
:target
擬似クラスは、URLのフラグメントに一致するid
属性の値を持つ要素を表します。ページ内リンクなどで、ドキュメントのURLの末尾に#
つきのフラグメントが付与された時に、その内容と同じid
属性の値を持つ要素があればスタイルを適用します。
/* フラグメントの文字列と同じid属性の値があれば一致 */
:target {}
/* 詳細度を上げずに指定する */
:where(:target) {}
/* フラグメントの一致をp要素に限定する */
p:target {}
/* フラグメントに一致した要素の子にスタイルを適用 */
article:target > h1 {}
/* フラグメントに一致した要素に擬似要素を追加 */
section:target::before {}
<!-- リンクをクリックしてURLにフラグメントを追加 -->
<a href="#section_heading">ページ内リンク</a>
<!-- // URLのフラグメントと同じid値を持つ要素に一致 -->
<div>
<h2 id="section_heading">セクションの見出し</h2>
<p>段落の内容を表すテキスト。</p>
<p>段落の内容を表すテキスト。</p>
</div>
:scope擬似クラス
- 構文
- :scope
- 説明
- スコープのルートにあたる要素を選択
- レベル
- 4
:scope
擬似クラスは、セレクタが要素を選択する場合の参照点となる要素を表します。CSSではドキュメントのルートを起点とする:root
擬似クラスが用意されていますが、@scope
を用いてスコープ付きのスタイルルールを使用した場合、その範囲内の起点を:scope
で表すことができます。
そのため、スコープを切らずに:scope
をそのまま使用した場合は、ドキュメントのルートを参照するので:root
と同じ意味になります。ここで、@scope(.content)
を追加してクラスセレクタの空間を切り出した時、その中に記載した:scope
は.content
に一致する要素をルートにします。
/* :rootと同じ */
:scope {}
/* スコープ付きのスタイルルールの中で使用 */
@scope (.theme-light) {
:scope {
--theme-base-main: #f8f8f8;
--theme-text-main: #242424;
}
}
@scope (.theme-dark) {
:scope {
--theme-base-main: #242424;
--theme-text-main: #f8f8f8;
}
}
/* .containerから.itemまでを範囲とする */
@scope (.container) to (:scope > .item) {}
:hover擬似クラス
- 構文
- E:hover
- 説明
- ポインターが重なった
E
要素を選択 - レベル
- 2
:hover
擬似クラスは、ユーザーの操作でポインティングデバイスのポインターが重なった状態を表します。この時点では、まだボタンの押下やタッチ操作が行われていない状態です。
このクラスは、主にhref
属性を持つ<a>
要素や<button>
要素などのインタラクティブ・コンテンツに対して使われますが、ホバーイベントを発生する要素であれば任意のものが一致します。このクラスで指定するスタイルは、同等の機能を持つ他の擬似クラスと関連するので指定する順番や詳細度に気を配ってください。
CSSのソースコード上では、:any-link
、:link
、:visited
などを先に配置し、それを上書きするような形で:hover
や:active
を定義します。これらは排他的な関係にあるので、記載する順番や詳細度の設計を誤ると、スタイルが適用されない場合があります。
/* ポインターが重なった全ての要素に一致 */
:hover {}
/* a要素にポインターが重なった場合に一致 */
a:hover {}
/* 特定のクラスにポインターが重なった場合に一致 */
.class:hover {}
/* フォームの子に配置されたボタンがホバー状態になった時に一致 */
form button:hover {}
/* CSSに記載する順番 */
a:link {/* 未訪問リンクのスタイル */}
a:visited {/* 訪問済みリンクのスタイル */}
a:hover {/* ホバー時のスタイル */}
a:active {/* アクティブ時ののスタイル */}
以下の例は、このクラスの機能を視覚的に表したものです。マウスやタッチパッドを操作して実際に確かめてみましょう。:hover
に関しては、主にポインティングデバイス向きの効果です。
<div class="sample-block" ontouchstart="">
<div class="item"></div>
</div>
/* 共通のスタイル */
.sample-block .item {
padding: 1rem;
border: 3px solid;
font-weight: bold;
text-align: center;
cursor: pointer;
}
/* 要素の状態で背景色を変える */
.item:hover {
background-color: yellow;
}
.item:active {
background-color: pink;
}
/* 要素の状態で擬似要素の内容を変える */
.item::before {
content: "Click!";
}
.item:hover::before {
content: "Hover!";
}
.item:active::before {
content: "Active!";
}
:active擬似クラス
- 構文
- E:active
- 説明
- ユーザーの操作でアクティブになった
E
要素を選択 - レベル
- 1
:active
擬似クラスは、ユーザーの操作でアクティブになった状態を表します。一般的な操作では、マウスのボタンをクリックしてから離すまで、タッチパッドを押してから指を離すまでの間となります。
このクラスは、主にhref
属性を持つ<a>
要素や<button>
要素などのインタラクティブ・コンテンツに対して使われますが、アクティブイベントを発生する要素であれば任意のものが一致します。このクラスで指定するスタイルは、同等の機能を持つ他の擬似クラスと関連するので指定する順番や詳細度に気を配ってください。
CSSのソースコード上では、:any-link
、:link
、:visited
などを先に配置し、それを上書きするような形で:hover
や:active
を定義します。これらは排他的な関係にあるので、記載する順番や詳細度の設計を誤ると、スタイルが適用されない場合があります。
/* アクティブな状態にある全ての要素に一致 */
:active {}
/* a要素がアクティブになった場合に一致 */
a:active {}
/* 特定のクラスがアクティブになった場合に一致 */
.class:active {}
/* フォームの子に配置されたボタンが押下された時に一致 */
form button:active {}
/* CSSに記載する順番 */
a:link {/* 未訪問リンクのスタイル */}
a:visited {/* 訪問済みリンクのスタイル */}
a:hover {/* ホバー時のスタイル */}
a:active {/* アクティブ時ののスタイル */}
以下の例は、このクラスの機能を視覚的に表したものです。マウスやタッチパッドを操作して実際に確かめてみましょう。:hover
に関しては、主にポインティングデバイス向きの効果です。
<div class="sample-block" ontouchstart="">
<div class="item"></div>
</div>
/* 共通のスタイル */
.sample-block .item {
padding: 1rem;
border: 3px solid;
font-weight: bold;
text-align: center;
cursor: pointer;
}
/* 要素の状態で背景色を変える */
.item:hover {
background-color: yellow;
}
.item:active {
background-color: pink;
}
/* 要素の状態で擬似要素の内容を変える */
.item::before {
content: "Click!";
}
.item:hover::before {
content: "Hover!";
}
.item:active::before {
content: "Active!";
}
:focus擬似クラス
- 構文
- E:focus
- 説明
- フォーカスされた
E
要素を選択 - レベル
- 2
:focus
擬似クラスは、ユーザーエージェントのフォーカスが当たっている状態を表します。フォームの入力項目を有効な状態にしたり、tab
キーで対象を指定した場合などに効果が現れます。
このクラスは、フォーカス可能な要素に対してのみ機能します。フォーカス状態の子孫を持つ要素を操作したい場合は、:focus-within
を活用してください。
/* フォーカス状態になった全ての要素に一致 */
:focus {}
/* フォーカス状態になったa要素に一致 */
a:focus {}
/* nav要素の子でフォーカス状態になった要素に一致 */
nav > :focus {}
以下の例は、このクラスの機能を視覚的に表したものです。入力項目をクリックするかフィールド内をクリックしてからtab
キーを押して、実際にフォーカスを移動させてみましょう。
<div class="sample-block">
<label class="red">
<input type="text" value="フォーカスを移動">
<span>.red</span>
</label>
<label class="green">
<input type="text" value="フォーカスを移動">
<span>.green</span>
</label>
<label class="blue">
<input type="text" value="フォーカスを移動">
<span>.blue</span>
</label>
</div>
/* 共通のスタイル */
.sample-block label {
display: flex;
gap: 0.5rem;
padding: 5px;
}
/* フォーカス状態になった要素の装飾 */
.red :focus {
background-color: red;
}
.green :focus {
background-color: green;
}
.blue :focus {
background-color: blue;
}
:focus-within擬似クラス
- 構文
- E:focus-within
- 説明
- 自身か子孫がフォーカスされた
E
要素を選択 - レベル
- 4
:focus-within
擬似クラスは、要素自身あるいは子孫がユーザーエージェントのフォーカスが当たっている状態を表します。複数の入力項目やリンクを内包する親要素のスタイルを、いずれか項目がフォーカスされた時点で変更したい場合に有効です。
このクラスは、対象の要素自身が:focus
に該当するか、その子孫に:focus
に該当する要素が含まれている場合に一致します。そのため、相対的に子孫の状態によって親要素のスタイルを変更できるという利点があります。
/* 自身か子孫がフォーカス状態になった全ての要素に一致 */
:focus-within {}
/* 自身か子孫がフォーカス状態になったform要素に一致 */
form:focus-within {}
/* form要素の中のフォーカス状態になった自身や子孫を持つ要素に一致 */
form :focus-within {}
以下の例は、このクラスの機能を視覚的に表したものです。入力項目をクリックするかフィールド内をクリックしてからtab
キーを押して、実際にフォーカスを移動させてみましょう。
<div class="sample-block">
<label class="red">
<input type="text" value="フォーカスを移動">
<span>.red</span>
</label>
<label class="green">
<input type="text" value="フォーカスを移動">
<span>.green</span>
</label>
<label class="blue">
<input type="text" value="フォーカスを移動">
<span>.blue</span>
</label>
</div>
/* 共通のスタイル */
.sample-block label {
display: flex;
gap: 0.5rem;
padding: 5px;
}
/* 自身か子孫がフォーカス状態になった要素の装飾 */
.sample-block .red:focus-within {
background-color: red;
}
.sample-block .green:focus-within {
background-color: green;
}
.sample-block .blue:focus-within {
background-color: blue;
}
:focus-visible擬似クラス
- 構文
- E:focus-visible
- 説明
- ユーザーエージェントがフォーカスすべきと判定した
E
要素を選択 - レベル
- 4
:focus-visible
擬似クラスは、ユーザーエージェントのフォーカスが当たっている状態、かつユーザーエージェントが要素にフォーカスを明示するべきであると判断する場合を表します。
:focus
擬似クラスは、常にフォーカスされている要素を示します。多くの場合、要素の周辺を囲うようにアウトライン(フォーッかスリング)を表示します。:focus-visible
擬似クラスは、フォーカスされていることが自明な状況で余計なフォーカスリングを表示させたくない場合に有効です。
/* ユーザーエージェントがフォーカス状態を明示する要素に一致 */
:focus-visible {}
/* フォーカス状態を明示べきと判断されたa要素に一致 */
a:focus-visible {}
以下の例は、:focus
擬似クラスと:focus-visible
擬似クラスの違いを比較するものです。フォームの項目にフォーカスを当てた場合、:focus
であれば常に全ての要素に一致しますが、:focus-visible
はユーザーエージェントの判断でこれを飛ばすことがあります。各項目を順番にクリックして動作を確かめてみましょう。
<div class="sample-block">
<span class="normal">
<input type="text" value="既定値">
<button>変化を確認</button>
</span>
<span class="focus">
<input type="text" value=":focus">
<button>変化を確認</button>
</span>
<span class="focus-visibl">
<input type="text" value=":focus-visible">
<button>変化を確認</button>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: flex;
gap: 0.5rem;
padding: 5px;
}
/* フォーカス状態になった要素の装飾 */
.focus :focus {
outline: 2px solid red;
}
.focus-visibl :focus-visible {
outline: 2px solid blue;
}
:enabled擬似クラス
- 構文
- E:enabled
- 説明
- 有効状態(enabled)である
E
要素を選択 - レベル
- 3
:enabled
擬似クラスは、要素が有効な状態であることを表します。有効とは、ユーザーが操作可能な要素が、フォーカス、クリック、入力などの干渉を受け入れる状態の事を指します。
例えば、フォーム項目の入力可能なテキストエリアや選択可能なチェックボックスが該当します。これらの要素にdisabled
属性が指定されていれば、要素は無効な状態になるため、:enabled
擬似クラスの対象から外れることになります。
<div class="sample-block">
<span>
<input type="text" value="有効(enabled)">
<button>有効(enabled)</button>
</span>
<span>
<input type="text" value="無効(disabled)" disabled>
<button disabled>無効(disabled)</button>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block input {
inline-size: 10rem;
margin: 0;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block :enabled {
color: green;
}
.sample-block :disabled {
color: red;
}
:disabled擬似クラス
- 構文
- E:disabled
- 説明
- 無効状態(disabled)である
E
要素を選択 - レベル
- 3
:disabled
擬似クラスは、要素が無効な状態であることを表します。無効とは、ユーザーが操作可能な要素が、フォーカス、クリック、入力などの干渉を受け入れない状態の事を指します。
例えば、フォーム項目を構成する要素にdisabled
属性が指定されている場合に該当します。通常のテキストエリアやチェックボックスはユーザーの操作を受け入れますが、操作不能な状態のスタイルを定義したい場合に有効です。
<div class="sample-block">
<span>
<input type="text" value="有効(enabled)">
<button>有効(enabled)</button>
</span>
<span>
<input type="text" value="無効(disabled)" disabled>
<button disabled>無効(disabled)</button>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block input {
inline-size: 10rem;
margin: 0;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block :enabled {
color: green;
}
.sample-block :disabled {
color: red;
}
:read-write擬似クラス
- 構文
- E:read-write
- 説明
- 編集可能な状態の
E
要素を選択 - レベル
- 3-UI/4
:read-write
擬似クラスは、ユーザーが編集可能な状態を表します。編集可能な状態とは、ユーザーがブラウザに表示されている内容を読み取るだけでなく、追加・編集・削除できるもののことです。
既定値では、<input>
や<textarea>
で作成された入力項目が該当します。ただし、HTMLのグローバル属性には要素を編集可能な状態にするcontenteditable
というものが用意されているため、これを組み合わせることで全ての要素を対象にすることができます。
<div class="sample-block">
<span>
<input type="text" value="編集可能(read-write)">
</span>
<span>
<input type="text" value="読み取り専用(read-only)" readonly>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: block;
padding-block: 5px;
}
.sample-block input {
inline-size: 14rem;
margin: 0;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block :read-write {
color: green;
}
.sample-block :read-only {
color: red;
}
上記の例は、単純な入力項目の状態を判別するものです。これらの要素は既定値でユーザーの操作を受け入れる状態にあるため、操作を無効にしたり読み取り専用にする場合は、属性を追加して機能に制限をかけます。
逆に、既定値では編集できない要素にcontenteditable
属性を付与した場合は、:read-write
擬似セレクタに該当する状態に変化します。段落要素は既定値で読み取り専用であるため、何も属性を指定しなかった場合:read-only
擬似セレクタの対象になります。
<div class="sample-block">
<p contenteditable>編集可能な属性(contenteditable)を持つ段落</p>
<p>読み取り専用(read-only)の通常の段落</p>
</div>
/* 共通のスタイル */
.sample-block p {
padding: 0.5rem;
margin-block: 0.5rem;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block p:read-write {
background-color: #9f9;
}
.sample-block p:read-only {
background-color: #f99;
}
:read-only擬似クラス
- 構文
- E:read-only
- 説明
- 編集不可能な状態の読み取り専用の
E
要素を選択 - レベル
- 3-UI/4
:read-only
擬似クラスは、ユーザーが編集できない読み取り専用の状態であることを表します。既定値では、<input>
や<textarea>
で作成した入力項目は編集可能な要素として扱われますが、これらの要素に対してreadonly
属性を追加すると、読み取り専用の項目として:read-only
擬似クラスの選択対象になります。
以下の例を操作して、入力項目の内部に表示されているテキストを削除しようとしてみてください。編集可能な要素であれば書いてある内容を削除できますが、readonly
属性を付与された要素は編集を許可しません。:read-only
擬似クラスは、この状態を参照して一致したものにスタイルを適用します。
<div class="sample-block">
<span>
<input type="text" value="編集可能(read-write)">
</span>
<span>
<input type="text" value="読み取り専用(read-only)" readonly>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: block;
padding-block: 5px;
}
.sample-block input {
inline-size: 14rem;
margin: 0;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block :read-write {
color: green;
}
.sample-block :read-only {
color: red;
}
上記の例は、単純な入力項目の状態を判別するものです。これらの要素は既定値でユーザーの操作を受け入れる状態にあるため、操作を無効にしたり読み取り専用にする場合は、属性を追加して機能に制限をかけます。
逆に、既定値では編集できない要素にcontenteditable
属性を付与した場合は、:read-write
擬似セレクタに該当する状態に変化します。段落要素は既定値で読み取り専用であるため、何も属性を指定しなかった場合:read-only
擬似セレクタの対象になります。
<div class="sample-block">
<p contenteditable>編集可能な属性(contenteditable)を持つ段落</p>
<p>読み取り専用(read-only)の通常の段落</p>
</div>
/* 共通のスタイル */
.sample-block p {
padding: 0.5rem;
margin-block: 0.5rem;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block p:read-write {
background-color: #9f9;
}
.sample-block p:read-only {
background-color: #f99;
}
:placeholder-shown擬似クラス
- 構文
- E:placeholder-shown
- 説明
- プレースホルダーが表示されている状態の
E
要素を選択 - レベル
- 3-UI/4
:placeholder-shown
擬似クラスは、placeholder
属性を持つ要素が値を有効にしている状態を表します。主に、入力項目のテキストエリアにプレースホルダーが表示されている場合に該当します。
このクラスは、編集可能な要素が待機状態であること、あるいはユーザーに入力して欲しい項目を強調する場合に有効です。プレースホルダーの値は何も入力されていないテキストエリアに表示される案内文字であるため、何らかの文字が入力されると値は見えなくなり、:placeholder-shown
擬似クラスの対象から外れます。
<div class="sample-block">
<span>
文字を編集:<input type="text" value="valueの値です">
</span>
<span>
文字を入力:<input type="text" placeholder="placeholderの値です">
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: block;
padding-block: 5px;
}
.sample-block input {
inline-size: 14rem;
margin: 0;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block :placeholder-shown {
border: 2px solid red;
border-radius: 3px;
}
:default擬似クラス
- 構文
- E:default
- 説明
- 既定値の状態になっている
E
要素を選択 - レベル
- 3-UI/4
:default
擬似クラスは、入力項目のグループ内で既定のものを表します。具体的には、フォーム内の操作を受け付ける項目の中で、最初に配置されているもの、checked
属性やselected
属性を持つ要素に一致します。
このクラスで判別できる要素は、<button>
、<input type="checkbox">
、<input type="radio">
、<option>
となっています。その中で、関連付けられた項目の中から既定で使われるものを選びます。
<button>
は、フォームに所属するボタンの中で送信に使われる既定のボタンに一致します。<input type="checkbox">
は、checked
属性を付与されたものに一致します。<input type="radio">
は、checked
属性を付与されたものに一致します。<option>
は、兄弟の中で先に配置された有効な要素かselected
属性を付与されたものに一致します。親の<select>
要素にmultiple
が指定されている場合、複数の選択された要素に一致します。
既定の項目は、選択を外してもスタイルを維持します。これはユーザーが操作した後も既定値がどこだったのか痕跡を残したい場合に有効です。あくまで選択されている項目を一致させたい場合は、:checked
擬似クラスを使用してください。
<div class="sample-block">
<span>
<label><input type="checkbox" name="c" checked>既定項目</label>
<label><input type="checkbox" name="c">選択肢</label>
<label><input type="checkbox" name="c">選択肢</label>
</span>
<span>
<label><input type="radio" name="r" checked>既定項目</label>
<label><input type="radio" name="r">選択肢</label>
<label><input type="radio" name="r">選択肢</label>
</span>
<span>
<select>
<option label="selectedが指定されている" selected>
<option label="選択肢">
<option label="選択肢">
</select>
</span>
<span>
<select>
<option label="selectedが指定されていない">
<option label="選択肢">
<option label="選択肢">
</select>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: flex;
gap: 1rem;
padding-block: 5px;
}
.sample-block input {
margin-inline: 0 5px;
}
.sample-block select {
inline-size: 14rem;
}
/* 入力項目の状態を判別するセレクタ */
label:has(:default) {
color: red;
}
select:has(:default) {
background-color: #fcc;
}
:checked擬似クラス
- 構文
- E:checked
- 説明
- チェック状態である
E
要素を選択 - レベル
- 3
:checked
擬似クラスは、入力項目のグループ内で選択された状態のものを表します。具体的には、フォーム内の操作を受け付ける項目の中で、最初から選択されているもの、ユーザーの操作によってchecked
属性やselected
属性を付与された要素に一致します。
このクラスで判別できる要素は、<input type="checkbox">
、<input type="radio">
、<option>
です。それぞれ、選択されているかそうでないかのフラグを持ち、:checked
擬似クラスは前者に該当します。
<input type="checkbox">
は、checked
属性を付与されたもが全て一致します。<input type="radio">
は、同じname
属性の値を持つグループの中でchecked
属性を付与されたものが一つだけ一致します。<option>
は、兄弟の中で先に配置された有効な要素かselected
属性を付与されたものに一致します。親の<select>
要素にmultiple
が指定されている場合、複数の選択された要素に一致します。
選択項目を移動すると、スタイルの適用範囲も変化します。ユーザーが操作した後も既定値がどこだったのか痕跡を残したい場合は、:default
擬似クラスを使用してください。
<div class="sample-block">
<span>
<label><input type="checkbox" name="c" checked>既定項目</label>
<label><input type="checkbox" name="c">選択肢</label>
<label><input type="checkbox" name="c">選択肢</label>
</span>
<span>
<label><input type="radio" name="r" checked>既定項目</label>
<label><input type="radio" name="r">選択肢</label>
<label><input type="radio" name="r">選択肢</label>
</span>
<span>
<select multiple>
<option label="選択肢:red" class="red">
<option label="選択肢:green" class="green">
<option label="選択肢:blue" class="blue">
</select>
</span>
</div>
/* 共通のスタイル */
.sample-block span {
display: flex;
gap: 1rem;
padding-block: 5px;
}
.sample-block input {
margin-inline: 0 5px;
}
.sample-block select {
inline-size: 14rem;
}
/* 入力項目の状態を判別するセレクタ */
label:has(:checked) {
color: red;
}
select:has(.red:checked) {
background-color: #fcc;
}
select:has(.green:checked) {
background-color: #cfc;
}
select:has(.blue:checked) {
background-color: #cff;
}
:indeterminate擬似クラス
- 構文
- E:indeterminate
- 説明
- 不確定の状態である
E
要素を選択 - レベル
- 4
:indeterminate
擬似クラスは、入力項目が不確定であることを表します。具体的には、複数の選択肢がある項目が何も選択されていない状態、または結果が決まっているプログレスバーが処理の途中である場合に一致します。
このクラスで判別できる要素は、<input type="checkbox">
、<input type="radio">
、<progress>
です。それぞれが選択確定しているかそうでないかのフラグを持ち、:indeterminate
擬似クラスは後者に該当します。
<input type="checkbox">
は、JavaScriptによってindeterminate
プロパティがtrue
に設定されている場合に一致します。<input type="radio">
は、同じname
属性の値を持つグループがひとつも選択されていない場合に一致します。<progress>
は、処理の経過が不明である場合に一致します。max
属性の値に達していなくても、value
属性の値が確定していれば該当しません。
<div class="sample-block">
<span>
<label><input type="checkbox" name="c">選択肢</label>
<label><input type="checkbox" name="c">選択肢</label>
<label><input type="checkbox" name="c">選択肢</label>
</span>
<span>
<label><input type="radio" name="r">選択肢</label>
<label><input type="radio" name="r">選択肢</label>
<label><input type="radio" name="r">選択肢</label>
</span>
<span>
<label id="js_label" for="js_progress">??%</label>
<progress max="100" id="js_progress">0</progress>
<button onclick="getProgress()">進捗確認</button>
</span>
</div>
<script>
const items = document.getElementsByTagName('input');
for (let i = 0; i < items.length; i++) {
items[i].indeterminate = true;
}
function getProgress() {
const elmlabel = document.getElementById('js_label');
const elmProgress = document.getElementById('js_progress');
elmlabel.textContent = '50%';
elmProgress.setAttribute('value', '50');
}
</script>
/* 共通のスタイル */
.sample-block span {
display: flex;
gap: 1rem;
padding-block: 5px;
}
.sample-block input {
margin-inline: 0 5px;
}
.sample-block progress {
inline-size: 100px;
margin-block: auto;
}
/* 入力項目の状態を判別するセレクタ */
label:has(:indeterminate) {
color: red;
}
label:has(~progress:indeterminate) {
color: red;
}
:valid擬似クラス
- 構文
- E:valid
- 説明
- 入力内容の検証を通過した
E
要素を選択 - レベル
- 3-UI/4
:valid
擬似クラスは、入力項目の内容がデータ形式の検証に通過したことを表します。これはフォームを構成する要素がデータを取り扱う際に、与えられた内容が正しいかどうかをブラウザが判別し、問題ない場合に一致します。
例えば、<input>
要素のtype
属性にtext
を指定すると任意の文字を扱えますが、そこに入力必須を示すrequired
属性や最小文字数を指定するminlength
を追加すると、ルールに則った内容でなければ検証を通過しません。:valid
擬似クラスは、そのような状態を判別してユーザーが確認しやすいスタイルを提供する際に役立ちます。
<div class="sample-block">
<p>
<label for="1">お名前</label>
<input type="text" name="name" id="1" placeholder="必須:4文字以上" minlength="4" required>
</p>
<p>
<label for="2">Eメール</label>
<input type="email" name="email" id="2" placeholder="必須:英数字@英数字" required>
</p>
<p>
<label for="3">電話番号</label>
<input type="tel" name="tel" id="3" placeholder="任意:000-0000-0000" pattern="[0-9]{3}-[0-9]{3,4}-[0-9]{4}">
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block label {
flex-basis: 16%;
min-inline-size: 4rem;
max-inline-size: 6rem;
}
.sample-block input {
inline-size: 60%;
border-radius: 3px;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:valid {
border: 2px solid #093;
}
.sample-block input:invalid {
border: 2px solid #f36;
}
.sample-block p:has(input:valid)::after {
content: "✓";
color: #093;
}
.sample-block p:has(input:invalid)::after {
content: "⚠";
color: #f36;
}
:invalid擬似クラス
- 構文
- E:invalid
- 説明
- 検証に失敗した
E
要素を選択 - レベル
- 3-UI/4
:invalid
擬似クラスは、入力項目の内容がデータ形式の検証に失敗したことを表します。これはフォームを構成する要素がデータを取り扱う際に、与えられた内容が正しいかどうかをブラウザが判別し、問題があった場合に一致します。
例えば、<input>
要素のtype
属性にtext
を指定すると任意の文字を扱えますが、そこに入力必須を示すrequired
属性や最小文字数を指定するminlength
を追加すると、ルールに則った内容でなければ検証を通過しません。:invalid
擬似クラスは、そのような状態を判別してユーザーが確認しやすいスタイルを提供する際に役立ちます。
<div class="sample-block">
<p>
<label for="1">お名前</label>
<input type="text" name="name" id="1" placeholder="必須:4文字以上" minlength="4" required>
</p>
<p>
<label for="2">Eメール</label>
<input type="email" name="email" id="2" placeholder="必須:英数字@英数字" required>
</p>
<p>
<label for="3">電話番号</label>
<input type="tel" name="tel" id="3" placeholder="任意:000-0000-0000" pattern="[0-9]{3}-[0-9]{3,4}-[0-9]{4}">
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block label {
flex-basis: 16%;
min-inline-size: 4rem;
max-inline-size: 6rem;
}
.sample-block input {
inline-size: 60%;
border-radius: 3px;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:valid {
border: 2px solid #093;
}
.sample-block input:invalid {
border: 2px solid #f36;
}
.sample-block p:has(input:valid)::after {
content: "✓";
color: #093;
}
.sample-block p:has(input:invalid)::after {
content: "⚠";
color: #f36;
}
:in-range擬似クラス
- 構文
- E:in-range
- 説明
- 制限範囲に収まる値を持つ
E
要素を選択 - レベル
- 3-UI/4
:in-range
擬似クラスは、入力項目の値が最小値から最大値の制限範囲に収まっていることを表します。具体的には、<input>
要素に与えられた現在のvalue
属性の値が、min
およびmax
属性に指定された値の範囲内にある場合に一致します。
このクラスは、取り扱う値に上限と下限が設定されている場合にのみ有効となります。制限の範囲外に一致させたい場合は、:out-of-range
擬似クラスを使用してください。制限が与えられていない要素であれば、現在の値がいかなる内容であっても:in-range
・:out-of-range
のどちらにも一致しません。
<div class="sample-block">
<p>
<input type="number" min="10" max="20" value="15" id="1">
<label for="1">10〜20の数字</label>
</p>
<p>
<input type="time" min="10:00" max="18:00" value="12:00" id="2">
<label for="2">10時から18時の間</label>
</p>
<p>
<input type="date" min="2000-01-01" max="2000-12-31" value="2025-10-10" id="3">
<label for="3">2000年の日付</label>
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block input {
inline-size: 8rem;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:in-range {
background-color: #9fc;
border: 2px solid #063;
}
.sample-block input:out-of-range {
background-color: #fcc;
border: 2px solid #f36;
}
.sample-block p:has(input:in-range)::before {
content: "✓";
color: #093;
}
.sample-block p:has(input:out-of-range)::before {
content: "⚠";
color: #f36;
}
:out-of-range擬似クラス
- 構文
- E:out-of-range
- 説明
- 制限範囲に収まらない値を持つ
E
要素を選択 - レベル
- 3-UI/4
:out-of-range
擬似クラスは、入力項目の値が最小値から最大値の制限範囲に収まっていないことを表します。具体的には、<input>
要素に与えられた現在のvalue
属性の値が、min
およびmax
属性に指定された値の範囲外にある場合に一致します。
このクラスは、取り扱う値に上限と下限が設定されている場合にのみ有効となります。制限の範囲内に一致させたい場合は、:in-range
擬似クラスを使用してください。制限が与えられていない要素であれば、現在の値がいかなる内容であっても:in-range
・:out-of-range
のどちらにも一致しません。
<div class="sample-block">
<p>
<input type="number" min="10" max="20" value="15" id="1">
<label for="1">10〜20の数字</label>
</p>
<p>
<input type="time" min="10:00" max="18:00" value="12:00" id="2">
<label for="2">10時から18時の間</label>
</p>
<p>
<input type="date" min="2000-01-01" max="2000-12-31" value="2025-10-10" id="3">
<label for="3">2000年の日付</label>
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block input {
inline-size: 8rem;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:in-range {
background-color: #9fc;
border: 2px solid #063;
}
.sample-block input:out-of-range {
background-color: #fcc;
border: 2px solid #f36;
}
.sample-block p:has(input:in-range)::before {
content: "✓";
color: #093;
}
.sample-block p:has(input:out-of-range)::before {
content: "⚠";
color: #f36;
}
:required擬似クラス
- 構文
- E:required
- 説明
required
属性を付与されているE
要素を選択- レベル
- 3-UI/4
:required
擬似クラスは、入力項目が必須であることを表します。これはフォーム関連の要素にrequired
属性が付与されており、空の状態では送信できないものに一致します。
このクラスで判別できるのは、<input>
、<select>
、<textarea>
要素です。これらの要素に論理属性であるrequired
が指定されていると、たとえ途中で値に変化があったとしても:required
擬似クラスの選択対象であり続けます。
required
属性が付与されていない任意の項目は、:optional
擬似クラスの対象になります。:required
はあくまで同名の属性が付与されているかどうかを判別するものです。入力値の有無によってスタイルを変更したいのであれば、:valid
および:invalid
擬似クラスを使用してください。
<div class="sample-block">
<p>
<input type="text" placeholder="空でも送信できます" id="1">
<label for="1">required なし</label>
</p>
<p>
<input type="text" placeholder="空では送信できません" id="2" required>
<label for="2">required あり</label>
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block input {
inline-size: 10rem;
border: 2px solid #666;
border-radius: 3px;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:required {
background-color: #fcc;
border-color: #f36;
}
.sample-block p:has(input:optional)::before {
content: "任意";
color: #093;
}
.sample-block p:has(input:required)::before {
content: "必須";
color: #f36;
}
:optional擬似クラス
- 構文
- E:optional
- 説明
required
属性を付与されていないE
要素を選択- レベル
- 3-UI/4
:optional
擬似クラスは、入力項目が任意であることを表します。これはフォーム関連の要素にrequired
属性が付与されておらず、空の状態でも送信でるものに一致します。
このクラスで判別できるのは、<input>
、<select>
、<textarea>
要素です。これらの要素に論理属性であるrequired
が指定されていなければ、たとえ途中で値に変化があったとしても:optional
擬似クラスの対象であり続けます。
required
属性が付与されている必須の項目は、:required
擬似クラスの対象になります。:optional
は空の状態でもフォームの送信を阻害しないオプションの項目を選択します。入力値の有無によってスタイルを変更したいのであれば、:valid
および:invalid
擬似クラスを使用してください。
<div class="sample-block">
<p>
<input type="text" placeholder="空でも送信できます" id="1">
<label for="1">required なし</label>
</p>
<p>
<input type="text" placeholder="空では送信できません" id="2" required>
<label for="2">required あり</label>
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block input {
inline-size: 10rem;
border: 2px solid #666;
border-radius: 3px;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:required {
background-color: #fcc;
border-color: #f36;
}
.sample-block p:has(input:optional)::before {
content: "任意";
color: #093;
}
.sample-block p:has(input:required)::before {
content: "必須";
color: #f36;
}
:user-valid擬似クラス
- 構文
- E:user-valid
- 説明
- 制約検証で有効と判断できた
E
要素を選択 - レベル
- 4
:user-valid
擬似クラスは、ユーザーが操作した後に入力項目の制約検証が行われ、その値が有効であると判断された場合を表します。具体的には、ユーザーがフォームの送信を行おうとしてから実際に送信するまでの間に、:valid
、:in-range
、空の状態を適正な値で埋めた:optional
擬似クラスに一致する要素を選択します。
このクラスを使用すると、<input>
要素で作成した入力項目に対して、あらかじめ設定されているフォーマットに適合する内容を入力したユーザーが、その項目から移動しようとした時に正しいことを告知できます。
以下の例では、文字数制限のされた項目、Eメールアドレスの形式しか受け入れない項目、電話番号の形式しか受け入れない項目を実際に比較できます。誤った内容を入力した場合と正しいフォーマットで入力し直した場合とで、スタイルの変化を確認してみましょう。
<div class="sample-block">
<p>
<label for="1">お名前</label>
<input type="text" name="name" id="1" placeholder="必須:4文字以上" minlength="4" required>
</p>
<p>
<label for="2">Eメール</label>
<input type="email" name="email" id="2" placeholder="必須:英数字@英数字" required>
</p>
<p>
<label for="3">電話番号</label>
<input type="tel" name="tel" id="3" placeholder="任意:000-0000-0000" pattern="[0-9]{3}-[0-9]{3,4}-[0-9]{4}">
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block label {
flex-basis: 16%;
min-inline-size: 4rem;
max-inline-size: 6rem;
}
.sample-block input {
inline-size: 60%;
border-radius: 3px;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:user-valid {
border: 2px solid #093;
}
.sample-block input:user-invalid {
border: 2px solid #f36;
}
.sample-block p:has(input:user-valid)::after {
content: "✓";
color: #093;
}
.sample-block p:has(input:user-invalid)::after {
content: "⚠";
color: #f36;
}
:user-invalid擬似クラス
- 構文
- E:user-invalid
- 説明
- 制約検証で有効と判断できなかった
E
要素を選択 - レベル
- 4
:user-invalid
擬似クラスは、ユーザーが操作した後に入力項目の制約検証が行われ、その値が無効であると判断された場合を表します。具体的には、ユーザーがフォームの送信を行おうとしてから実際に送信するまでの間に、:invalid
、:out-of-range
、空の状態になった:required
擬似クラスに一致する要素を選択します。
このクラスを使用すると、<input>
要素で作成した入力項目に対して、あらかじめ設定されているフォーマットとは違う内容を入力したユーザーが、その項目から移動しようとした時に修正を促すことができます。
以下の例では、文字数制限のされた項目、Eメールアドレスの形式しか受け入れない項目、電話番号の形式しか受け入れない項目を実際に比較できます。誤った内容を入力した場合と正しいフォーマットで入力し直した場合とで、スタイルの変化を確認してみましょう。
<div class="sample-block">
<p>
<label for="1">お名前</label>
<input type="text" name="name" id="1" placeholder="必須:4文字以上" minlength="4" required>
</p>
<p>
<label for="2">Eメール</label>
<input type="email" name="email" id="2" placeholder="必須:英数字@英数字" required>
</p>
<p>
<label for="3">電話番号</label>
<input type="tel" name="tel" id="3" placeholder="任意:000-0000-0000" pattern="[0-9]{3}-[0-9]{3,4}-[0-9]{4}">
</p>
</div>
/* 共通のスタイル */
.sample-block p {
display: flex;
gap: 0.5rem;
padding-block: 5px;
}
.sample-block label {
flex-basis: 16%;
min-inline-size: 4rem;
max-inline-size: 6rem;
}
.sample-block input {
inline-size: 60%;
border-radius: 3px;
}
/* 入力項目の状態を判別するセレクタ */
.sample-block input:user-valid {
border: 2px solid #093;
}
.sample-block input:user-invalid {
border: 2px solid #f36;
}
.sample-block p:has(input:user-valid)::after {
content: "✓";
color: #093;
}
.sample-block p:has(input:user-invalid)::after {
content: "⚠";
color: #f36;
}
:dir擬似クラス
- 構文
- E:dir()
- 説明
- 文字列の書字方向の値に一致した
E
要素を選択 - レベル
- 4
:dir()
擬似クラスは、要素に含まれる文字の書字方向を表します。この機能で選択できるのは、ドキュメントに設定された書字方向です。CSSのプロパティで指定された装飾のための書字方向は対象になりません。
HTMLでは要素を書字方法を言語およびdir
属性で定義します。dir
属性の値はltr
(Left to Right)またはrtl
(Right to Left)の二種類です。日本語や英語で書かれた文書は、左から右へ文字が並ぶため、:dir(ltr)
になります。
dir
属性の値がauto
の場合は、内容に含まれる言語の性質を読み取ったブラウザが自動的に書字方向を決定します。例えば、アラビア語やヘブライ語で構成された文章は右から左へ文字か書かれるため、:dir(rtl)
の対象になります。
:dir()
擬似クラスは、あくまでユーザーエージェントが決定した書字方向の情報を参照します。要素に付与されたdir
属性を直接参照するわけではない点に注意してください。つまり、属性セレクタで[dir="ltr"]
や[dir="rtl"]
と指定した場合とは、根本的に処理の仕方が異なります。
<div class="sample-block">
<p dir="ltr">dir=ltr</p>
<p dir="rtl">dir=rtl</p>
<p lang="ja" dir="auto">日本語</p>
<p lang="ar" dir="auto">الحروف العربية</p>
</div>
/* 共通のスタイル */
.sample-block p {
padding: 0.25rem;
margin-block: 0;
}
/* 書字方向に基づくスタイル */
.sample-block :dir(ltr) {
background-color: #9cf;
}
.sample-block :dir(rtl) {
background-color: #f9c;
}
:lang擬似クラス
- 構文
- E:lang()
- 説明
- 言語情報の値に一致した
E
要素を選択 - レベル
- 2/4
:lang()
擬似クラスは、要素に含まれる文字に使われている言語を表します。コンテンツを構成する言語コードをカッコ()
の中に一つ、またはカンマ(,
)区切りのリストで指定します。
HTMLの言語指定は、lang
属性または<meta>
要素によって定義されます。それに加えて、参照可能であればHTTPヘッダーで得られる情報も組み合わせてユーザーエージェントが判断します。
指定できる値は、IETFで定義された言語コードに従う形式です。日本語であればja
、英語であればen
などの短縮名で表します。それに付随する年代や種別を示すタグも使用できます。
<div class="sample-block">
<p lang="ja">この要素は"lang"属性が指定されています。</p>
<p lang="en">This element has a "lang" attribute specified.</p>
<p lang="pt">Este elemento possui um atributo "lang" especificado.</p>
</div>
/* 共通のスタイル */
.sample-block p {
padding: 0.25rem;
margin-block: 0;
}
/* 言語に基づくスタイル */
.sample-block :lang(ja) {
background-color: #f9c;
}
.sample-block :lang(en) {
background-color: #9cf;
}
.sample-block :lang(pt) {
background-color: #9fc;
}
::backdrop擬似要素
- 構文
- ::backdrop
- 説明
- 全画面モードや最上位のレイヤーに配置された要素の直下に投影される要素
- レベル
- 4
::backdrop
擬似要素は、全画面モードで表示された要素や最上位のレイヤーに配置された要素の直下に投影される要素を表します。この擬似要素に該当する条件は以下の状況で発生します。
- Fullscreen APIの
Element.requestFullscreen()
メソッドを使用して全画面モードに配置された要素 HTMLDialogElement.showModal()
の呼び出しで最上位のレイヤーに配置された<dialog>
要素HTMLElement.showPopover()
の呼び出しで最上位レイヤーに配置されたポップオーバー要素
全画面モードで複数の要素が配置された場合は、それぞれが自身の::backdrop
擬似要素を持ちます。全ての全画面要素は、コンテンツが画面に描画される前に後入れ先出し(LIFO:Last In First Out)で配置される特殊なレイヤーに属します。::backdrop
擬似要素は、要素が最上位レイヤーの一番上に来たときに、その背後に位置するコンテンツを隠したり、ぼかしたり、色を変えたりすることができます。
<div class="sample-block">
<button type="button" onclick="document.getElementById('js_dialog').showModal()">ダイアログを表示</button>
<p>ボタンを押すとモーダルのダイアログが表示されます。ダイアログが表示されている間、背後のコンテンツは操作できなくなります。</p>
<dialog id="js_dialog">
<h3 class="heading">ダイアログの見出し</h3>
<p>ダイアログの内容。</p>
<button type="button" onclick="this.closest('dialog').close();">閉じる</button>
</dialog>
</div>
/* 共通のスタイル */
dialog {
text-align: center;
}
/* 最前面に配置された要素の直下に投影される要素 */
dialog::backdrop {
background-color: rgb(0 0 0 / 0.3);
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
}
::before擬似要素
- 構文
- ::before
- 説明
- 要素の開始直後に装飾的な内容を追加
- レベル
- 3
::before
擬似要素は、指定したセレクタが選択した要素の開始直後に擬似的な要素を生成します。この機能は開始タグと終了タグの範囲に形成されるボックスの内側に要素を追加するため、終了タグを伴わない自己完結型の要素や置換要素には使用できません。
擬似要素の二重コロン::
は擬似クラスと見分けるための記法です。シングルコロンを用いた:before
という書き方は、古いバージョンの名残りです。
CSSの記法では、このセレクタの宣言ブロックにcontent
プロパティを指定して内容を定義します。content
プロパティを書かないと、内容が存在しないとみなされて擬似要素が生成されません。content
プロパティの値が空だったとしても、ボックスは生成されるので、そこに幅や高さを加えれば画面にスタイルを反映させることができます。
::before
で生成される内容は、セレクタで指定された要素の開始タグの直後です。レイアウトの既定値はinline
で、content
プロパティの値が文字として配置されます。ブラウザの開発者ツールでソースコードを開くと、HTMLの中には書かれていない::before
というコンテンツが追加されていることを確認できます。
<div class="sample-block">
<p>段落に記述された内容</p>
</div>
/* 共通のスタイル */
p {
padding: 5px;
background-color: #ccc;
}
/* 擬似要素で生成する内容 */
p::before {
content: "::before";
background-color: #fc6;
}
::after擬似要素
- 構文
- ::after
- 説明
- 要素の終了直前に装飾的な内容を追加
- レベル
- 3
::after
擬似要素は、指定したセレクタが選択した要素の終了直前に擬似的な要素を生成します。この機能は開始タグと終了タグの範囲に形成されるボックスの内側に要素を追加するため、終了タグを伴わない自己完結型の要素や置換要素には使用できません。
擬似要素の二重コロン::
は擬似クラスと見分けるための記法です。シングルコロンを用いた:after
という書き方は、古いバージョンの名残りです。
CSSの記法では、このセレクタの宣言ブロックにcontent
プロパティを指定して内容を定義します。content
プロパティを書かないと、内容が存在しないとみなされて擬似要素が生成されません。content
プロパティの値が空だったとしても、ボックスは生成されるので、そこに幅や高さを加えれば画面にスタイルを反映させることができます。
::after
で生成される内容は、セレクタで指定された要素の終了タグの直前です。レイアウトの既定値はinline
で、content
プロパティの値が文字として配置されます。ブラウザの開発者ツールでソースコードを開くと、HTMLの中には書かれていない::after
というコンテンツが追加されていることを確認できます
<div class="sample-block">
<p>段落に記述された内容</p>
</div>
/* 共通のスタイル */
p {
padding: 5px;
background-color: #ccc;
}
/* 擬似要素で生成する内容 */
p::after {
content: "::after";
background-color: #fc6;
}
::first-letter擬似要素
- 構文
- ::first-letter
- 説明
- 要素に含まれる最初の一文字を表す
- レベル
- 3
::first-letter
擬似要素は、セレクタで指定した要素に含まれる文字の最初の一文字を表します。要素の先頭に文字以外の子要素が配置されている場合は一致しません。
この機能は、主に雑誌や書籍などに見られるドロップキャップという表現を再現する場合に使われます。他にも、要素ではなく文字そのものを選択できるという独自性から、他のセレクタではできない装飾を実現できる可能性があります。
<div class="sample-block">
<p>壱行目の段落に記述された内容です。</p>
<p>弐行目の段落に記述された内容です。</p>
<p>参行目の段落に記述された内容です。</p>
</div>
/* 共通のスタイル */
p {
margin-block: 0.5rem 0;
}
/* 要素の最初の一文字を装飾 */
p::first-letter {
color: #600;
font-size: 1.5rem;
font-weight: bold;
}
::first-line擬似要素
- 構文
- ::first-line
- 説明
- 要素に含まれる最初の一行を表す
- レベル
- 3
::first-line
擬似要素は、セレクタで指定した要素に含まれる文字列の最初の一行を表します。技術的な言葉で言うと、ブロックレベル要素の最初のインライン行に一致します。
インライン行の長さは、要素の寸法、文字の大きさ、文章の長さによって変わります。要素の幅に対して文字が多い場合は、自動的に折り返しが発生します。この時、インライン行はブロック方向に一行足されて二行目が始まるため、そこで::first-line
擬似要素の対象から外れます。
<div class="sample-block">
<p class="is100">ここが要素の先頭です。要素に含まれる文字列はインライン行に並びます。折り返しが発生した場合はインライン行が足されて二行目に移ります。</p>
<p class="is75">ここが要素の先頭です。要素に含まれる文字列はインライン行に並びます。折り返しが発生した場合はインライン行が足されて二行目に移ります。</p>
<p class="is50">ここが要素の先頭です。要素に含まれる文字列はインライン行に並びます。折り返しが発生した場合はインライン行が足されて二行目に移ります。</p>
</div>
/* 共通のスタイル */
.sample-block p {
padding: 0.25rem;
margin-block: 0.5rem 0;
border: 1px solid #999;
font-size: small;
}
.sample-block .is100 {
inline-size: 100%;
}
.sample-block .is75 {
inline-size: 75%;
}
.sample-block .is50 {
inline-size: 50%;
}
/* 要素の一行目を装飾 */
p::first-line {
color: #600;
font-weight: bold;
}
::marker擬似要素
- 構文
- ::marker
- 説明
- リスト項目のマーカーを表す
- レベル
- 4
::marker
擬似要素は、リスト項目の先頭に挿入されるマーカーを表します。マーカーはdisplay
プロパティの値がlist-item
の要素に追加される装飾的な擬似要素です。
既定値では、<li>
や<summary>
要素がマーカーを持ちます。マーカーは種類を変えたり、表示位置を調整したり、非表示にするなどの専用プロパティが用意されていますが、::marker
で指定できるプロパティは限られているため、装飾が反映されない場合は他のセレクタで対応してください。
::marker
擬似要素が対応している主なプロパティは以下の通りです。
color
プロパティcontent
プロパティdirection
プロパティfont
関連のプロパティtext-combine-upright
プロパティunicode-bidi
プロパティwhite-space
プロパティ- ほか、
animation
およびtransition
関連プロパティ
<ol class="sample-list">
<li>リスト項目</li>
<li>リスト項目</li>
<li>リスト項目</li>
</ol>
/* リスト項目のマーカーを装飾 */
.sample-list > li::marker {
color: #999;
font-size: 1.25rem;
font-style: oblique;
font-weight: bold;
}
::placeholder擬似要素
- 構文
- ::placeholder
- 説明
- 入力項目のプレースホルダーを表す
- レベル
- 4
::placeholder
擬似要素は、入力項目のプレースホルダーを表します。プレースホルダーは、フォームを構成する要素の一部である<input>
や<textarea>
で作成されたテキスト入力項目に表示する案内文字です。
プレースホルダーが表示されている状態の入力項目の装飾を行いたい場合は、:placeholder-shown
擬似クラスを使用してください。::placeholder
擬似要素は、あくまで案内文字として表示する内容を装飾するためのものです。そのため、扱えるプロパティはインライン・コンテンツに対応するものに限られます。
background
関連のプロパティcolor
プロパティfont
関連のプロパティ- ほか、文字の装飾、字間・行間の調整プロパティ
<div class="sample-block">
<label>
<input type="text" placeholder="プレースホルダー">
既定値
</label>
<label class="ph">
<input type="text" placeholder="プレースホルダー">
装飾済
</label>
</div>
/* 共通のスタイル */
.sample-block label {
display: flex;
gap: 0.5rem;
padding: 5px;
}
.sample-block input {
inline-size: 10rem;
}
/* プレースホルダー文字の装飾 */
.ph ::placeholder {
color: red;
font-family: serif;
font-style: oblique;
font-weight: bold;
opacity: 0.5;
}
::selection擬似要素
- 構文
- ::selection
- 説明
- ユーザーが選択した範囲の文字を表す
- レベル
- 4
::selection
擬似要素は、ユーザーが選択した範囲の文字を表します。マウスやタッチパッドでテキストをドラッグした際に、選択範囲が分かるように表示される装飾を変更することができます。
::selection
擬似要素で操作できるプロパティは、主にテキスト・コンテンツに関するものです。この機能はユーザーの操作を補助するためにあるので、過剰な装飾は避けて下さい。
background-color
プロパティcolor
プロパティtext-decoration
プロパティtext-shadow
プロパティ
<div class="sample-block">
<p class="normal">::selection なし:文字を範囲選択して装飾を確認。</p>
<p class="custom">::selection あり:文字を範囲選択して装飾を確認。</p>
</div>
/* 選択範囲の文字を装飾 */
.custom::selection {
background-color: #cfc;
text-decoration: underline dashed #063;
}
CSSリファレンス一覧
-
CSSって何?初心者が最初に学ぶべき基礎知識
初めてCSSに触れる方はこちらから読み進めて下さい。CSSの役割やブラウザとの関係など、初心者にも分かりやすいように基礎知識を解説します。
入門編 -
CSSの書き方を詳しく解説!基本的な型とルールを覚えよう
CSSの書き方には一定の法則があるので、慣れてしまえば迷うことはないでしょう。まずは基本的な文法をマスターしましょう。
初級編 -
CSSの特徴をしっかりと把握しよう
CSSにはいくつかの特徴があります。これらを早いうちに理解しておくと、ウェブ制作の作業効率が格段に上がります。
初級編 -
CSSファイルの作り方
CSSファイルは誰でも簡単に作成できます。特別な技術やソフトウェアは必要ありません。
初級編 -
CSSセレクタの一覧表
スタイルの適用対象となる要素を選択するセレクタの一覧表です。詳しい書き方やサンプルコードを掲載しています。
学習編 -
CSSで使える単位の一覧表
プロパティの指定に用いる単位の解説です。CSSで使用できる単位の一覧表を掲載しています。
学習編 -
ボックス・モデルの完全解説
CSSの基礎が固まってきたらボックス・モデルについて学びましょう。これを理解するとCSSの操作が格段にやりやすくなります。
中級編 -
ブロックレベルとインラインレベルを理解する
CSSのブロックレベルとインラインレベルの特性について解説します。これらの扱いはHTMLからボックス・モデルに引き継がれました。
中級編 -
CSSの余白を表すmarginとpaddingを正しく理解する
要素の余白を表すmarginとpaddingについて正しい知識を身に着けましょう。
中級編 -
idとclassを上手く使い分ける
idセレクタとclassセレクタの使い分け方を詳しく解説します。
中級編 -
全称セレクタ(ユニバーサル・セレクタ)の解説
全ての要素のプロパティを一括で操作する全称セレクタについて解説します。
中級編 -
リストのデザインをマスターする
リストのデザインに関するCSSのテクニックを多数紹介します。入れ子、多段式、横並びを全て解決します。
応用編 -
フレックス・ボックスを理解する
横並びのレイアウトやレスポンシブデザインに対応するフレックス・ボックス(Flexible Box)について解説します。
応用編 -
グリッド・レイアウトを理解する
複数の行と列を作成して多次元のレイアウトを行うグリッド・レイアウトについて解説します。
応用編