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

⚠️ 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;
    }
  }
}

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")))
}

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

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") {
    /* ... */
  }
}

⚠️ 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.