Dando poderes ao CSS com SASS parte 01

CSS3

Pois é, se você leu o título e achou estranho fique tranquilo, a ideia é transformar nosso CSS em um super herói com super poderes:

CSS with superpowers

Como podem ver, esse é o slogan que o próprio SASS usa, "CSS com super poderes".

O que é SASS?

SASS é uma linguagem de extensão para o CSS, com ela conseguimos escrever códigos que não seriam possíveis apenas com CSS puro, por isso, eles costumam chamar esses recursos (features) ou extensões adicional de "super poderes".

A ideia do post não é focar muito em "o que é" e sim "o que faz", portanto, caso deseja saber mais informações sobre o SASS, sugiro acessar a página oficial.

Instalando o SASS

Para não extender mais o post não irei abordar a forma de instalar o SASS em sua máquina, pois, a mesma pode ser feita de diferentes formas baseando-se no sistema operacional a ser utilizado.

Para realizar a instalação do SASS, leia a documentação e escolha de acordo com seu sistema operacional, acredito que o processo não deve ser complicado, basta seguir as instruções.

Escrevendo nosso primeiro código

Para escrever códigos utilizando a linguagem (vou chamar de linguagem por questões de facilidade) SASS devemos criar arquivos com duas extensões diferentes, sendo elas: .sass ou .scss, agora, com toda certeza do mundo você deve estar se perguntando:

Porque duas extensões diferentes? Qual a diferença entre elas? Qual eu devo utilizar?

Gif caveira pensativa

Entendendo a diferença de extensões

Basicamente a única diferença entre as extensões .sass e .scss é referente a sintaxe, os arquivos .scss são bem parecidos com os .css, com chaves e pontos e virgulas, porém, os arquivos .sass não utilizam chaves ou pontos e virgulas, veja um exemplo:

Abaixo um exemplo de um arquivo utilizando a sintaxe do .sass:

.botao
    background: #00FF99
    border: 1px solid #DCDCDC
    border-radius: 5px
    color: #FDFDFD
    padding: .5rem 1.2rem

Agora um arquivo utilizando a sintaxe do .scss:

.botao {
    background: #00FF99;
    border: 1px solid #DCDCDC;
    border-radius: 5px;
    color: #FDFDFD;
    padding: 0.5rem 1.2rem;
}

Essa é a diferença entre ambos, o modo de escrever, um parece bastante com o CSS normal, enquanto o outro fica um pouco mais diferente, porém, ambos podem utilizar todo o poder que o SASS tem a nos oferecer.

Para continuar o exemplo do post vou abordar a sintaxe do .sass.

Executando o SASS

Para executar o SASS devemos acessar o terminal (mac ou linux) ou cmd (windows), o mesmo pode ser executado de duas maneiras diferentes:

Compilando

Apenas para compilar um arquivo em SASS podemos utilizar sass ARQUIVO.[sass ou scss], seguido por dois pontos (:) e pelo nome do arquivo de saída, assim o mesmo será compilado para um ou mais arquivos .css.

sass ARQUIVO.[sass ou scss]:Nome_do_arquivo.css

Compilando e observando

O exemplo anterior apenas compila e finaliza, para continuar escutando modificações nos arquivos devemos passar o parâmetro --watch, ficando da seguinte maneira:

sass ARQUIVO.[sass ou scss]:Nome_do_arquivo.css --watch

Compilando em arquivo mínificado

Podemos também já pedir para o SASS gerar um arquivo .css mínificado:

sass ARQUIVO.[sass ou scss]:Nome_do_arquivo.css --watch --style compressed

Conhecendo os poderes do SASS

Agora vamos começar a ver os poderes que o SASS introduz a linguagem CSS, vou mostrá-los de forma separada, sendo assim, ao término do post você deve ser capaz de mesclá-los e formar seus arquivos.

Variáveis

Um dos grandes poderes do SASS é a utilização de variáveis (eu sei que hoje em dia podemos utilizar tal recurso apenas com CSS puro):

$cor: #FDFDFD

.botao
    background: #00FF99
    border: 1px solid #DCDCDC
    border-radius: 5px
    color: $cor
    padding: .5rem 1.2rem

Vejam que devemos seguir a seguinte sintaxe:

Criando a variável

Para criar a variável devemos utilizar o cifrão ou dolar ($) seguido pelo seu nome, dois pontos (:) e seu valor:

$NOME_VARIAVEL: VALOR

Lendo variável

Para ler o valor armazenado em uma variável, precisamos apenas informar o seu nome seguido pelo cifrão ou dolar ($):

$NOME_VARIAVEL

Obs: Uma observação sobre as variáveis é que elas possuem escopo, portanto:

Código válido:

$cor: #FDFDFD

.botao
    background: #00FF99
    border: 1px solid #DCDCDC
    border-radius: 5px
    color: $cor
    padding: .5rem 1.2rem

Código inválido:

.botao
    $cor: #FDFDFD
    background: #00FF99
    border: 1px solid #DCDCDC
    border-radius: 5px
    color: $cor
    padding: .5rem 1.2rem

.outro-botao
    color: $cor

