Селектор родителя
Селектор родителя, &, — это специальный селектор, изобретённый Sass, который используется в вложенных селекторах для ссылки на внешний селектор. Он позволяет повторно использовать внешний селектор более сложными способами, например, добавляя псевдокласс или добавляя селектор перед родителем.
Когда селектор родителя используется во внутреннем селекторе, он заменяется соответствующим внешним селектором. Это происходит вместо обычного поведения вложенности.
.alert {
// The parent selector can be used to add pseudo-classes to the outer
// selector.
&:hover {
font-weight: bold;
}
// It can also be used to style the outer selector in a certain context, such
// as a body set to use a right-to-left language.
[dir=rtl] & {
margin-left: 0;
margin-right: 10px;
}
// You can even use it as an argument to pseudo-class selectors.
:not(&) {
opacity: 0.8;
}
}// SASS
.alert
// The parent selector can be used to add pseudo-classes to the outer
// selector.
&:hover
font-weight: bold
// It can also be used to style the outer selector in a certain context, such
// as a body set to use a right-to-left language.
[dir=rtl] &
margin-left: 0
margin-right: 10px
// You can even use it as an argument to pseudo-class selectors.
:not(&)
opacity: 0.8/* CSS */
.alert:hover {
font-weight: bold;
}
[dir=rtl] .alert {
margin-left: 0;
margin-right: 10px;
}
:not(.alert) {
opacity: 0.8;
}Поскольку селектор родителя может быть заменён селектором типа, таким как h1, он разрешается только в начале составных селекторов, где также разрешается селектор типа. Например, span& не разрешается.
В настоящее время рассматривается возможность ослабления этого ограничения. Если вы хотите помочь в этом, ознакомьтесь с этой проблемой на GitHub.
Добавление суффиксов
Вы также можете использовать селектор родителя для добавления дополнительных суффиксов к внешнему селектору. Это особенно полезно при использовании методологии, такой как BEM, которая использует структурированные имена классов. До тех пор, пока внешний селектор заканчивается буквенно-цифровым именем (например, классом, ID и селекторами элементов), вы можете использовать селектор родителя для добавления дополнительного текста.
.accordion {
max-width: 600px;
margin: 4rem auto;
width: 90%;
font-family: "Raleway", sans-serif;
background: #f4f4f4;
&__copy {
display: none;
padding: 1rem 1.5rem 2rem 1.5rem;
color: gray;
line-height: 1.6;
font-size: 14px;
font-weight: 500;
&--open {
display: block;
}
}
}// SASS
.accordion
max-width: 600px
margin: 4rem auto
width: 90%
font-family: "Raleway", sans-serif
background: #f4f4f4
&__copy
display: none
padding: 1rem 1.5rem 2rem 1.5rem
color: gray
line-height: 1.6
font-size: 14px
font-weight: 500
&--open
display: block/* CSS */
.accordion {
max-width: 600px;
margin: 4rem auto;
width: 90%;
font-family: "Raleway", sans-serif;
background: #f4f4f4;
}
.accordion__copy {
display: none;
padding: 1rem 1.5rem 2rem 1.5rem;
color: gray;
line-height: 1.6;
font-size: 14px;
font-weight: 500;
}
.accordion__copy--open {
display: block;
}В SassScript
Селектор родителя также можно использовать в SassScript. Это специальное выражение, которое возвращает текущий селектор родителя в том же формате, что и в функциях селектора: список, разделённый запятыми (список селекторов), содержащий список, разделённый пробелами (сложные селекторы), содержащие необработанные строки (составные селекторы).
.main aside:hover,
.sidebar p {
parent-selector: &;
// => ((unquote(".main") unquote("aside:hover")),
// (unquote(".sidebar") unquote("p")))
}// SASS
.main aside:hover,
.sidebar p
parent-selector: &
// => ((unquote(".main") unquote("aside:hover")),
// (unquote(".sidebar") unquote("p")))/* CSS */
.main aside:hover,
.sidebar p {
parent-selector: .main aside:hover, .sidebar p;
}Если выражение & используется вне каких-либо правил стиля, оно возвращает null. Поскольку null является ложным, это означает, что вы можете легко использовать его для определения того, вызывается ли миксин в правиле стиля или нет.
@mixin app-background($color) {
#{if(&, '&.app-background', '.app-background')} {
background-color: $color;
color: rgba(#fff, 0.75);
}
}
@include app-background(#036);
.sidebar {
@include app-background(#c6538c);
}// SASS
@mixin app-background($color)
#{if(&, '&.app-background', '.app-background')}
background-color: $color
color: rgba(#fff, 0.75)
@include app-background(#036)
.sidebar
@include app-background(#c6538c)/* CSS */
.app-background {
background-color: #036;
color: rgba(255, 255, 255, 0.75);
}
.sidebar.app-background {
background-color: #c6538c;
color: rgba(255, 255, 255, 0.75);
}Расширенная вложенность
Вы можете использовать & как обычное выражение SassScript, что означает, что вы можете передать его в функции или включить в интерполяцию — даже в другие селекторы! Использование его в сочетании с функциями селектора и @at-root правилом позволяет вам встраивать селекторы очень мощными способами.
Например, предположим, что вы хотите написать селектор, который соответствует внешнему селектору и селектору элемента. Вы можете написать миксин, подобный этому, который использует selector.unify() функцию для объединения & с селектором пользователя.
@use "sass:selector";
@mixin unify-parent($child) {
@at-root #{selector.unify(&, $child)} {
@content;
}
}
.wrapper .field {
@include unify-parent("input") {
/* ... */
}
@include unify-parent("select") {
/* ... */
}
}// SASS
@use "sass:selector"
@mixin unify-parent($child)
@at-root #{selector.unify(&, $child)}
@content
.wrapper .field
@include unify-parent("input")
/* ... */
@include unify-parent("select")
/* ... *//* CSS */
.wrapper input.field {
/* ... */
}
.wrapper select.field {
/* ... */
}Когда Sass вкладывает селекторы, он не знает, какая интерполяция была использована для их создания. Это означает, что он будет автоматически добавлять внешний селектор к внутреннему селектору даже если вы использовали & как выражение SassScript. Именно поэтому необходимо явно использовать @at-root правило, чтобы сказать Sass, что он не должен включать внешний селектор.
© 2006–2025 the Sass team, and numerous contributors
Licensed under the MIT License.
https://sass-lang.com/documentation/style-rules/parent-selector