nesting
セレクターの中にセレクターを入れ子で書ける、CSSの記法。 Sassなどで書いてビルドしていた入れ子を、そのままブラウザで使えます。
今の書き方
子孫・状態・メディアクエリのルールを、親のルールの中にまとめて書けます。 ビルドせずに、そのままブラウザで動きます。
.card {
padding: 16px;
.title {
font-size: 1.25rem;
}
&:hover {
background-color: #f5f5f5;
}
@media (min-width: 768px) {
padding: 24px;
}
}以前の書き方
素のCSSでは、ルールごとに親のセレクターを書き直していました。 入れ子で書きたいときは、Sassなどで書いてビルドし、この形のCSSに変換していました。
.card {
padding: 16px;
}
.card .title {
font-size: 1.25rem;
}
.card:hover {
background-color: #f5f5f5;
}
@media (min-width: 768px) {
.card {
padding: 24px;
}
}置き換えるときの注意点
- Sassの
&__titleのように、セレクターをつなげて書くことはできません。 書いたルールは無視されるため、BEMの要素は.card__titleのように完全なセレクターで書きます。 - 入れ子のルールの詳細度は、
:is()と同じく、親のセレクターのうちいちばん高いものになります。 下の例では、.sidebarの中の.linkにも#mainの詳細度が使われ、あとに書いた.nav .linkに勝ちます。 Sassでは.sidebar .linkに展開されるため、.nav .linkが勝っていました。 - 入れ子のルールのあとに書いた宣言が書いた順に効くのは、Chrome 130・Firefox 132・Safari 18.2からです。 それより前のバージョンでは入れ子のルールより前に移されるため、宣言は入れ子のルールより前にまとめて書きます。
&を付けずに型セレクターから書く入れ子(li { }など)は、Chrome 120・Safari 17.2からです。 それより前のバージョンでは、& liと書く必要がありました。- 入れ子のルールが無効でも、無視されるのはそのルールだけで、親の宣言は効きます。
#main,
.sidebar {
& .link {
color: blue;
}
}
.nav .link {
color: red;
}
フォールバック
対象の5ブラウザはすべて対応済みなので、通常はビルドで変換する必要はありません。 対応していないブラウザでは、入れ子のルールがまるごと無視されます。 古いブラウザも支える必要がある場合は、PostCSSなどのビルドツールで、以前の書き方の平らなCSSに変換します。
Browser Support
Chrome
v120+2023-12-05Edge
v120+2023-12-07Safari
v17.2+2023-12-11Safari (iOS)
v17.2+2023-12-11Firefox
v117+2023-08-29