Seletor de Pai

O seletor de pai, &, é um seletor especial inventado pela Sass que é usado nos seletores encaixados para referir-se ao seletor externo. Ele torna possível reutilizar o seletor externo de maneiras mais complexas, como adicionar uma pseudo-classe ou adicionar um seletor antes do pai.

Quando um seletor de pai é usado num seletor interno, é substituído pelo seletor externo correspondente. Isto acontece no lugar do comportamento de encaixamento normal:

SCSS Syntax

.alert {
  // O seletor de pai pode ser usado para adicionar pseudo-classes ao
  // seletor externo.
  &:hover {
    font-weight: bold;
  }

  // Ele também pode ser usado para estilizar o seletor externo num certo contexto,
  // tal como um corpo definido para usar uma idioma de direita-para-esquerda.
  [dir=rtl] & {
    margin-left: 0;
    margin-right: 10px;
  }

  // Tu podes ainda usá-lo como um argumento para os seletores de pseudo-classe.
  :not(&) {
    opacity: 0.8;
  }
}

Sass Syntax

.alert
  // O seletor de pai pode ser usado para adicionar pseudo-classes ao
  // seletor externo.
  &:hover
    font-weight: bold


  // Ele também pode ser usado para estilizar o seletor externo num certo contexto,
  // tal como um corpo definido para usar uma idioma de direita-para-esquerda.
  [dir=rtl] &
    margin-left: 0
    margin-right: 10px


  // Tu podes ainda usá-lo como um argumento para os seletores de pseudo-classe.
  :not(&)
    opacity: 0.8


CSS Output

.alert:hover {
  font-weight: bold;
}
[dir=rtl] .alert {
  margin-left: 0;
  margin-right: 10px;
}
:not(.alert) {
  opacity: 0.8;
}









⚠️ Atenção!

Uma vez que o seletor de pai poderia ser substituído por um seletor de tipo como h1, apenas é permitido no início de seletores compostos onde um seletor de tipo também seria permitido. Por exemplo, span& não é permitido.

Embora estejamos a examinar desprender esta restrição. Se gostarias de ajudar a fazer isto acontecer, consulte esta questão da GitHub.

Adicionando SufixosAdicionando Sufixos permalink

Tu podes também usar o seletor de pai para adicionar sufixos adicionais ao seletor externo. Isto é particularmente útil quando usas uma metodologia como BEM que usa nomes de classe altamente estruturados. Enquanto o seletor externo termina com um nome alfanumérico (como classe, identificador, e seletores de elemento), podes usar o seletor de pai para anexar texto adicional:

SCSS Syntax

.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 Syntax

.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 Output

.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;
}


Na SassScriptNa SassScript permalink

O seletor de pai também pode ser usado dentro da SassScript. É uma expressão especial que retorna o seletor pai atual no mesmo formato usado pelas funções de seletor: uma lista separada por vírgula (a lista de seletor) que contém listas separadas por espaço (os seletores complexos) que contém sequências de caracteres sem aspas (os seletores compostos):

SCSS Syntax

.main aside:hover,
.sidebar p {
  parent-selector: &;
  // => ((unquote(".main") unquote("aside:hover")),
  //     (unquote(".sidebar") unquote("p")))
}

Sass Syntax

.main aside:hover,
.sidebar p
  parent-selector: &
  // => ((unquote(".main") unquote("aside:hover")),
  //     (unquote(".sidebar") unquote("p")))

CSS Output

.main aside:hover,
.sidebar p {
  parent-selector: .main aside:hover, .sidebar p;
}


Se a expressão & for usada fora de quaisquer regras de estilo, retorna null. Já que null é falso isto significa que podes facilmente usá-lo para determinar se uma mistura está a ser ou não chamada numa regra de estilo:

SCSS Syntax

@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 Syntax

@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 Output

.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);
}



Encaixamento AvançadoEncaixamento Avançado permalink

Tu podes usar & como um expressão de SassScript normal, o que significa que podes passá-lo para funções ou incluí-lo na interpolação — mesmo em outros seletores! Usá-lo em conjunto com funções de seletor e a [regra @at-root] permite-te encaixar seletores de maneiras muito poderosas:

Por exemplo, suponhamos que queres escrever um seletor que combina com o seletor externo e um seletor de elemento. Tu poderias escrever uma mistura como esta que usa a função selector.unify() para combinar & com um seletor do utilizador:

SCSS Syntax

@use "sass:selector";

@mixin unify-parent($child) {
  @at-root #{selector.unify(&, $child)} {
    @content;
  }
}

.wrapper .field {
  @include unify-parent("input") {
    /* ... */
  }
  @include unify-parent("select") {
    /* ... */
  }
}

Sass Syntax

@use "sass:selector"

@mixin unify-parent($child)
  @at-root #{selector.unify(&, $child)}
    @content



.wrapper .field
  @include unify-parent("input")
    /* ... */

  @include unify-parent("select")
    /* ... */


CSS Output

.wrapper input.field {
  /* ... */
}

.wrapper select.field {
  /* ... */
}









⚠️ Atenção!

Quando a Sass está a encaixar seletores, não sabe qual interpolação foi usada para gerá-los. Isto significa que adicionará automaticamente o seletor externo ao seletor interno mesmo se usaste & como uma expressão de SassScript. É por isto que precisas de usar explicitamente a regra @at-root para dizeres a Sass para não incluir o seletor externo.