この記事の目次
CSS ::before・::afterの使い方とは
::before と ::after は、選んだ要素の中身の前後に、疑似的な要素を作るためのセレクタです。HTMLを書き換えずに、アイコン、装飾線、必須マークなどを足せます。一方で、疑似クラス(:hover :nth-child() など)は「要素の状態を選ぶ」ものなので、役割が違います。
基本(構文・仕組み)
::beforeは要素の最初の子、::afterは最後の子として生成されます。contentプロパティが必須です。contentが無い、none、normalの場合は生成されません。空にしたいならcontent: "";と書きます。- 初期の
displayはinlineです。大きさを付けたい場合はdisplay: blockやinline-block、position: absoluteを併用します。 - コロン2つ(
::)は疑似要素、1つ(:)は疑似クラス、という区別です。MDN では、古い:beforeの書き方も受け付けられると説明されています。 <img>や<input>のような、中身を持たない置換要素には使えません。
.req::after { content: " *必須"; color: #c00; }
.deco { position: relative; padding-left: 24px; }
.deco::before {
content: "";
position: absolute;
left: 0; top: .35em;
width: 12px; height: 12px;
background: #0a58ca;
border-radius: 50%;
}
サンプルコード(実行結果つき)
<style>
.req::after { content: " *必須"; color: #c00; }
.quote::before { content: "“"; font-size: 2em; color: #888; }
.none::before { content: normal; }
.deco { position: relative; padding-left: 24px; }
.deco::before { content: ""; position: absolute; left: 0; top: .35em; width: 12px; height: 12px; background: #0a58ca; border-radius: 50%; }
li:nth-child(odd) { background: #eef; }
</style>
<label class="req" id="a">お名前</label>
<p class="quote" id="q">引用文</p>
<p class="none" id="n">none</p>
<p class="deco" id="d">装飾つき</p>
<ul><li>1</li><li>2</li><li>3</li></ul>
動作確認(検証環境と結果)
- 環境: Windows 11 / Microsoft Edge 154(Chromium系、headless)/
getComputedStyle(el, '::after') - ファイル:
C:Tempks2techtestst2pseudo.html
| 確認項目 | 結果 |
|---|---|
.req::after の content |
” *必須” |
.quote::before の content |
““” |
content: normal の ::before |
content は none(生成されない) |
.deco::before の display / width |
block(absolute 指定による)/ 12px |
元の <label> の textContent |
「お名前」のまま(疑似要素の文字は DOM に入らない) |
疑似要素の文字は DOM に存在しないため、JavaScript で取得できません。
CSS ::before・::afterの使い方の注意点
- 疑似要素の文字は、コピー・検索・選択が効かないことが多く、スクリーンリーダーの扱いもブラウザや設定で異なります。MDN でも、意味のある内容に使うことは推奨されていません。
- 必須マークなど意味を持つ情報は、HTML側にテキストや
aria-requiredを用意します。 contentに画像を指定する場合、altの代替テキスト指定は対応状況を確認してください。- 親に
overflow: hiddenがあると、はみ出した疑似要素は切れます。
CSS ::before・::afterの使い方でよくあるミス
contentを書き忘れて、表示されない。::beforeに幅・高さを付けても反映されない(inlineのまま)。<img>に::beforeを付ける。- 疑似要素をクリックイベントの対象にしようとする(要素本体のイベントとして扱われます)。
ブラウザ対応・バージョン
::before ::after は、すべての主要ブラウザで長く使える機能です。content の alt 付き構文など、新しい指定は MDN で最新の対応状況を確認してください。
CSS ::before・::afterの使い方のチェックリスト
contentを必ず書いたか(空なら"")。- 装飾目的に限って使っているか。意味のある文字は HTML に書いたか。
- 配置が必要な場合、親に
position: relativeを付けたか。 :hoverなどの疑似クラスと、::beforeの疑似要素を混同していないか。
CSS ::before・::afterの使い方のFAQ(よくある質問)
Q. :before と ::before はどちらを書くべきですか?
A. 現在は ::before が標準です。:before も通常は動きますが、新規では :: を使います。
Q. JavaScript で疑似要素の内容を変えられますか?
A. 直接は操作できません。data-* 属性を content: attr(data-label) で参照する方法がよく使われます。
Q. アイコンフォントの代わりになりますか?
A. 簡単な図形なら可能です。意味のあるアイコンは、SVG と代替テキストを使うほうが安全です。
筆者の見解(CSS ::before・::afterの使い方)
疑似要素は便利な反面、意味を持つ情報を置かないのが基本だと考えます。装飾線、矢印、背景の飾りなど「消えても内容が伝わるもの」に限定すれば、HTMLがすっきりします。テキストを疑似要素に入れる場合は、スクリーンリーダーでの読み上げも一度確認してください。
