こんにちは、フロントエンドエンジニアのあおきです。
実務で役立つ Tailwind CSSのテクニック をシリーズ形式で紹介しています。
第2回の今回は、「CSSファイルを開かずに、複雑なセレクタ指定を完結させる裏技」 についてです。
Tailwind CSSを使っていて、「親要素のクラスから、特定の子要素だけにスタイルを当てたい」と思ったことはありませんか?
通常ならCSSファイルに .parent > img { 〇〇 } と書く場面ですが、Tailwindの arbitrary selector(任意セレクタ) を使えば、HTMLのクラス名の中に直接セレクタを書き込めます。
一言でいうと、「CSSファイルを開かずに、複雑なセレクタ指定を完結させる裏技」です。
arbitrary selector の基本:3つのパーツで理解する
書き方は非常にシンプルで、[](ブラケット)の中にセレクタを記述します。
構文: [&セレクタ]:適用したいクラス
これを分解すると、以下の3つの役割に分かれます。
- [](ブラケット): 「ここから先は、Tailwindにない自由な指定を書くよ!」という合図。
- &(アンパサンド): 「このクラスを書いている要素自身」を指します。
- :(コロン): 左側に「条件(セレクタ)」、右側に「実際に当てたいTailwindのクラス」を書きます。
【比較】CSS vs arbitrary selector
「直下のimg要素を角丸にする」という指定で比較してみましょう。
従来のCSS
.parent > img { border-radius: 0.5rem; }
arbitrary selector
<div class="[&>img]:rounded-lg">
<img src="example.jpg" />
</div>
実務で使える!厳選テクニック 5選
「これいつ使うの?」という悩みを解決する、現場で頻出のパターンを紹介します。
① 最初以外に余白を付ける(隣接セレクタ)
悩み:last:mb-0 などを各要素に書くのが面倒。
解決策:[&+*] を使い、2番目以降の要素にだけマージンを付与します。
コード例:<ul class="[&>li+li]:mt-4">...</ul>
② 子要素のリンクをまとめて装飾(子孫セレクタ)
悩み: 範囲内にある全ての <a>タグに同じクラスをコピペしたくない。
解決策: [&_a] で一括指定。(※半角スペースは _ で記述)
コード例: <div class="[&_a]:text-blue-600 [&_a]:underline">...</div>
③ CMS記事スタイル(リッチエディタ対策)
悩み: WordPress等のCMSから出力されるタグに直接クラスを振れない。
解決策:親要素にまとめて記述し、中身の h3 や p を一気に装飾します。
コード例:<div class="[&_h3]:text-2xl [&_h3]:font-bold [&_p]:mb-6">...</div>
④ 直下の子要素だけを操作
悩み:孫要素までスタイルが継承されてレイアウトが崩れるのを防ぎたい。
解決策:[&>*] で直下の子要素のみに限定します。
コード例:<div class="[&>]:border-b [&>]:py-2">...</div>
⑤ カードUI(ホバーで中身を動かす)
悩み: group-hover を使うために、画像やテキストに一つずつクラスを書くのが大変。
解決策: 親のホバー時に連動するセレクタを書きます。
コード例: <div class="[&:hover_img]:scale-110">...</div>
【保存版】よく使う arbitrary selector 一覧
実務で「あれ、どう書くんだっけ?」となったらここを見てください。
| 記法 | CSSの意味 | よく使うシーン | 実際のTailwindクラス例 |
|---|---|---|---|
[&>img] |
& > img |
直下の画像のみサイズ調整 | [&>img]:w-full [&>img]:h-auto [&>img]:object-cover |
[&_a] |
& a |
範囲内のリンク一括装飾 | [&_a]:text-blue-600 [&_a]:underline hover:[&_a]:text-blue-800 |
[&+*] |
& + * |
要素同士の間隔調整 | [&+*]:mt-4 |
[&:nth-child(2)] |
&:nth-child(2) |
2番目の要素だけ色を変える | [&:nth-child(2)]:text-red-500 |
[&:not(:first-child)] |
&:not(:first-child) |
最初以外の要素に枠線を付ける | [&:not(:first-child)]:border-t [&:not(:first-child)]:pt-4 |
[&:before] |
&::before |
アイコンや装飾の追加 | [&:before]:content-[''] [&:before]:inline-block [&:before]:w-2 [&:before]:h-2 [&:before]:bg-black |
[&_h2] |
& h2 |
CMS出力の見出しを一括装飾 | [&_h2]:text-2xl [&_h2]:font-bold [&_h2]:mb-4 |
[&_p] |
& p |
本文段落の余白を統一 | [&_p]:leading-7 [&_p]:mb-6 |
[&>li+li] |
& > li + li |
リスト2件目以降だけ間隔 | [&>li+li]:mt-4 |
[&:hover_img] |
&:hover img |
親ホバー時に画像を拡大 | [&:hover_img]:scale-110 [&_img]:transition [&_img]:duration-300 |
CSS 0行でここまでできる!arbitrary selector ライブプレビュー
「これまでに紹介した5つの挙動を1つのデモにまとめました。右下の『Edit on CodePen』からコードをいじって、数値を変えて試してみてください!」
See the Pen Tailwind CSS 実務テクニック集|arbitrary selector 活用デモ by あおき (@himlinfq-the-encoder) on CodePen.
*使用上の注意点
便利すぎて使いすぎるとHTMLが読みづらくなるので、共通パーツはコンポーネント化するのがコツです
まとめ:なぜこれを使うのか?
最大のメリットは、「スタイルの定義が1箇所で完結する」ことです。
HTMLとCSSファイルを行ったり来たりする必要がなくなり、コンポーネントの修正が劇的に速くなります。「わざわざCSSを書くほどでもないけど、少し特殊な指定がしたい」という時に、ぜひこの強力な武器を活用してみてください。