A variável cor existe apenas no escopo do .botao.

Nested Rules

Tenho toda certeza do mundo que você já viu, leu ou escreveu um código CSS parecido com:

.menu {
    align-items: center;
    display: flex;
}
.menu__list {
    display: inline-block;
}
.menu__item {
    margin-right: .5rem;
}
.menu__link {
    display: block;
}

Veja o tanto de repetições da classe .menu, será que não existe algo menos verboso? Pois dessa maneira, se um dia precisarmos mudar o nome da classe de nosso menu, deveremos procurar onde estamos à informando e substituí-la pelo seu novo valor.

Pensando nisso o pessoal do SASS criou o Nested Rules, poderíamos substituir o código anterior por:

.menu
    align-items: center
    display: flex
    &__list
            display: inline-block
    &__item
            margin-right: .5rem
    &__link
            display: block

Como pode ver, declaramos a classe pai apenas uma vez, nesse caso a nossa classe .menu, depois utilizamos o & para informar filhos de .menu, repare que os filhos devem ser informados seguindo a indentação do código, ou seja, deve ser informado dentro de .menu.

O Nested Rule também pode ser utilizado com pseudo classes (pseudo-class) ou pseudo elementos (pseudo-elements):

.menu__link {
    display: block;
}
.menu__link:hover {
    color: #00CC99;
}

Poderíamos facilmente trocar por:

.menu
    &__link
            display: block
    &:hover
            color: #00CC99

Ainda teríamos o mesmo resultado.

Nested Properties

No exemplo anterior aprendemos a declarar elementos pais e filhos, mas, também podemos seguir a mesma ideia com atríbutos:

.botao {
    font-family: Arial;
    font-size: 1.2rem;
    font-weight: bold;
}

Aqui, veja novamente o quanto esse código pode ser melhorado, estamos repetindo muitas vezes a palavra font-, será que não podemos fazer da mesma maneira, ou seja, definir um pai e informar os filhos? Sim, isso é chamado de Nested Properties:

.botao
    font:
        family: Arial
        size: 1.2rem
        weight: bold

Ambos os códigos possuem o mesmo resultado visual.

Herdando atributos

Se você conhece linguagens orientadas á objetos, com certeza já deve ter ouvido falar em herança, pois é, com SASS também podemos fazer uso de tal recurso (poder), imagine que temos o esqueleto de um botão seguido por seus estilos:

.botao {
    border: 1px solid transparent;
    border-radius: 5px;
    display: inline-block;
    font-size: .9rem;
    padding: .5rem .75rem;
}
.botao--verde {
    background: #00FF00;
    border-color: #00FF00;
}
.botao--vermelho {
    background: #FF0000;
    border-color: #FF0000;
}

Esse código irá funcionar sem problemas, porém em nosso HTML será necessário informar duas vezes as classes do botão, uma para o esqueleto e outra para o estilo, conhecido como CSS Orientado à Objetos

<button class="botao botao--verde">Verde</button>
<button class="botao botao--vermelho">Vermelho</button>

Com o SASS podemos facilmente diminuir o código à seguir:

$vermelho: #FF0000
$verde: #00FF00

.botao
    border: 1px solid transparent
    border-radius: 5px
    display: inline-block
    font-size: .9rem
    padding: .5rem .75rem
    &--vermelho
            @extend .botao
            background: $vermelho
            border-color: $vermelho
    &--verde
            @extend .botao
            background: $verde
            border-color: $verde

Veja que estamos utilizando @extend, assim, dizemos para ele herdar todos os atributos de uma determinada classe, em nosso caso, estamos herdando de .botao.

Agora em nosso HTML, precisamos adicionar apenas uma classe referente aos nossos botões, pois a mesma já possuí todos os atríbutos da herdada:

<button class="botao--verde">Verde</button>
<button class="botao--vermelho">Vermelho</button>

Importando arquivos

Se você já fez algum site ou práticou um pouco de HTML e CSS, já deve ser deparado com a seguinte situação:

<link href="arquivo1.css" rel="stylesheet" type="text/css" />
<link href="arquivo2.css" rel="stylesheet" type="text/css" />
<link href="arquivo3.css" rel="stylesheet" type="text/css" />

Estamos tendo múltiplos arquivos importados em nosso HTML, com SASS poderíamos possuir os imports em um único arquivo:

@import arquivo1
@import arquivo2
@import arquivo3

Veja que não informamos a extensão .sass nos imports, porque a extensão é opcional, o próprio SASS sabe que deve importar um arquivo com extensão .sass ou .scss.

Para o post não ficar muito extenso vou parar por aqui, nos próximos posts irei abordando mais poderes do SASS.

Caso queira treinar ou praticar a sintaxe do SASS, existe um editor e compilador online chamado SassMeister.

E você, já conhecia o SASS? Não deixe de comentar.

Matheus Castiglioni

Matheus Castiglioni

Apaixonado pelo mundo dos códigos e um eterno estudante, gosto de aprender e saber um pouco de tudo, aquela curiosidade de saber como tudo funciona, tento compartilhar o máximo de conhecimentos adquiridos e ajudar todos aqueles que sou capaz.