@mixin e @include

As misturas permitem-te definir estilos que podem ser reutilizados ao longo da tua folha de estilo. Elas tornam fácil evitar o uso de classes que são semânticas como .float-left, e distribuir coleções dos estilos nas bibliotecas.

As misturas são definidas usando a regra de arroba @mixin, que é escrita com @mixin <name> { ... } ou @mixin name(<arguments...>) { ... }. Um nome de mistura pode ser qualquer identificador de Sass, e pode conter qualquer declaração exceto declarações de alto nível. Elas podem ser usada para encapsular os estilos que podem ser reduzidos numa única regra de estilo; elas podem conter regras de estilo de si mesmas que podem ser encaixadas em outras regras de estilos ou incluídas no alto nível da folha de estilo; ou podem apenas servir para modificar variáveis.

As misturas são incluídas no contexto atual usando a regra de arroba @include, que é escrita com @include <name> ou @include <name>(<arguments...>), com o nome da mistura sendo incluído:

SCSS Syntax

@mixin reset-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

@mixin horizontal-list {
  @include reset-list;

  li {
    display: inline-block;
    margin: {
      left: -2px;
      right: 2em;
    }
  }
}

nav ul {
  @include horizontal-list;
}

Sass Syntax

@mixin reset-list
  margin: 0
  padding: 0
  list-style: none


@mixin horizontal-list
  @include reset-list

  li
    display: inline-block
    margin:
      left: -2px
      right: 2em




nav ul
  @include horizontal-list

CSS Output

nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
}
nav ul li {
  display: inline-block;
  margin-left: -2px;
  margin-right: 2em;
}











💡 Fato Divertido:

Os nomes de mistura, tal como todos os identificadores de Sass, tratam hiféns e sublinhados da mesma maneira. Isto significa que reset-list e reset_list ambas fazem referência à mesma mistura. Isto é um atraso histórico desde os primeiros dias da Sass, quando apenas permitia sublinhados como nomes de identificador. Uma vez que a Sass adicionou suporte para hífenes para corresponder a sintaxe da CSS, os dois foram tornados equivalentes para tornar a migração mais fácil.

ArgumentosArgumentos permalink

As misturas também podem receber argumentos, o que permite que o seu comportamento seja personalizado cada vez que forem chamadas. Os argumentos são especificados na regra @mixin depois do nome da mistura, como uma lista de nomes de variáveis envolvidos por parênteses. A mistura deve então ser incluída com o mesmo número de argumentos na forma de expressões de SassScript. Os valores destas expressões estão disponíveis dentro do corpo da mistura de acordo com as variáveis correspondentes:

SCSS Syntax

@mixin rtl($property, $ltr-value, $rtl-value) {
  #{$property}: $ltr-value;

  [dir=rtl] & {
    #{$property}: $rtl-value;
  }
}

.sidebar {
  @include rtl(float, left, right);
}

Sass Syntax

@mixin rtl($property, $ltr-value, $rtl-value)
  #{$property}: $ltr-value

  [dir=rtl] &
    #{$property}: $rtl-value



.sidebar
  @include rtl(float, left, right)

CSS Output

.sidebar {
  float: left;
}
[dir=rtl] .sidebar {
  float: right;
}





💡 Fato Divertido:

As listas de argumentos também podem ter vírgulas finais! Isto torna mais fácil evitar erros de sintaxe quando refazes as tuas folhas de estilo.

Argumentos OpcionaisArgumentos Opcionais permalink

Normalmente, todo argumento que uma mistura declara deve ser passado quando esta mistura for incluída. No entanto, podes tornar um argumento opcional definindo um valor padrão que será usado se este argumento não for passado. Os valores padrão usam a mesma sintaxe que as declarações de variáveis: o nome da variável, seguido por dois pontos e uma expressão de SassScript. Isto torna fácil definir APIs de mistura flexíveis que podem ser usadas de maneiras simples ou complexas:

SCSS Syntax

@mixin replace-text($image, $x: 50%, $y: 50%) {
  text-indent: -99999em;
  overflow: hidden;
  text-align: left;

  background: {
    image: $image;
    repeat: no-repeat;
    position: $x $y;
  }
}

.mail-icon {
  @include replace-text(url("/images/mail.svg"), 0);
}

Sass Syntax

@mixin replace-text($image, $x: 50%, $y: 50%)
  text-indent: -99999em
  overflow: hidden
  text-align: left

  background:
    image: $image
    repeat: no-repeat
    position: $x $y

.mail-icon
  @include replace-text(url("/images/mail.svg"), 0)



CSS Output

.mail-icon {
  text-indent: -99999em;
  overflow: hidden;
  text-align: left;
  background-image: url("/images/mail.svg");
  background-repeat: no-repeat;
  background-position: 0 50%;
}







💡 Fato Divertido:

