O & do Sass
O & é um recurso extremamente útil no Sass (e Less). É usado para aninhar . Pode ser uma boa economia de tempo quando você sabe como usá-lo, ou um pouco de perda de tempo quando você está lutando e poderia ter escrito o mesmo código em CSS normal.
Vamos ver se podemos realmente entendê-lo.
Aninhamento básico
Isso compila para:
Você pode aninhar o quanto quiser, mas é uma boa prática mantê-lo apenas um nível ou dois para evitar seletores excessivamente específicos (que são menos úteis e mais difíceis de substituir).
Adicionando outra classe
O & vem a calhar quando você está aninhando e quer criar um seletor mais específico, como um elemento que tem *ambas* duas classes, assim:
Você pode fazer isso durante o aninhamento usando o &.
O & sempre se refere ao seletor pai ao aninhar. Pense no & como sendo removido e substituído pelo seletor pai. Assim:
O momento “ah”!
Pegue este Sass:
Na verdade, isso pode ser considerado uma abreviação para aninhar com o &:
Então, esses dois exemplos compilam para a mesma coisa:
O exemplo com o & não é nada diferente do exemplo sem o &. Aninhar sem o & é uma abreviação de aninhar com ele. Podemos pensar no & como um mecanismo que nos permite colocar o seletor pai onde precisarmos dele em nosso seletor filho. Permite-nos aninhar com alterações. Vejamos mais alguns exemplos.
Usando o & com pseudo classes
Você pode escrever pseudo classes em uma classe de maneira muito menos repetitiva com o &:
Isso compila para:
O & neste caso nos permite posicionar .button diretamente ao lado de pseudo classes sem repetição no código de autoria. Se deixarmos de fora o & deste exemplo, o aninhamento básico colocaria um espaço entre eles assim…
… o que não é o mesmo.
Usando o & com >, + e ~
Usar o & com o combinador filho > , o combinador irmão adjacente + e o combinador irmão geral ~ é muito fácil. No começo eu pensei que você tinha que usar o &, mas:
Deixar os &'s fora do seletor funciona aqui:
Ambos os exemplos compilam neste CSS:
Qualificação com base no contexto
Seletores aninhados não precisam necessariamente começar com o e comercial. Você pode qualificar um seletor colocando o & à direita.
Estamos reposicionando o seletor pai exatamente onde precisamos. Isso é realmente útil para qualificar um seletor com base em um pai diferente. Isso irá compilar para:
Ou seja, selecione a classe button apenas quando filho de body com uma classe page-about.
Ajustando a definição de &
Pense no & como não apenas sendo substituído pelo seletor pai, mas como sendo substituído pelo seletor pai *compilado*.
Isso é importante ao aninhar mais de dois níveis de profundidade, onde mais de um nível tem um arquivo &. Estes próximos dois exemplos malucos levam esse ponto para casa.
Exemplo maluco, mas funcional #1
Não escreva seletores assim:
Para cada um &, ele será substituído pelo seletor pai compilado. Portanto, toda vez que houver um &, inseriremos .parent .child. Aqui está o CSS compilado:
Exemplo maluco, mas funcional #2
Para compilar mentalmente este CSS, comece na camada superior e vá descendo, destacando as camadas externas e substituindo o & pelo novo seletor pai compilado.
Aqui está compilado:
O que & não é
Descobri que de vez em quando estava usando o & para algo que não era. O & não permite que você percorra seletivamente sua árvore de seletores aninhados para um determinado local e use apenas uma pequena parte do seletor pai compilado que você deseja usar. Eu queria fazer algo assim antes:
Minha intenção era que o & só fosse substituído .parent na esperança de compilar para isso:
Mas isso não funciona.
O & é sempre o seletor pai totalmente compilado.
@at-root para o resgate
Vale a pena mencionar que @at-root permite que você saia de sua estrutura de aninhamento inteiramente para a “raiz” de sua árvore de aninhamento.
Nós nos teletransportamos para fora da árvore de aninhamento para este CSS compilado:
Isso é legal. De uma perspectiva organizacional, todo o código ainda está agrupado, o que pode ser observado como um benefício não reconhecido do aninhamento. @at-rootpo de ajudar a manter os níveis de especificidade baixos porque você não tem mais o seletor pai compilado para aumentar a especificidade. Ao mesmo tempo, mantendo seu código conceitualmente organizado com aninhamento:
CSS compilado:
Existem alguns outros casos de uso para o & que pode ser divertido.
Duplicando a especificidade
Às vezes você precisa derrubar a especificidade de uma biblioteca CSS de terceiros para se apropriar do estilo:
É muito menos avassalador do que usar e ID, estilo inline ou !important e pode ter benefícios sobre a qualificação do seletor com um elemento pai arbitrário. O nível de especificidade não é aumentado com base no contexto de um seletor, mas apenas por si mesmo. Com o & você pode fazer a mesma coisa assim.
Os colchetes de interpolação #{ } são necessários, pois dois e comerciais se tocam são Sass inválidos.
Modificando o e comercial
Mesmo que você não possa ter dois E comercial tocando sem os colchetes de interpolação — como demonstramos anteriormente em nosso exemplo de pseudoclasse — você pode fazer com que outro seletor toque o e comercial. Tocar no e comercial funciona bem com classes modificadoras.
CSS compilado:
Isso pode ser bastante útil se empregar uma metodologia de nomenclatura (ou seja, BEM) que usa classes combinadas de traço e sublinhado em vez de seletores combinados.
Conclusão
O e comercial combinado com aninhamento é um ótimo recurso. Uma vez que você saiba o que está fazendo, criar seu Sass pode se tornar mais fácil, rápido e menos propenso a erros.
Aqui estão alguns outros artigos especificamente sobre o e comercial, para seu prazer de referência:
- Referenciando seletores pai usando o caractere e comercial de
Adam Stacoviak - Sass Snippets: The Almighty Ampersand por Una Kravets
- The e comercial & a killer Sass recurso de Joel Oliveira