Spec-Zone.ru › Sass

Родительский селектор

Родительский селектор, &, — это специальный селектор, созданный в 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;
}

Вне вложенных правил

Совместимость:
Dart Sass
с версии 1.100.0
LibSass
✗
Ruby Sass
✗

Как и в обычном CSS, родительский селектор можно использовать и вне вложенного правила. В этом случае он выводится как обычный CSS для обработки браузером, который интерпретирует его как корень области действия.

Нельзя добавлять суффикс к родительским селекторам, которые не вложены, поскольку нет селектора, к которому можно было бы применить суффикс.

& {
  background-color: blue;
}
// SASS
&
  background-color: blue
/* CSS */
& {
  background-color: blue;
}

В 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(sass(&): '&.app-background'; else: '.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(sass(&): '&.app-background'; else: '.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API