A CSS feature that lets you show small decorations like text or icons in front of an element without adding extra HTML.
HTMLを書き足さずに、テキストやアイコンなどの小さな飾りを要素の「手前」に表示してデザインを整えるためのCSSのしくみ。
ざっくり言うと:
「HTMLを増やさずに、要素の“手前”にちょっとした飾りや文字をくっつけるための仕組み」
だと思ってください。
こういう「ちょっとした装飾」を、HTMLタグを追加せずに CSS だけで足せるのが ::before です。
::before は「擬似要素(pseudo-element)」と呼ばれるもののひとつです。
content プロパティで指定するという性質を持っています。
コードの見た目としては:
CSS
.selector::before {
content: "表示したい文字";
}
のように書きます。
一番シンプルな使い方の例です。
HTML
<h2 class="title">Notice</h2>
CSS
.title::before {
content: "★";
margin-right: 0.5em;
}
これだけで、見た目はこんなイメージになります:
Notice
ポイントはこの3つです。
class="title").title::before { ... } と書く(セレクタ+::before)content に表示したいテキストを入れる(空だと何も出ない)よくあるパターンをざっと挙げると:
✓ を付ける→ やアイコンを足す* を出す“」マークを置く、吹き出しの三角形を描くこういった「見た目の装飾」にすごく向いているのが ::before です。
よく使う形はこの3つです。
CSS
p::before { ... }
.title::before { ... }
ul li::before { ... }
要素名::before<p> に).クラス名::before親 子::before::before は、基本的に content を指定しないと何も表示されません。
CSS
/* これは何も見えない */
.title::before {
/* content がない */
width: 8px;
height: 8px;
background: red;
}
「四角を出したいのに出ない…」
→ 大体 content: ""; を忘れています。
なにかしらを表示したいときは、最低限こう書いておくのが安全です。
CSS
.title::before {
content: "";
}
::before は、元の要素の 表示形式 (display) に影響されます。
display: inline; の場合display: block; の場合装飾として四角や線を描きたいときは、display を明示的に変えることが多いです。
CSS
.title::before {
content: "";
display: inline-block;
width: 8px;
height: 8px;
background: #333;
margin-right: 0.5em;
}
HTML
<ul class="checklist">
<li>メールを送信する</li>
<li>ファイルをアップロードする</li>
<li>バックアップを取る</li>
</ul>
CSS
.checklist {
list-style: none;
padding-left: 0;
}
.checklist li::before {
content: "✓";
margin-right: 0.5em;
}
リストマーカーの代わりに、自分でマークを出したいときの定番パターンです。
HTML
<a href="#" class="btn-next">Next</p>
CSS
.btn-next {
display: inline-block;
padding: 0.5em 1em;
border-radius: 4px;
background: #007acc;
color: #fff;
text-decoration: none;
cursor: pointer;
}
.btn-next::before {
content: "▶";
margin-right: 0.5em;
}
Next
ボタンの名前を変えずに、視線を誘導したいときに便利です。
HTML
<h2 class="section-title">Latest Articles</h2>
CSS
.section-title {
position: relative;
padding-left: 0.8em;
}
.section-title::before {
content: "";
position: absolute;
left: 0;
top: 0.2em;
bottom: 0.2em;
width: 3px;
background: #ff5722;
}
Latest Articles
ここでは、::before を 縦線の装飾 として使っています。
content: ""; … 中身のない擬似要素を出すための最低限の指定position: absolute; で見出しの中に固定top と bottom で縦方向の長さをコントロールHTML
<label class="required">メールアドレス</label>
CSS
.required::before {
content: "*";
color: red;
margin-right: 0.25em;
}
※ アクセシビリティの観点からは、「必須です」という情報は HTML や ARIA でもちゃんと伝える必要があります。
よく一緒に出てくるので、まとめてイメージしておくと理解しやすいです。
::before::afterHTML
<p class="sample">Text</p>
CSS
.sample::before {
content: "[";
}
.sample::after {
content: "]";
}
Text
「前につけたいか」「後ろにつけたいか」で使い分けるだけなので、深く悩まなくて大丈夫です。
一番ありがちなのはこれです。
width, height, background を一生懸命設定しているのに表示されないcontent を書いていない「四角や線だけ出したい場合」でも content: ""; は必要です。
困ったら content があるかどうか を真っ先にチェックしてください。
::before は DOM 上の本物の要素ではありません。
querySelector などで直接取得できない<before>…</before> のようなタグが出来るわけではないあくまで「見た目用の追加パーツ」として考えるとスッキリします。
スクリーンリーダーなどの支援技術は、
content を読み上げるなど、挙動がバラバラなことがあります。
そのため、
::before で「重要」など意味のあるテキストを足す)といった 意味の必須な情報 を ::before に入れるのはおすすめしません。
「見た目の飾り・補助のマークに留める」のが基本ルールだと思っておくと安全です。
::before を position: absolute で大きく広げて使うと、元の要素の上にかぶさってしまうことがあります。
::before が乗る::before を使う基本的に ::before は、
z-index: -1 と position の指定で、少し下に送るという意識で使うと事故が減ります。
content には url(...) も指定できます。
CSS
.icon-link::before {
content: url("icon.svg");
margin-right: 0.5em;
}
ただし、レスポンシブ対応や高解像度(Retina)対応を考えると、
background-image を使ってサイズを制御するmask や SVG などを使って色を変えられるようにするといった別の手段を選んだほうが柔軟なことも多いです。
ここからは、少し踏み込んだ使い方です。
counter-increment と counter() を使えば、::before で自動番号を振れます。
HTML
<ol class="steps">
<li>アカウントを作成</li>
<li>メールを確認</li>
<li>プロフィールを設定</li>
</ol>
CSS
.steps {
counter-reset: step;
list-style: none;
padding-left: 0;
}
.steps li {
counter-increment: step;
}
.steps li::before {
content: counter(step) ". ";
font-weight: bold;
}
表示イメージ:
HTML 側には番号を書かなくていいので、順番を入れ替えても自動で番号が振り直されます。
カードや画像の上に、半透明のオーバーレイを ::before で追加するパターンです。
HTML
<div class="card">
<img src="photo.jpg" width="300" alt="">
<p>Text Text</p>
</div>
CSS
.card {
position: relative;
overflow: hidden;
}
.card::before {
content: "";
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.4);
}
Text Text
ここでのポイント:
inset: 0; は top: 0; right: 0; bottom: 0; left: 0; のショートハンドoverflow: hidden; で親からはみ出さないようにするホバー時だけ出すこともできます。
CSS
.card::before {
opacity: 0;
transition: opacity 0.3s;
}
.card:hover::before {
opacity: 1;
}
Text Text
色やテキストをカスタムプロパティで切り替えると、テーマ変更などがやりやすくなります。
HTML
<h2 class="tag-title" style="--tag-label: 'NEW';">記事タイトル</h2>
CSS
.tag-title {
position: relative;
padding-left: 4em;
}
.tag-title::before {
content: var(--tag-label);
position: absolute;
left: 0;
top: 0;
padding: 0.1em 0.6em;
border-radius: 999px;
background: #ff4081;
color: #fff;
font-size: 0.75em;
}
記事タイトル
style 属性の --tag-label を変えれば、「HOT」「PR」など簡単に切り替えられます。
::before にアニメーションをかけると、装飾だけ動かすこともできます。
HTML
<p class="underline-title">見出しテキスト</p>
CSS
.underline-title {
position: relative;
display: inline-block;
}
.underline-title::before {
content: "";
position: absolute;
left: 0;
bottom: -0.2em;
width: 100%;
height: 2px;
background: #2196f3;
transform: scaleX(0);
transform-origin: left;
transition: transform 0.3s;
}
.underline-title:hover::before {
transform: scaleX(1);
}
見出しテキスト
文字はそのまま、下線だけがスッと伸びるような動きを簡単に作れます。
Flex 要素に ::before を足すときは、レイアウトに数えられるかどうか を意識します。
HTML
<div class="item">
テキスト
</div>
CSS
.item {
display: flex;
align-items: center;
}
.item::before {
content: "";
width: 8px;
height: 8px;
border-radius: 50%;
background: #333;
margin-right: 0.5em;
}
この場合、::before も flex アイテムのひとつとして扱われ、きれいに縦位置が揃います。
Grid のセルごとにマークをつけたい場合も ::before は有効ですが、
::before で足すというふうに、役割を分けると考えやすいです。
最後に、要点だけをギュッとまとめます。
::before は「要素の中身の前にくっつく見た目用の箱」content はほぼ必須(四角だけでも content: ""; を忘れない)イメージとしては、
「見た目だけの“前置きパーツ”を CSS でこっそり生やす」
くらいに覚えておくと、実務でもかなり使いどころが見えてきます。