# SCSS - SASS
Preprocessador de CSS para desenvolvimento mais rápido e organizado.
# Antes de começar
Precisamos entender oque é um Pre-Processador.
Um pre-processador é uma ferramenta que nós permite escrever um determinado pedaço de código que será transpilado para a linguagem base deste pre-processador.
No nosso caso, escreveremos código com a syntax do SCSS ou SASS e será transpilado para CSS no build do código.
# Oque é SCSS e SASS ?
O SCSS é uma extensão do CSS que nos permite escrever código de forma mais organizada e com mais recursos, como por exemplo, variáveis, mixins, funções, etc.
O compilador do SCSS é o mesmo do SASS a única diferença é a syntax, no SCSS usamos a abertura e fechamento de tags e no SASS ordenação do estilo por tabulação.
EXEMPLO:
// SCSS
$color: #f00;
$size: 12px;
.box {
color: $color;
font-size: $size;
}
// SASS
$color: #f00
$size: 12px
.box
color: $color
font-size: $size
# Instalação no seu projeto
pode ser utilizado yarn, npm ou pnpm
yarn add sass-loader sass --save-dev
Agora em qualquer arquivo .vue
que você queira utilizar o SCSS ou SASS basta adicionar o atributo lang="sass"
no tag <style>
.
<template>
<div class="box">
<h1>SCSS</h1>
</div>
</template>
<style lang="sass">
$color: #f00;
$size: 12px;
.box {
color: $color;
font-size: $size;
}
</style>
# Conceitos básicos
Pelo SCSS ser um pre-processador de CSS, ele nos permite utilizar recursos do CSS e também recursos do SASS. Dessa maneira você consegue fazer migrações de projeto que hoje utilizam CSS para SCSS sem precisar reescrever todo o código.
A diferença primordial entre essas tecnologias é que o SCSS permite a criação de variáveis, mixins, funções, nesting e etc. enquanto o CSS não. Dito isto, vamos destrinchar um pouco mais sobre cada um desses recursos.
# Variáveis
Variáveis são uma forma de armazenar valores que podem ser reutilizados em diferentes partes do código. No SCSS, as variáveis são declaradas com o símbolo $
e podem ser utilizadas em qualquer lugar do código.
Diferente do CSS puro, o SCSS permite a criação de variáveis globais, que podem ser utilizadas em qualquer lugar do código. Para isso, basta declarar a variável fora de qualquer bloco de código.
Vamos entender primeiro como fária isso no CSS puro:
Variáveis Globais
:root {
--color: #f00;
--size: 12px;
}
/* Agora é possível utilizar em qualquer arquivo da aplicação */
Variáveis Locais
.box {
--color: #f00;
--size: 12px;
color: var(--color);
font-size: var(--size);
}
/* Agora é possível utilizar apenas dentro do bloco .box */
Já no SCSS, vamos utilizar bastante o conceito de módulos de estilo.
Onde cada arquivo .vue
ou .scss
é um módulo de estilo e não é possível e será injetado como dependência em outros arquivos.
Modulo de variáveis (Varáveis globais)
// variables.scss
$color: #f00;
$size: 12px;
Nosso componente
// box.scss
@import './variables.scss';
.box {
color: $color;
font-size: $size;
}
.panel {
background-color: $color;
margin: $size;
}
Modulo do Componente (Variáveis locais)
Vamos supor que utilizaremos cores diferentes nesse contexto das que existem no nosso módulo de variáveis.
// box.scss
@import './variables.scss';
$background: #f00; // Como foi dito lá em cima utilizaremos ``$`` para declarar variáveis.
$spacing: 5.2rem;
.box {
color: $color;
font-size: $size;
}
.panel {
background-color: $background;
margin: $spacing;
}
# Mixins
Mixins são uma forma de reutilizar blocos de código. No SCSS, os mixins são declarados com o símbolo @mixin
e podem ser utilizados com o símbolo @include
.
Vamos supor que em diversos componentes você possui a mesma lógica de estilo, por exemplo, um bloco de código que define a cor e o tamanho da fonte.
// box.scss
.box {
color: #f00;
font-size: 12px;
}
// panel.scss
.panel {
color: #f00;
font-size: 12px;
}
// card.scss
.card {
color: #f00;
font-size: 12px;
}
Em vez de repetir esse bloco de código em todos os componentes, você pode criar um mixin para reutilizar esse código, dessa forma não haverá a necessidade de reescrever o mesmo código em vários lugares e sim injetar a dependência do mixin.
Modulo responsável por criar o mixin
// mixins.scss
@mixin default-color-and-font-size {
color: #f00;
font-size: 12px;
}
Nossos componentes
// box.scss
@import './mixins.scss';
.box {
@include default-color-and-font-size;
}
// panel.scss
@import './mixins.scss';
.panel {
@include default-color-and-font-size;
}
// card.scss
@import './mixins.scss';
.card {
@include default-color-and-font-size;
}
Dessa maneira você consegue reutilizar blocos de código em vários lugares do seu projeto e como a lógica está centralizada em um único lugar, você consegue alterar o código em apenas um lugar e não em vários.
# Funções
Funções são uma forma de reutilizar blocos de código que recebem parâmetros. No SCSS, as funções são declaradas com o símbolo @function
e podem ser utilizadas com o símbolo @return
.
O SCSS nos permite criar funções e estruturas complexas utilizando blocos condicionais e afins, esse tipo de feature é utilizada para criação de helpers de estilos.
Vamos supor que você precise criar uma função que recebe um valor em pixels e retorna o mesmo valor em rems.
// functions.scss
@function px-to-rem($px) {
@return $px / 16px * 1rem;
}
Nosso componente
// box.scss
@import './functions.scss';
.box {
font-size: px-to-rem(12px);
}
Interessante, não é mesmo? Agora você pode reutilizar essa função em vários lugares do seu projeto.
Agora utilizando blocos condicionais e afins, vamos supor que você precise criar uma função que recebe um valor em pixels e retorna o mesmo valor em rems, porém, se o valor for menor que 16px, o valor retornado será 1rem.
// functions.scss
@function px-to-rem($px) {
@if $px < 16px {
@return 1rem;
} @else {
@return $px / 16px * 1rem;
}
}
Nosso componente
// card.scss
@import './functions.scss';
.footer {
font-size: px-to-rem(20px); // 1.25rem
}
.card {
font-size: px-to-rem(12px); // 1rem
}
# Nesting
O nesting é uma forma de aninhar seletores. No SCSS, o nesting é declarado com o símbolo &
.
Vamos supor que você precise criar um componente que possui um título e um conteúdo.
// box.scss
.box {
&__title {
font-size: 12px;
}
&__content {
font-size: 10px;
}
}
Nosso componente
<div class="box">
<h1 class="box__title">Título</h1>
<p class="box__content">Conteúdo</p>
</div>
Dessa maneira você deixa o seu código mais organizado e legível, além de não precisar repetir o nome do componente em todos os seletores.
# Nesting com variáveis
O nesting também pode ser utilizado com variáveis.
Vamos supor que você precise criar um componente que possui um título e um conteúdo, porém, o tamanho da fonte do título e do conteúdo é dinâmico.
// box.scss
$font-size: 12px;
.box {
&__title {
font-size: $font-size;
}
&__content {
font-size: $font-size - 2px;
}
}
Agora você pode alterar o valor da variável $font-size
e o tamanho da fonte do título e do conteúdo será alterado.
Além disso também é possível se utilizar nesting em seletores "fantasmas" chamado de placeholder selectors. Vamos falar deles na próxima seção.
// box.scss
%fonts {
&-title {
font-size: 12px;
}
&-content {
font-size: 10px;
}
}
.box {
&__title {
font-size: @extend %fonts-title;
}
&__content {
font-size: @extend %fonts-content;
}
}