CSSセレクタの一覧表:スタイルを適用する要素を選択するセレクタの種類と書き方

CSSセレクタ早見表と個別の解説

CSSで使えるセレクタの一覧表です。本項目で使用しているEという言葉は参照される要素(Element)を表します。Fはそれに付随する要素です。foovarは名称や値を示す変数となります。各セレクタの具体的な書き方は、それぞれの解説およびサンプルコードを参照してください。

要素指定セレクタ

構文 名称 説明
* ユニバーサルセレクタ 全ての要素を選択
E(要素名) タイプセレクタ Eという名称の要素を選択

結合子・コンビネーター

構文 名称 説明
E, F セレクタ・リスト E要素とF要素を選択
E F 子孫結合子 E要素の子孫であるF要素を選択
E > F 子結合子 E要素の子であるF要素を選択
E + F 次接兄弟結合子 E要素の直後にある同一階層のF要素を選択
E ~ F 後続兄弟結合子 E要素の後に配置された同一階層のF要素を選択
F || E カラム結合子 F列に所属するE要素を選択

名前指定セレクタ

構文 名称 説明
.class クラスセレクタ class属性の値に一致する要素を選択
#id IDセレクタ id属性の値に一致する要素を選択

属性セレクタ

構文 名称 説明
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要素を選択

擬似クラス・書字言語

構文 名称 説明
E:dir() :dir擬似クラス 文字列の書字方向の値に一致したE要素を選択
E:lang() :lang擬似クラス 言語情報の値に一致した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要素を親に持つitemIDのセレクタという意味になります。


<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 {}
構文
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: ;
	}
}
構文
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擬似要素が対応している主なプロパティは以下の通りです。


<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擬似要素で操作できるプロパティは、主にテキスト・コンテンツに関するものです。この機能はユーザーの操作を補助するためにあるので、過剰な装飾は避けて下さい。


<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リファレンス一覧