1. :not(::first-line)は無効になる
title-listクラスのリスト要素(li)の各一行目を太字にしています。
このCSSセレクタは、
.title-list li::first-line
二行目以降にスタイルを設定したいと思いました。
一見、::first-line 擬似要素を :not() 否定擬似クラスに入れれば、リスト項目の最初の行以外を選択するセレクタになりそうです。
.title-list li:not(::first-line)
しかし、これはうまくいきません。
1-1. 否定擬似クラス:not()のルール
擬似要素である::first-lineは、:not() の引数に指定できません。
これは :not()擬似クラスの仕様によります。
:not() は擬似クラスにのみ適用可能で、擬似要素には使えないからです1。
:not() は CSS の擬似クラスです。
列挙されたセレクターに一致しない要素を表します。
特定の項目が選択されることを防ぐため、否定擬似クラス (negation pseudo-class) と呼ばれています。
:not()
擬似クラスのカッコの中(引数)には、1つまたは複数のセレクターをカンマで区切って入れます。
ただし、は否定セレクターや擬似要素を含めることはできません2。
また、:not() は「Xでない」ものすべてに一致するので、予想外の結果になることが多いので注意が必要です。
特に子孫結合子と使用すると、対象とする要素を選択する経路が複数できるので、意外な動きをするかもしれません。
::first-line 擬似要素は、内容の最初の行にのみ適用されるスタイルを定義するもので、それ以外の行を選択するようなセレクタは現時点のCSSの仕様にはありません。
2. 全体のスタイルとして先に指定する
最初の行以外のスタイルを指定したい場合は、全体のスタイルを指定した上で、::first-line 擬似要素を使って最初の行だけ別のスタイルを指定するのが一般的です。
.title-list li {
/* 全体に適用されるスタイル */
color: black;
}
.title-list li::first-line {
/* 最初の行にのみ適用されるスタイル */
color: red;
}
つまり、最初の行以外のスタイルを指定するには、「最初の行以外」を直接選択するのではなく、全体のスタイルを指定してから、最初の行だけ別のスタイルを上書き適用する方法を使います。
3. 擬似クラスと擬似要素は何が違うの?
擬似クラス(:〜)と擬似要素(::〜)は似ていますが、役割と動作に違いがあります。
簡単に言うと、
- 擬似クラス(:〜)は、既存の要素の状態や関係に基づいてスタイルを適用するのに対し、
- 擬似要素(::〜)は、要素の一部分に対してスタイルを適用したり、装飾的な要素を挿入したりするために使用されます。
擬似クラスと擬似要素は、連結して組み合せることはできます。3。
たとえば、「 <article>
要素内にある最初の <p>
要素の最初の行を選択したい」場合。
article p:first-child::first-line {
font-size: 120%;
font-weight: bold;
}
(補足)
- :not() 擬似クラスは引数として、1つまたは複数のセレクターをカンマで区切ったものを要求します。リストには否定セレクターや擬似要素を含めることはできません。 – :not() – CSS: カスケーディングスタイルシート | MDN
- :not() – CSS: カスケーディングスタイルシート | MDN
- 擬似クラスと擬似要素 – ウェブ開発を学ぶ | MDN