Categorias
Projetos
CSS

Variáveis CSS são melhores que loops de Sass?

Variáveis CSS são melhores que loops de Sass?

Variáveis CSS não necessariamente são melhores que loops de Sass. Mas, para ajudar o entendimento de cada um, veja um exemplo prático usando as 2 tecnologias para atingir o mesmo objetivo visual usando CSS.

Ao projetar componentes, geralmente precisamos usar a mesma estrutura de um componente, mas alteramos o plano de fundo ou a cor do texto com base em um tema ou algo assim.

Por exemplo, em um alerta, podemos precisar de um estilo de aviso, um estilo de erro e um estilo de sucesso — cada um deles pode ser um pouco diferente, desse jeito:

Existem algumas maneiras de resolver isso usando CSS, mas, se você quisesse resolver isso há alguns anos, talvez a melhor (e única) indicação teria sido Sass maps.

Uma possibilidade teria sido, primeiro, começar com os estilos de alerta básicos e, depois, criar um mapa que conteria todos os dados:

$alertStyles: (
error: (
theme: #fff5f5,
icon: 'error.svg',
darkTheme: #f78b8b
),
success: (
theme: #f0f9ef,
icon: 'success.svg',
darkTheme: #7ebb7a
),
warning: (
theme: #fff9f0,
icon: 'warning.svg',
darkTheme: #ffc848
)
);

Então, seria possível percorrer esses dados para alterar os principais estilos de alerta, assim:

@each $state, $property in $alertStyles {
$theme: map-get($property, theme);
$darkTheme: map-get($property, darkTheme);
$icon: map-get($property, icon);
.alert-#{$state} {
background-color: $theme;
border-color: $darkTheme;
&:before {
background-color: $darkTheme;
background-image: url($icon);
}
.alert-title {
color: $darkTheme;
}
}
}

Um pouquinho complicado, certo? Isso produziria classes como .alert-error.alert-success e .alert-warning, cada um dos quais teria um monte de CSS dentro deles que substitui os estilos de alerta padrão.

O que produziria algo parecido com:

Contudo, o uso de Sass maps e o looping de todos esses dados pode se tornar pesado e extraordinariamente difícil de ler.

Como seria possível manter o código fácil e legível? Bem, CSS Custom Properties, talvez mais conhecidas como Variáveis CSS , torna esses tipos de loops muito mais fáceis de ler e, consequentemente, mais fáceis de editar e refatorar no futuro.

Vamos pegar o exemplo acima e refatorá-lo para que ele use CSS Custom Properties.

Primeiro, definir os estilos principais para o componente .alert:

À medida em que são criados esses estilos-base, é possível configurar variáveis na classe .alert:

.alert {
--theme: #ccc;
--darkTheme: #777;
--icon: '';
background: var(--theme);
border: 1px solid var(--darkTheme);
/* outros estilos vêm aqui */
&:before {
background-image: var(--icon);
}
}

É possível fazer muito mais com variáveis CSS do que mudar uma interface para um tema escuro.

A partir daí, é possível estilizar cada classe personalizada .alert como .alert-warning sobrescrevendo essas propriedades em .alert:

.alert-success {
--theme: #f0f9ef;
--darkTheme: #7ebb7a;
--icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/success.svg);
}
.alert-error {
--theme: #fff5f5;
--darkTheme: #f78b8b;
--icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/error.svg);
}
.alert-warning {
--theme: #fff9f0;
--darkTheme: #ffc848;
--icon: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/warning.svg);
}

E é isso! Obtém-se exatamente a mesma interface visual que a feita com um loop Sass: