Ao final desta aula, você será capaz de:
Os pré-processadores CSS são ferramentas que estendem as capacidades do CSS padrão, adicionando funcionalidades como variáveis, funções, mixins e outras características de linguagens de programação que não existem nativamente no CSS. Eles transformam um código com sintaxe estendida em CSS válido que os navegadores podem interpretar.
Os pré-processadores resolvem muitas limitações do CSS tradicional, permitindo:
Com a evolução do CSS (como vimos na aula anterior sobre CSS Moderno), alguns recursos que eram exclusivos dos pré-processadores agora existem nativamente no CSS, como variáveis (Custom Properties). No entanto, pré-processadores ainda oferecem muitos benefícios além do CSS nativo.
Existem vários pré-processadores CSS disponíveis, cada um com sua própria sintaxe e características específicas. Os três mais populares são:
Sass/SCSS | Less | Stylus | |
---|---|---|---|
Criado em | 2006 | 2009 | 2010 |
Linguagem | Ruby (original), Dart/JS (atual) | JavaScript | JavaScript |
Sintaxe | SCSS (.scss) ou Sass indentado (.sass) | Similar ao CSS (.less) | Flexível, opcional pontuação (.styl) |
Popularidade | Muito alta | Alta | Média |
Destaque | Comunidade robusta, muitas bibliotecas | Curva de aprendizado suave | Sintaxe expressiva e concisa |
Nesta aula, focaremos principalmente no Sass/SCSS por sua popularidade e adoção generalizada na indústria, mas também mencionaremos recursos de outros pré-processadores quando relevantes.
O Sass (Syntactically Awesome Style Sheets) é o pré-processador CSS mais maduro, poderoso e estável. Ele está disponível em duas sintaxes:
$primary-color: #6d28d9;
.button {
background-color: $primary-color;
color: white;
&:hover {
background-color: darken($primary-color, 10%);
}
}
$primary-color: #6d28d9
.button
background-color: $primary-color
color: white
&:hover
background-color: darken($primary-color, 10%)
A sintaxe SCSS é mais popular porque:
Nesta aula, usaremos principalmente a sintaxe SCSS por sua maior adoção na indústria.
Antes de mergulhar nos recursos do Sass, é importante saber como configurar um ambiente para trabalhar com pré-processadores:
# Instalar Sass globalmente via npm
npm install -g sass
# Compilar um arquivo SCSS para CSS
sass input.scss output.css
# Observar mudanças e recompilar automaticamente
sass --watch input.scss:output.css
# Compilar um diretório inteiro
sass --watch scss/:css/
Para projetos maiores, geralmente usa-se ferramentas de automação:
// Exemplo de configuração com Webpack
module.exports = {
// ...
module: {
rules: [
{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader'
]
}
]
}
};
Se você está começando, considere usar a extensão Live Sass Compiler no VS Code para facilitar o processo de compilação durante o aprendizado.
As variáveis no Sass começam com o símbolo $ e permitem armazenar valores reutilizáveis.
// Definindo variáveis
$cor-primaria: #6d28d9;
$cor-secundaria: #a78bfa;
$espacamento-base: 16px;
$fonte-principal: 'Roboto', sans-serif;
// Usando variáveis
body {
font-family: $fonte-principal;
color: $cor-primaria;
padding: $espacamento-base;
}
.button {
background-color: $cor-primaria;
padding: $espacamento-base;
margin-bottom: $espacamento-base * 2;
}
O aninhamento permite escrever seletores CSS de maneira mais organizada, refletindo a hierarquia HTML.
nav {
background-color: #333;
ul {
margin: 0;
padding: 0;
list-style: none;
li {
display: inline-block;
a {
color: white;
&:hover {
text-decoration: underline;
}
}
}
}
}
nav {
background-color: #333;
}
nav ul {
margin: 0;
padding: 0;
list-style: none;
}
nav ul li {
display: inline-block;
}
nav ul li a {
color: white;
}
nav ul li a:hover {
text-decoration: underline;
}
Aninhamento excessivo pode criar seletores CSS muito específicos e causar problemas de especificidade. Tente limitar o aninhamento a no máximo 3-4 níveis.
Os mixins são blocos de código reutilizáveis que podem aceitar parâmetros, semelhantes a funções.
// Definindo um mixin
@mixin flex-center($direcao: row) {
display: flex;
justify-content: center;
align-items: center;
flex-direction: $direcao;
}
// Usando o mixin
.card {
@include flex-center(column);
padding: 20px;
background-color: white;
}
// Mixin com argumentos opcionais
@mixin button($bg: #6d28d9, $color: white) {
background-color: $bg;
color: $color;
padding: 0.5em 1em;
border: none;
border-radius: 4px;
}
.primary-button {
@include button;
}
.secondary-button {
@include button(#f3f4f6, #333);
}
A diretiva @extend permite que um seletor herde os estilos de outro seletor.
// Classe base
.message {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
// Classes que herdam da classe base
.success {
@extend .message;
border-color: green;
color: green;
}
.error {
@extend .message;
border-color: red;
color: red;
}
.warning {
@extend .message;
border-color: orange;
color: #856404;
}
Use placeholders (@extend %placeholder) para criar classes de utilitário que não geram CSS por si só, apenas quando estendidas.
// Placeholder
%flex-center {
display: flex;
justify-content: center;
align-items: center;
}
.card {
@extend %flex-center;
}
.modal-content {
@extend %flex-center;
}
Os partials são arquivos SCSS separados que podem ser importados em outros arquivos, ajudando na organização do código.
// _variables.scss (o underscore indica que é um partial)
$cor-primaria: #6d28d9;
$cor-secundaria: #a78bfa;
// _mixins.scss
@mixin flex-center {
display: flex;
justify-content: center;
align-items: center;
}
// main.scss
@import 'variables';
@import 'mixins';
body {
color: $cor-primaria;
}
.container {
@include flex-center;
}
O @import
está sendo substituído pela regra @use
em versões mais recentes do Sass, que oferece melhor encapsulamento de namespace:
// main.scss com @use
@use 'variables' as v;
@use 'mixins' as m;
body {
color: v.$cor-primaria;
}
.container {
@include m.flex-center;
}
O Sass permite criar funções personalizadas para operações complexas.
// Definindo uma função
@function calculate-width($col, $total: 12) {
@return percentage($col / $total);
}
// Usando a função
.col-4 {
width: calculate-width(4); // Retorna 33.33333%
}
.col-6 {
width: calculate-width(6); // Retorna 50%
}
// Funções integradas
.button {
background-color: #6d28d9;
&:hover {
background-color: darken(#6d28d9, 10%); // Escurece a cor
}
&.light {
background-color: lighten(#6d28d9, 20%); // Clareia a cor
}
}
O Sass inclui diretivas de controle de fluxo como @if, @for, @each e @while.
// Condicional @if
@mixin theme($dark-mode: false) {
@if $dark-mode {
background-color: #333;
color: white;
} @else {
background-color: white;
color: #333;
}
}
// Loop @for
@for $i from 1 through 5 {
.mt-#{$i} {
margin-top: $i * 0.25rem;
}
}
// Loop @each
$colors: (
"primary": #6d28d9,
"secondary": #a78bfa,
"success": #059669
);
@each $name, $color in $colors {
.text-#{$name} {
color: $color;
}
.bg-#{$name} {
background-color: $color;
}
}
Os maps no Sass são coleções de pares chave-valor que permitem armazenar e acessar valores relacionados.
// Definindo um map
$breakpoints: (
"small": 576px,
"medium": 768px,
"large": 992px,
"xlarge": 1200px
);
// Acessando valores do map
@mixin respond-to($breakpoint) {
@if map-has-key($breakpoints, $breakpoint) {
@media (min-width: map-get($breakpoints, $breakpoint)) {
@content;
}
} @else {
@warn "Breakpoint '#{$breakpoint}' não encontrado!";
}
}
// Usando o mixin de media query
.container {
width: 100%;
@include respond-to("medium") {
width: 90%;
max-width: 720px;
}
@include respond-to("large") {
max-width: 960px;
}
}
Um dos maiores benefícios dos pré-processadores é a capacidade de estruturar melhor o código CSS. Existem várias metodologias populares:
Organiza o código em 7 pastas diferentes e 1 arquivo principal:
sass/
|
|– abstracts/ # Variáveis, mixins, funções
| |– _variables.scss
| |– _mixins.scss
| |– _functions.scss
|
|– base/ # Estilos base, reset, tipografia
| |– _reset.scss
| |– _typography.scss
|
|– components/ # Componentes reutilizáveis
| |– _buttons.scss
| |– _forms.scss
| |– _cards.scss
|
|– layout/ # Elementos principais do layout
| |– _header.scss
| |– _footer.scss
| |– _navigation.scss
| |– _grid.scss
|
|– pages/ # Estilos específicos de páginas
| |– _home.scss
| |– _about.scss
|
|– themes/ # Variações de tema
| |– _light.scss
| |– _dark.scss
|
|– vendors/ # Bibliotecas externas
| |– _bootstrap.scss
|
`– main.scss # Arquivo principal que importa tudo
Organiza o código por especificidade e alcance crescentes:
Com a evolução do CSS nativo, alguns recursos anteriormente exclusivos dos pré-processadores agora estão disponíveis diretamente no CSS.
Recurso | SCSS | CSS Moderno |
---|---|---|
Variáveis | $cor-primaria: #6d28d9; |
--cor-primaria: #6d28d9; |
Escopo | Escopo léxico | Cascata e herança CSS |
Cálculos | width: $width * 2; |
width: calc(var(--width) * 2); |
Funções | Nativas e personalizadas | Limitadas a nativas |
Nesting | Completo | Limitado (ainda experimental) |
Modularização | @import, @use | @import (limitado) |
Lógica Programática | @if, @for, @each | Não disponível |
Use pré-processadores quando:
Use CSS moderno quando:
Na prática, muitos projetos usam uma abordagem híbrida: pré-processadores para organização e lógica avançada, combinados com recursos modernos de CSS para dinamismo em runtime.
Recursos como mixins e funções reduzem código repetitivo e agilizam o desenvolvimento.
Estrutura modular e variáveis facilitam alterações globais e atualizações.
Possibilidade de dividir o código em múltiplos arquivos menores e mais gerenciáveis.
Variáveis e mixins garantem consistência em toda a aplicação.
Criar componentes e estilos reaproveitáveis através de mixins e extend.
Lógica condicional e funções para casos de uso avançados.
Less é uma alternativa ao Sass que roda em JavaScript e tem uma sintaxe muito próxima ao CSS.
@primary-color: #6d28d9;
.button {
background-color: @primary-color;
&:hover {
background-color: darken(@primary-color, 10%);
}
// Mixins em LESS
.border-radius(4px);
}
// Definindo um mixin
.border-radius(@radius) {
border-radius: @radius;
}
$primary-color: #6d28d9;
.button {
background-color: $primary-color;
&:hover {
background-color: darken($primary-color, 10%);
}
@include border-radius(4px);
}
// Definindo um mixin
@mixin border-radius($radius) {
border-radius: $radius;
}
Stylus é um pré-processador expressivo com sintaxe flexível e minimalista.
primary-color = #6d28d9
.button
background-color primary-color
&:hover
background-color darken(primary-color, 10%)
border-radius(4px)
// Definindo uma função/mixin
border-radius(radius)
border-radius radius
$primary-color: #6d28d9;
.button {
background-color: $primary-color;
&:hover {
background-color: darken($primary-color, 10%);
}
@include border-radius(4px);
}
// Definindo um mixin
@mixin border-radius($radius) {
border-radius: $radius;
}
A escolha entre diferentes pré-processadores muitas vezes depende de preferência pessoal, ecossistema existente do projeto, ou requisitos específicos. Sass/SCSS continua sendo a opção mais comum na indústria.
Muitos frameworks front-end e bibliotecas têm suporte integrado para pré-processadores CSS:
Framework/Ferramenta | Integração |
---|---|
React (Create React App) | Suporte incorporado para Sass (.scss) |
Vue CLI | Configuração durante a criação do projeto para Sass, Less ou Stylus |
Angular | Suporte nativo para Sass em componentes |
Next.js | Suporte para .scss e .sass com mínima configuração |
Bootstrap | Disponível em versão Sass para customização |
Tailwind CSS | Configurável através de PostCSS, compatível com Sass |
npm install sass
import './styles.scss';
Não é necessária nenhuma configuração adicional!
O cenário de estilos no front-end está sempre evoluindo. Algumas tendências atuais e futuras:
Soluções como Styled Components, Emotion e CSS Modules permitem escrever CSS diretamente no JavaScript.
// Exemplo de Styled Components
import styled from 'styled-components';
const Button = styled.button`
background-color: ${props => props.primary ? '#6d28d9' : 'white'};
color: ${props => props.primary ? 'white' : '#6d28d9'};
padding: 0.5em 1em;
border: 2px solid #6d28d9;
border-radius: 4px;
`;
// Uso
Uma ferramenta que transforma CSS com plugins JavaScript, permitindo usar recursos futuros do CSS hoje.
Frameworks como Tailwind CSS que usam classes de utilidade para construir interfaces.
Card Title
Card description here...
À medida que o CSS nativo evolui, incorporando recursos como Container Queries, :has(), e Cascade Layers, a necessidade de algumas funcionalidades dos pré-processadores diminui.
Provavelmente veremos uma abordagem híbrida por um bom tempo: pré-processadores para organização e recursos programáticos, combinados com CSS moderno para dinamismo em runtime e abordagens específicas de frameworks para componentes.
Crie um sistema de cores completo usando SCSS que inclua:
Dica: Use funções como lighten()
, darken()
, mix()
e loops @each
para gerar variações.
Implemente um sistema de grid personalizado usando mixins SCSS que:
Dica: Use @for
para gerar classes de coluna e maps para gerenciar breakpoints.
Crie uma mini-biblioteca de componentes UI usando SCSS que inclua:
Dica: Organize seu código usando a estrutura 7-1 e crie mixins reutilizáveis para padrões comuns.
Crie um sistema de tema completo combinando o melhor do Sass e das variáveis CSS nativas:
Dica: Gere variáveis CSS usando loops Sass e use JavaScript para trocar classes ou atributos data-
que ativam diferentes temas.
Agora que você entende pré-processadores CSS, pode explorar:
Na próxima aula, exploraremos a integração entre CSS e JavaScript, incluindo como manipular estilos dinamicamente e criar animações avançadas!