前回の続きです。今回が最終回、擬似要素を中心にまとめています。
擬似要素についてですが、CSS3 では擬似クラスと擬似要素を明確に区別するため、擬似要素に関しては、「:」 を 2回使って、「::」と記述することが定義されています。CSS2 までに準拠してコーディングする場合は従来どおり、「:」 1つの記述方法でも問題ありませんが、将来的にはこの記述方法が基本になる予定ですので、今回は仕様書に合わせて 「::」 と記述しています。
この 「::」 方式の記述ですが、実はモダンブラウザの多くはすでにこの記述方法に対応してたりしますので、今でも使えちゃいます。
擬似要素 (pseudo-element)
E::first-line
E という要素の最初の 1行にのみスタイルを指定します。CSS1 で定義されています。1行目というのがフォントサイズやブラウザのウィンドウサイズ等、色々な条件で変わってきますので、注意が必要です。ちなみにブロック要素に対してのみ有効で、指定できるプロパティにも制限があります。
p {
margin-left:1em;
}
p::first-line {
margin-left:-1em;
}
などとして、例えば注釈などで先頭に 「※」 マークが付いた段落があって、テキストが折り返された時も 「※」 の分だけ 2行目以降は字下げしておきたいなどといった場合にも使用できます。
E::first-letter
E という要素の最初の 1文字にのみスタイルを指定します。CSS1 で定義されています。1文字目が特定の文字 (引用符やカギ括弧など) の場合、次の文字と合わせてスタイルが指定されます。::first-line 擬似要素同様、ブロック要素に対してのみ有効で、指定できるプロパティにも制限があります。
E::selection
ユーザーが選択した文書に対してスタイルを指定します。例えばマウスドラッグ等にとってテキストを選択状態にした際の見た目を変えることができます。CSS3 で定義されました。
p::selection {
background:#f00;
color:#fff;
}
などと指定することができます。
E::before
E::after
E という要素に含まれる内容の前 (::before) 後 (::after) に指定した内容を生成します。content プロパティとの組み合わせでテキストや画像等を追加します。CSS2 で定義されています。
p.note::before {
content:url(image/note-icon.png);
margin:0 2px;
}
li.new::after {
content:"new!";
color:#f00;
}
クラスセレクタ (Class selectors)
E.warning
class 属性の値によってスタイルを指定します。おなじみのセレクタです。CSS1 で定義済み。
ID セレクタ (ID selectors)
E#myid
id 属性の値によってスタイルを指定します。クラスセレクタ同様、おなじみのセレクタです。CSS1 で定義済み。
否定擬似クラス (Negation pseudo-class)
E:not(s)
E という要素のうち、s でないものにスタイルを指定します。CSS3 で定義されました。
input {
vertical-align:middle;
}
input:not([type="text"]) {
vertical-align:top;
}
などとして、type="text" 以外の input 要素にのみ異なるスタイルを指定するなどといった使い方も可能です。
子孫セレクタ (Descendant combinator)
E F
複数のセレクタを組み合わせて使用する方法です。子孫セレクタは、親要素に含まれるすべての子孫要素に対してスタイルを指定します。ユニバーサルセレクタや、属性セレクタなどと組み合わせて使用できます。CSS1 で定義されています。
p span.note {
color:red;
}
ul li * li {
margin-left:2em;
}
子セレクタ (Child combinator)
E > F
子セレクタは、親要素の直接の子要素に対してスタイルを指定します。孫要素以下は対象になりません。CSS2 で定義されています。
隣接セレクタ (Adjacent sibling combinator)
E + F
E という要素から見て直接の弟要素である F という要素にスタイルを指定します。CSS2 で定義されています。
兄弟要素とは、ある親要素内で、同列に存在する要素のうち、前 (兄) 後 (弟) に存在する要素を指します。さらに直接の弟要素とは、E という要素と同列で、Eという要素の直後に隣接して存在する要素を指します。例えば次のような場合、h2 要素は h1 要素の直接の弟要素です。
<h1>title</h1> <h2>sub title</h2>
しかし、下記の場合は、h2 は h1 の直接の弟要素ではありません。
<h1>title</h1> <p>text</p> <h2>sub title</h2>
間接セレクタ (General sibling combinator)
E ~ F
E という要素の後に出現する F という要素にスタイルを指定します。つまり、E という要素の弟要素が対象になります。CSS3 で定義されました。
さて、いかがでしたか。CSS3 では大幅にセレクタの拡張がされているので、ブラウザに実装されれば余計な class 属性や、id 属性を減らせそうで個人的にはとっても期待大です。
ただし、現状では Working Draft なので、ここから変更される可能性はあります。あと、IE での CSS 実装状態を考えると勧告されてもしばらくは歯がゆい思いをすることになりそうですね。
関連エントリー
CSS セレクタに関するおさらい
CSS セレクタに関するおさらい 2
関連リンク
CSS3 Selectors





