Herança no Sass
Casos simples
A herança é uma das melhores funcionalidades do Sass. Ela deixa seus estilos muito mais simples de se escrever e
deixa a marcação mais limpa também. Ela é feita usando a diretiva @extend
:
.button {
color: white;
border: 2px solid black;
}
.small-button {
@extend .button;
font-size: 0.7em;
padding: 0.2em;
}
.medium-button {
@extend .button;
font-size: 1em;
padding: 0.4em;
}
.button, .small-button, .medium-button {
color: white;
border: 2px solid black; }
.small-button {
font-size: 0.7em;
padding: 0.2em; }
.medium-button {
font-size: 1em;
padding: 0.4em; }
Observe como o seletor .button
tem suas características herdadas facilmente. Com CSS puro,
geralmente nessa situação o .medium-button
não herda as características do .button
.
Ele só define as suas próprias características. Por isso, um botão médio do HTML precisa usar as duas classes
(.button
e .medium-button
). Usando a herança do Sass, só é preciso colocar a classe
.medium-button
. Isso deixa a marcação mais limpa.
É importante entender que não é a regra que é estendida, mas sim o seletor. Assim, as regras onde o seletor estendido é usado afetam os seletores que o estendem também. Exemplo:
.button {
color: white;
border: 2px solid black;
}
.cta .button {
color: red;
}
.small-button {
@extend .button;
font-size: 0.7em;
padding: 0.2em;
}
.medium-button {
@extend .button;
font-size: 1em;
padding: 0.4em;
}
.button, .small-button, .medium-button {
color: white;
border: 2px solid black; }
.cta .button, .cta .small-button, .cta .medium-button {
color: red; }
.small-button {
font-size: 0.7em;
padding: 0.2em; }
.medium-button {
font-size: 1em;
padding: 0.4em; }
Múltiplas extensões
Também dá pra fazer várias extensões, separando os seletores estendidos por vírgula:
.button {
color: white;
border: 2px solid black;
}
.alert-button {
@extend .button;
color: red;
}
.small-button {
@extend .button;
font-size: 0.7em;
padding: 0.2em;
}
.small-alert-button {
@extend .small-button, .alert-button;
}
.button, .alert-button, .small-alert-button, .small-button {
color: white;
border: 2px solid black; }
.alert-button, .small-alert-button {
color: red; }
.small-button, .small-alert-button {
font-size: 0.7em;
padding: 0.2em; }
Só não dá pra estender combinators (como div > .bar
).
Seletores criados apenas para extensão
Se você cria um seletor que apenas é estendido e nunca é usado diretamente, você pode usar um
placeholder selector. Esse tipo de seletor não é escrito quando está sozinho, porque se supõe
que ele foi feito só para extensão, e não para uso direto. Para criar um, é só seguir a sintaxe
%seletor
. Exemplo:
%error {
font: Arial;
padding: 2em;
}
.user-error {
@extend %error;
color: yellow;
}
.critical-error {
@extend %error;
color: red;
}
.user-error, .critical-error {
font: Arial;
padding: 2em; }
.user-error {
color: yellow; }
.critical-error {
color: red; }
Extensões em diretivas
Extensões em diretivas só podem estender seletores que estão dentro do bloco da diretiva. Exemplo:
@media screen and (min-width: 768px) {
.button {
color: white;
border: 2px solid black;
}
.alert-button {
@extend .button;
color: red;
}
}
@media screen and (min-width: 768px) {
.button, .alert-button {
color: white;
border: 2px solid black; }
.alert-button {
color: red; } }
Se o seletor .button
estivesse fora da diretiva @media
, um erro iria acontecer.