Os valores padrão podem ser qualquer expressão de SassScript, e podem mesmo fazer referência à argumentos anteriores!

Argumentos de Palavra-ChaveArgumentos de Palavra-Chave permalink

Quando uma mistura é incluída, os argumentos podem ser passados pelo nome além de passá-los pelas suas posições na lista de argumento. Isto é especialmente útil para misturas com vários argumentos opcionais, ou com argumentos booleanos cujos significados não são óbvios sem um nome ir com eles. Os argumentos de palavra-chave usa a mesma sintaxe que as declarações de variáveis e argumentos opcionais:

SCSS Syntax

@mixin square($size, $radius: 0) {
  width: $size;
  height: $size;

  @if $radius != 0 {
    border-radius: $radius;
  }
}

.avatar {
  @include square(100px, $radius: 4px);
}

Sass Syntax

@mixin square($size, $radius: 0)
  width: $size
  height: $size

  @if $radius != 0
    border-radius: $radius



.avatar
  @include square(100px, $radius: 4px)

CSS Output

.avatar {
  width: 100px;
  height: 100px;
  border-radius: 4px;
}







⚠️ Atenção!

Uma vez que qualquer argumento pode ser passado pelo nome, seja cuidadoso quando renomeares os argumentos duma mistura… pode quebrar os teus utilizadores! Pode ser prestável manter o nome antigo por perto como um argumento opcional por enquanto e imprimir um aviso se alguém passá-lo, assim sabem que devem migrar para o novo argumento.

Recebendo Argumentos ArbitráriosRecebendo Argumentos Arbitrários permalink

Algumas vezes é útil para uma mistura ser capaz de receber qualquer número de argumentos. Se o último argumento numa declaração de @mixin terminar em ..., então todos argumentos adicionais para esta mistura são passado para este argumento como uma lista. Este argumento é conhecido como uma lista de argumento:

SCSS Syntax

@mixin order($height, $selectors...) {
  @for $i from 0 to length($selectors) {
    #{nth($selectors, $i + 1)} {
      position: absolute;
      height: $height;
      margin-top: $i * $height;
    }
  }
}

@include order(150px, "input.name", "input.address", "input.zip");






Sass Syntax

@mixin order($height, $selectors...)
  @for $i from 0 to length($selectors)
    #{nth($selectors, $i + 1)}
      position: absolute
      height: $height
      margin-top: $i * $height




@include order(150px, "input.name", "input.address", "input.zip")






CSS Output

input.name {
  position: absolute;
  height: 150px;
  margin-top: 0px;
}

input.address {
  position: absolute;
  height: 150px;
  margin-top: 150px;
}

input.zip {
  position: absolute;
  height: 150px;
  margin-top: 300px;
}

Recebendo Argumentos de Palavra-Chave ArbitráriosRecebendo Argumentos de Palavra-Chave Arbitrários permalink

As listas de argumentos também podem ser usadas para receber argumentos de palavra-chave arbitrários. A função meta.keywords() recebe uma lista de argumento e retorna quaisquer palavras-chave adicionais que foram passadas para a mistura como um mapa a partir dos nomes de argumento (sem incluir $) à estes valores dos argumentos:

SCSS Syntax

@use "sass:meta";

@mixin syntax-colors($args...) {
  @debug meta.keywords($args);
  // (string: #080, comment: #800, variable: #60b)

  @each $name, $color in meta.keywords($args) {
    pre span.stx-#{$name} {
      color: $color;
    }
  }
}

@include syntax-colors(
  $string: #080,
  $comment: #800,
  $variable: #60b,
)

Sass Syntax

@use "sass:meta"

@mixin syntax-colors($args...)
  @debug meta.keywords($args)
  // (string: #080, comment: #800, variable: #60b)

  @each $name, $color in meta.keywords($args)
    pre span.stx-#{$name}
      color: $color