![[広告] EIZO 地デジ対応ターミナルモニター](http://direct.eizo.co.jp/docs/link/Netmile_080422.gif)
yoshikiさん、こんにちは。
いつも拝見させてもらっています。
記事中、
E::selectionのサンプルコードのセレクタ部分が
p::first-lineになっちゃってます。
報告でした!
wu さんコメントありがとうございます。
ご指摘感謝です。修正しました。
為になる記事をありがとうございます。
ところで::first-lineにmarginって使えませんよね??
ryota さんコメントありがとうございます。
> ところで::first-lineにmarginって使えませんよね??
使えますよ。仕様書に下記のように書いてあります。
http://www.w3.org/TR/CSS2/selector.html#first-line-pseudo
The :first-line pseudo-element is similar to an inline-level element, but with certain restrictions. Only the following properties apply to a :first-line pseudo-element: font properties, color properties, background properties, 'word-spacing', 'letter-spacing', 'text-decoration', 'vertical-align', 'text-transform', 'line-height', 'text-shadow', and 'clear'.
2009年2日9 追記
上記、first-line を first-letter と見間違えて思いっきり嘘書きました。すいません。正しくは下記のコメントの通りです。
あまり英語に強くないのであれですが、
仕様書を読んだところmarginについては
触れられていないように見えるのですが・・。
実際テストしたところ、インライン要素であれば左右のmarginは反映しますが、::first-line(および::first-letter)には反映しませんでした。
これはブラウザの仕様が間違っているんでしょうか・・?
えどさんコメントありがとうございます。
すいません。上のコメントへの私の回答は間違いです。marginプロパティが使用できると明確に仕様書に書かれているのは ::first-letter です。::first-line に関しては、CSS2.1 の仕様書に下記の記述があります。
http://www.w3.org/TR/CSS21/selector.html#first-line-pseudo
The :first-line pseudo-element is similar to an inline-level element, but with certain restrictions. The following properties apply to a :first-line pseudo-element: font properties, color property, background properties, 'word-spacing', 'letter-spacing', 'text-decoration', 'vertical-align', 'text-transform', 'line-height',. UAs may apply other properties as well.
最後の一文、「UAs may apply other properties as well.」がポイントで、「ユーザエージェントによって適用されるプロパティが異なるかも」と書かれています。この部分に関してはかなり自由度が高いので、ブラウザによっては適用されるプロパティに差が出るかもしれませんが、それはブラウザが間違っているとかではないということです。
お返事ありがとうございます。
なるほど、そういうことだったんですね。
ということは、それらのプロパティの挙動をどうするかはブラウザ次第、ってことですね。
ひとつ勉強になりました。
ありがとうございました!
ちなみに色々テストしたところ、::first-letterも、通常ではmarginをサポートしていませんでしたが、floatさせた場合はmarginが適用されるようです。(webkit,firefox)(ドロップキャプス的なことを想定したんでしょうかね?)