Variáveis CSS são entidades definidas por nós desenvolvedores, contendo valores que irão ser utilizados em todo o nosso projeto. Utilizamos o var(<variavel>)
para indicar que estamos chamando uma variável do CSS. Essas variáveis são "vivas", o que significa que ao declará-las no seu código, elas podem ser alteradas no navegador, seja por media queries ou por Javascript.
Elas foram criadas na especificação CSS Custom Properties Lvl1 pra que a gente possa padronizar as características de design do projeto, como cores, espaçamentos e afins.
Um uso comum é declarar as variáveis dentro do :root
, pois na hierarquia de seletores, o escopo dele é mais abrangente do que o do <html>
, sendo o equivalente a declarar variáveis CSS globalmente, mas você pode declarar variáveis dentro de qualquer seletor CSS, ou @media
.
💡 Pra saber mais sobre
:root
leia a documentação sobre pseudo-classes.
Para declarar variáveis CSS basta inicializá-las com dois traços --
.
:root {
--text-primary: red;
}
Pra utilizar a variável, basta usar a função var()
.
section {
background-color: var(--text-primary);
}
É possível também declarar valores padrão pra variáveis, assim caso a variável não exista, ele tem um default.
.element {
width: var(--size, 300px);
/* Na ausência de --size, o valor será 300px */
}
Usar variáveis CSS como parâmetros
Você pode criar classes CSS com variáveis e usá-las passando valores diferentes. Por exemplo, podemos criar uma classe pra ajustar imagens e usar a mesma classe com diferentes tamanhos.
.square-image {
display: block;
max-width: 100%;
width: var(--size, 100px);
height: var(--size, 100px);
object-fit: cover;
}
E usamos a classe da seguinte forma:
<!-- Nessa imagem, width e height são 200px -->
<img src="img1.jpg" class="square-image" style="--size: 200px" />
<!-- Nessa imagem, width e height são 150px -->
<img src="img2.jpg" class="square-image" style="--size: 150px" />
<!-- Nessa imagem, width e height são 150px, o valor padrão -->
<img src="img2.jpg" class="square-image" />
💡 Se você tiver familiaridade com Javascript, pode pensar nessa forma de aplicar variáveis CSS como criar funções de Javascript. O
var(--size, 100px)
pode ser lido comofunction size(size='100px') {}
e ostyle="--size: 200px"
no HTML pode ser lido comosize("200px")
.
Fazer mudanças via media query
Uma coisa muito comum é usar media queries pra mudar o layout do site pra um formato de coluna quando a visualização for de telefone celular (mobile). Uma forma legal de controlar esse fluxo de fileira pra é usando flexbox.
.main-section {
display: flex;
}
@media (max-width: 420px) {
.main-section {
flex-direction: column;
}
}
💡 Leia mais sobre flexbox nessa página aqui!
Com variáveis CSS, podemos ser muito mais breves:
/* Declaramos flex-direction com a variável --dir e o valor padrão de row */
.main-section {
display: flex;
flex-direction: var(--dir, row);
}
/* Na media query, basta atualizar o valor da variável --dir dentro do escopo da classe */
@media (max-width: 420px) {
.main-section {
--dir: column;
}
}
Isso acontece pois classes CSS criam um escopo de atuação para as variáveis. Note no caso do :root
, na hierarquia HTML, o root tem o maior escopo (área de abrangência) de todos:
<!-- :root -->
<html class="color">
<body class="color">
<main class="color">
<h2 class="color"></h2>
<div class="color"></div>
</main>
</body>
</html>
<!-- :root / -->
Então se a gente fizer a seguinte declaração no CSS:
:root {
--color: red;
}
main {
--color: green;
}
div {
--color: purple;
}
.color {
color: var(--color, black);
}
O resultado vai ser:
<!-- :root -->
<html class="color"> <!-- A cor vai ser red (root) -->
<body class="color"> <!-- A cor vai ser red (root) -->
<main class="color"> <!-- A cor vai ser green (main) -->
<h2 class="color"></h2> <!-- A cor vai ser green (main) -->
<div class="color"></div> <!-- A cor vai ser purple (div) -->
</main>
</body>
</html>
<!-- :root / -->
Percebe que usamos a mesma classe, mas conseguimos ter diferentes resultados apenas redefinindo as variáveis? Dessa forma conseguimos um CSS bem mais limpo e consistente.
Variáveis CSS já tem > 96% de cobertura nos navegadores mais populares, além disso tem polyfills (ferramentas que substituem a funcionalidade onde ela não tem suporte) muito bem consolidados na ausência do suporte.
Print do site Caniuse no suporte das variáveis CSS nos navegadores mais populares