@include syntax-colors($string: #080, $comment: #800, $variable: #60b)




CSS Output

pre span.stx-string {
  color: #080;
}

pre span.stx-comment {
  color: #800;
}

pre span.stx-variable {
  color: #60b;
}







💡 Fato Divertido:

Se nunca passares um argumento de lista à função meta.keywords(), esta lista de argumento não permitirá argumentos de palavra-chave adicionais. Isto ajuda os chamadores da tua mistura a certificarem-se de que não escreveram mal acidentalmente quaisquer nomes.

Passando Argumentos ArbitráriosPassando Argumentos Arbitrários permalink

Tais como as listas de argumentos permitem as misturas receber argumentos posicionais arbitrários ou de palavra-chave, a mesma sintaxe pode ser usada para passar argumentos posicionais e de palavra-chave à uma mistura. Se passares uma lista seguida por ... como último argumento duma inclusão, os seus elementos serão tratados como argumentos posicionais adicionais. De maneira semelhante, um mapa seguido por ... será tratado como argumentos de palavra-chave adicionais. Tu podes mesmo passar ambos duma vez!

SCSS Syntax

$form-selectors: "input.name", "input.address", "input.zip" !default;

@include order(150px, $form-selectors...);

Sass Syntax

$form-selectors: "input.name", "input.address", "input.zip" !default

@include order(150px, $form-selectors...)

💡 Fato Divertido:

Uma vez que uma lista de argumento continua a rastrear os argumentos posicionais e de palavra-chave, use-a para passar ambos duma vez à uma outra mistura. Isto torna super fácil definir um pseudónimo para uma mistura!

SCSS Syntax

@mixin btn($args...) {
  @warn "The btn() mixin is deprecated. Include button() instead.";
  @include button($args...);
}

Sass Syntax

@mixin btn($args...)
  @warn "The btn() mixin is deprecated. Include button() instead."
  @include button($args...)

Blocos de ConteúdoBlocos de Conteúdo permalink

Além de receber argumentos, uma mistura pode receber um bloco inteiro de estilos, conhecido como um bloco de conteúdo. Uma mistura pode declarar que recebe um bloco de conteúdo incluindo a regra de arroba @content no seu corpo. O bloco de conteúdo é passado usando chavetas como qualquer outro bloco na Sass, e é injetado no lugar da regra @content:

SCSS Syntax

@mixin hover {
  &:not([disabled]):hover {
    @content;
  }
}

.button {
  border: 1px solid black;
  @include hover {
    border-width: 2px;
  }
}

Sass Syntax

@mixin hover
  &:not([disabled]):hover
    @content



.button
  border: 1px solid black
  @include hover
    border-width: 2px


CSS Output

.button {
  border: 1px solid black;
}
.button:not([disabled]):hover {
  border-width: 2px;
}






💡 Fato Divertido:

Um mistura pode incluir várias regras de arroba @content. Se o fizer, o bloco de conteúdo será incluído separadamente para cada @content.

⚠️ Atenção!

Um bloco de conteúdo é lexicalmente isolado, o que significa que apenas pode ver variáveis locais no âmbito onde a mistura está incluída. Não pode ver quaisquer variáveis que são definidas onde a mistura é passada, mesmo se forem definidas antes do bloco de conteúdo ser invocado.

Passando Argumentos aos Blocos de ConteúdoPassando Argumentos aos Blocos de Conteúdo permalink

Compatibilidade:
Sass de Dart
since 1.15.0
LibSass
Sass de Ruby

Uma mistura pode passar argumentos ao seu bloco de conteúdo da mesma maneira que passaria argumentos à uma outra mistura escrevendo @content(<arguments...>). O utilizador escrevendo o bloco de conteúdo pode aceitar argumentos escrevendo @include <name> using (<arguments...>). A lista de argumentos para um bloco de conteúdo funciona tal como uma lista de argumento duma mistura, e os argumentos passados para ele por @content funcionam tal como a passagem de argumentos à uma mistura.

⚠️ Atenção!

Se uma mistura passar argumentos ao seu bloco de conteúdo, este bloco de conteúdo deve declarar que aceita estes argumentos. Isto significa que é uma boa ideia apenas passar argumentos por posição (ao invés por nome), e significa que a passagem de mais argumentos é uma mudança de rutura.

Se quiseres ser flexível em qual informação passas para um bloco de conteúdo, considere passar um mapa que contém informação que talvez precise!

SCSS Syntax

@mixin media($types...) {
  @each $type in $types {
    @media #{$type} {
      @content($type);
    }
  }
}

@include media(screen, print) using ($type) {
  h1 {
    font-size: 40px;
    @if $type == print {
      font-family: Calluna;
    }
  }
}

Sass Syntax

@mixin media($types...)
  @each $type in $types
    @media #{$type}
      @content($type)




@include media(screen, print) using ($type)
  h1
    font-size: 40px
    @if $type == print
      font-family: Calluna



CSS Output

@media screen {
  h1 {
    font-size: 40px;
  }
}
@media print {
  h1 {
    font-size: 40px;
    font-family: Calluna;
  }
}





Sintaxe de Mistura IndentadaSintaxe de Mistura Indentada permalink

A sintaxe indentada tem uma sintaxe especial para definir e usar misturas, além da padrão @mixin e @include. As misturas são definidas usando o carácter =, e são incluídas usando +. Embora esta sintaxe seja mais concisa, é também mais difícil de entender a primeira vista e os utilizadores são encorajados a evitá-la:

Sass Syntax

=reset-list
  margin: 0
  padding: 0
  list-style: none

=horizontal-list
  +reset-list

  li
    display: inline-block
    margin:
      left: -2px
      right: 2em

nav ul
  +horizontal-list

CSS Output

nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
}
nav ul li {
  display: inline-block;
  margin-left: -2px;
  margin-right: 2em;
}