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.