擬似要素とは、要素の一部に適用できるセレクタです。
| 要素 | 適用箇所 | 実装 |
|---|---|---|
| :first-letter | 要素の1文字目 | CSS 1 |
| :first-line | 要素の1行目 | CSS 2 |
| :before | 要素の前 | CSS 2 |
| :after | 要素の後 | CSS 2 |
| :selection | ユーザーによって選択された部分 | |
| :backdrop | [実験的] |
selector::pseudo-element {
property: value;
}
Syntax - Pseudo-elements - CSS | MDN
CSS2ではpseudo-elementの前のコロンが1つですが、CSS3からはコロンが2つとなっています。これは擬似クラスと区別するための記述法ですが、たいていのブラウザはいずれにも対応しています。Notes - Pseudo-elements - CSS | MDN
:first-letterでは要素の1文字目、:first-lineでは1行目にだけスタイルを適用できます。
1行目
2行目
p:first-letter {
font-size: 2em;
}
p:first-line {
color: red;
}
:beforeと:afterは置換要素 (Replaced element)、つまりimgやinputなどのCSSの範囲外で描画される要素に対しては機能しません。置換要素 - CSS | MDN
よって次のように、img要素の前後に内容を追加するような処理はできません。CSS :after not adding content to certain elements - Stack Overflow
img:after {
content: attr(alt);
}
:beforeや:afterと組み合わせることで、指定要素の前後に特定の内容を追加できます。Internet Explorerは、8以降でこの属性に対応します。ブラウザ実装状況 - content - CSS | MDN
#foo:before {
content: '(';
}
#foo:after {
content: ')';
}
属性値には下記の値を指定できます。
content: none; content: normal; content: 'string'; /* テキスト */ content: url(uri); /* 外部リソースのURI */ content: counter(name); /* カウンター */ content: attr(); content: open-quote; content: close-quote; content: no-open-quote; content: no-close-quote;Syntax - content - CSS | MDN
シングルクォートまたはダブルクォートで囲むことで、文字を挿入できます。文字は直接記述するか、CSSの構文に従いUTF-16の16進で記述します。<string> - CSS | MDN
#foo:before {
content: 'あ';
}
#foo:after {
content: '\3042'; /* UTF-16 */
}
| コード | 表示例 |
|---|---|
content: 'あいう'; |
|
content: '\3042\3044\3046'; |
文字をUnicodeで指定できることから、改行文字 (Line Feed) を挿入することで改行させられます。css3 - How to insert a line break before an element using CSS - Stack Overflow
:after {
content: '\A';
}
または、
:after {
content: '\A';
white-space: pre;
}
画像などの外部リソースを挿入できます。
#foo:before {
content: url('sample.png');
}
リソースの大きさによっては、挿入する前後の要素と位置が合わないことがあります。そのような場合にはvertical-alignで垂直位置を明示し、Internet ExplorerやChromeでもそれが適用されるようにdisplayも指定します。
#foo:before {
content: url('sample.png');
vertical-align: middle;
display: inline-block;
}
Vertically aligning CSS :before and :after content - Stack Overflow
数値を順番に挿入できます。Using CSS counters - CSS | MDN
使用する数値はcounter-resetで初期化し、counter-incrementで増加または減少させます。
body {
counter-reset: counter1;
}
div:before {
counter-increment: counter1;
content: counter(counter1) '.';
}
たとえば、
<div>A</div> <div>B</div> <div>C</div>
に適用すると、
となります。
content属性で挿入する値を、その要素の属性から指定できます。
#foo:after {
content: attr(title);
color: red;
}
<div id="foo" title="これ">title属性の値を、指定要素の後に表示する。</div>
content属性で追加するテキストにもスタイルを設定できます。
<span style="color: red">color</span> <span style="text-decoration: underline">text-decoration</span>
span:before {
content: '■';
color: blue;
text-decoration: none;
}
ただしtext-decorationは例外で、下線を設定することはできても解除することはできません。
display:inline-blockとすることで下線を解除する方法もありますが、これもIEでは機能しません。css - “text-decoration” and the “:after” pseudo-element, revisited - Stack Overflow
span:before {
content: '■';
display: inline-block;
}