& селектор вложенности
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она доступна во всех браузерах с декабря 2023 года.
Селектор вложенности CSS & явно задаёт связь между родительскими и дочерними правилами при использовании вложенности CSS. Он делает селекторы вложенного дочернего правила относительными к родительскому элементу. Без селектора вложенности & селектор дочернего правила выбирает дочерние элементы. Селекторы дочерних правил имеют такую же специфичность, как если бы они находились внутри :is().
Примечание: Дочернее правило не означает селектор дочернего элемента. Дочернее правило может выбирать родительский элемент или дочерние элементы в зависимости от использования селектора вложенности &.
Если селектор вложенности & не используется во вложенном правиле стиля, он представляет собой корень области видимости.
Синтаксис
/* Nested directly — adds whitespace (descendant) */
parentRule {
& childRule { }
}
/* Attached to parent — no whitespace (e.g., pseudo-class, compound selector) */
parentRule {
&:pseudo-class { }
}
/* Reversed context — & placed after another selector */
parentRule {
otherRule & { }
}
Описание
Селектор вложенности & и пробелы
Рассмотрим следующий код, в котором вложенность используется без селектора вложенности &.
.parent-rule {
/* parent rule properties */
.child-rule {
/* child rule properties */
}
}
При разборе вложенных селекторов браузер автоматически добавляет пробелы между селекторами, создавая новое правило селектора CSS. Следующий код показывает эквивалентные невложенные правила:
.parent-rule {
/* parent rule style properties */
}
.parent-rule .child-rule {
/* style properties for .child-rule descendants for .parent-rule ancestors */
}
Когда вложенное правило нужно присоединить к родительскому правилу без пробела, например при использовании pseudo-class или создании составных селекторов, селектор вложенности & нужно поставить непосредственно перед ним, чтобы добиться желаемого результата.
Рассмотрим пример: мы хотим задать элементу стили, которые применяются постоянно, а также вложить некоторые стили, которые применяются только при наведении. Если не включить селектор вложенности &, будет добавлен пробел, и в итоге получится набор правил, применяющий вложенные стили ко всем элементам-потомкам, на которые наведён указатель, внутри селектора родительского правила. Однако это не то, что нам нужно.
.parent-rule {
/* parent rule properties */
:hover {
/* child rule properties */
}
}
/* the browser parses the above nested rules as shown below */
.parent-rule {
/* parent rule properties */
}
.parent-rule *:hover {
/* child rule properties */
}
Если добавить селектор вложенности & без пробела, элементы, соответствующие родительскому правилу, будут стилизованы при наведении.
.parent-rule {
/* parent rule properties */
&:hover {
/* child rule properties */
}
}
/* the browser parses the above nested rules as shown below */
.parent-rule {
/* parent rule properties */
}
.parent-rule:hover {
/* child rule properties */
}
Добавление селектора вложенности &
Селектор вложенности & также можно добавить в конец, чтобы изменить контекст правил на противоположный.
.card {
/* .card styles */
.featured & {
/* .featured .card styles */
}
}
/* the browser parses above nested rules as */
.card {
/* .card styles */
}
.featured .card {
/* .featured .card styles */
}
Селектор вложенности & можно размещать несколько раз:
.card {
/* .card styles */
.featured & & & {
/* .featured .card .card .card styles */
}
}
/* the browser parses above nested rules as */
.card {
/* .card styles */
}
.featured .card .card .card {
/* .featured .card .card .card styles */
}
Не может представлять псевдоэлементы
Селектор & эквивалентен селектору :is() и имеет то же ограничение: он не может представлять псевдоэлементы.
Например, при использовании следующего правила стиля сгенерированное содержимое не будет стилизовано красным цветом, даже если оно вложено в <div class="important">, поскольку .important :is(.foo::before) не может соответствовать ни одному элементу.
.foo::before {
content: "Hello";
.important & {
color: red;
}
}
Это ограничение также распространяется на вложенные at-правила, свойства которых неявно оборачиваются в селектор &. Например, при использовании следующего правила сгенерированное содержимое не будет стилизовано красным цветом даже на небольшом экране, поскольку свойство color: red неявно оборачивается в селектор &, которым в данном случае является :is(.foo::before).
.foo::before {
content: "Hello";
@media (width < 600px) {
color: red;
}
}
Примеры
Оба следующих примера дают одинаковый результат. В первом используются обычные стили CSS, а во втором — селектор вложенности &.
Использование обычных стилей CSS
В этом примере используются обычные стили CSS.
HTML
<p class="example"> This paragraph <a href="#">contains a link</a>, try hovering or focusing it. </p>
CSS
.example {
font-family: system-ui;
font-size: 1.2rem;
}
.example > a {
color: tomato;
}
.example > a:hover,
.example > a:focus {
color: ivory;
background-color: tomato;
}
Результат
Использование & во вложенных стилях CSS
В этом примере используются вложенные стили CSS.
HTML
<p class="example"> This paragraph <a href="#">contains a link</a>, try hovering or focusing it. </p>
CSS
.example {
font-family: system-ui;
font-size: 1.2rem;
& > a {
color: tomato;
&:hover,
&:focus {
color: ivory;
background-color: tomato;
}
}
}
Результат
Использование & вне вложенного правила
Если & не используется во вложенном правиле стиля, он представляет собой корень области видимости. В этом случае все стили применяются к документу.
<p>Hover over the output box to change document's background color.</p>
& {
color: blue;
font-weight: bold;
}
&:hover {
background-color: wheat;
}
Результат
Спецификации
| Спецификация |
|---|
| Модуль вложенности CSS, уровень 1 # nest-selector |
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
nesting |
120
112–120Не поддерживает вложенные правила, начинающиеся с селектора типа. |
120
112–120Не поддерживает вложенные правила, начинающиеся с селектора типа. |
117 |
106
98–106Не поддерживает вложенные правила, начинающиеся с селектора типа. |
17.2
16.5–17.2Не поддерживает вложенные правила, начинающиеся с селектора типа. |
120
112–120Не поддерживает вложенные правила, начинающиеся с селектора типа. |
117 |
80
75–80Не поддерживает вложенные правила, начинающиеся с селектора типа. |
17.2
16.5–17.2Не поддерживает вложенные правила, начинающиеся с селектора типа. |
25.0
23.0–25.0Не поддерживает вложенные правила, начинающиеся с селектора типа. |
120
112–120Не поддерживает вложенные правила, начинающиеся с селектора типа. |
17.2
16.5–17.2Не поддерживает вложенные правила, начинающиеся с селектора типа. |
at-scope |
143 |
143 |
142 |
127 |
26.2 |
143 |
142 |
94 |
26.2 |
30.0 |
143 |
26.2 |
См. также
- Использование вложенности CSS
- Модуль вложенности CSS
- Модуль селекторов CSS
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Nesting_selector