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-05
  • Edge

    v120+
    2023-12-07
  • Safari

    v17.2+
    2023-12-11
  • Safari (iOS)

    v17.2+
    2023-12-11
  • Firefox

    v117+
    2023-08-29

機能名やコードで検索できます

例:aspect-ratio、:has()、padding-top

別の言葉や、プロパティ名で試してください

検索を読み込めませんでした