Cálculos

Os cálculos são como a Sass representa a função calc(), bem como funções parecidas como clamp(), min(), e max(). A Sass simplificará estas o quanto for possível, mesmo se forem combinadas com uma outra.

Compatibilidade:
Sass de Dart
since 1.40.0
LibSass
Sass de Ruby

A LibSass, Sass de Ruby, e versões de Sass de Dart anteriores a 1.40.0 analisam a calc() como uma função especial como element().

A LibSass, Sass de Ruby, e versões de Sass de Dart anteriores a 1.31.0 analisam clamp() como uma função de CSS simples ao invés de suportar sintaxe especial dentro dela. As versões da Sass de Dart entre 1.31.0 e 1.40.0 analisam a clamp como uma função especial como element().

SCSS Syntax

@debug calc(400px + 10%); // calc(400px + 10%)
@debug calc(400px / 2); // 200px
@debug min(100px, calc(1rem + 10%)); // min(100px, 1rem + 10%)

Sass Syntax

@debug calc(400px + 10%)  // calc(400px + 10%)
@debug calc(400px / 2)  // 200px
@debug min(100px, calc(1rem + 10%) ; // min(100px, 1rem + 10%)

Os cálculos usam uma sintaxe especial que é diferente da SassScript normal. É a mesma sintaxe da calc() de CSS, mas com habilidade adicional para usar variáveis de Sass e chamar funções de Sass. Isto significa que / é sempre um operador de divisão dentro dum cálculo!

💡 Fato Divertido:

Os argumentos para uma chamada de função de Sass usam a sintaxe de Sass normal, ao invés da sintaxe de cálculo especial!

Tu podes também usar a interpolação num cálculo. No entanto, se fizeres, nada dentro dos parênteses que envolve esta interpolação será simplificado ou verificado o seu tipo, assim é fácil terminar com CSS verboso a mais ou mesmo inválido. No lugar de escrever calc(10px + #{$var}), apenas escreva calc(10px + $var)!

SimplificaçãoSimplificação permalink

A Sass simplificará as operações adjacentes nos cálculos se usarem unidades que podem ser combinadas em tempo de compilação, tais como 1in + 10px ou 5s * 2. Se possível, até mesmo simplificará o cálculo inteiro para um único número — por exemplo, clamp(0px, 30px, 20px) retornará 20px.

⚠️ Atenção!

Isto significa que uma expressão de cálculo não retornarão sempre necessariamente um cálculo! Se estiveres a escrever uma biblioteca de Sass, podes sempre usar a função meta.type-of() para determinar com qual tipo estás a lidar.

Os cálculos também serão simplificados dentro de outros cálculos. Em especial, se um calc() termina dentro de qualquer cálculo, a chamada de função será removida e será substituída por uma operação anterior simples:

SCSS Syntax

$width: calc(400px + 10%);

.sidebar {
  width: $width;
  padding-left: calc($width / 4);
}

Sass Syntax

$width: calc(400px + 10%)

.sidebar
  width: $width
  padding-left: calc($width / 4)

CSS Output

.sidebar {
  width: calc(400px + 10%);
  padding-left: calc((400px + 10%) / 4);
}


OperaçõesOperações permalink

Tu não podes usar os cálculos com opções de SassScript normais como + e *. Se quiseres escrever algumas funções matemáticas que permitam cálculos apenas as escreva dentro sua própria expressões de calc() — Se forem passada uma mão-cheia de números com unidades compatíveis, retornarão números simples também, e se forem passados cálculos retornarão cálculos.

Esta restrição está no lugar para certificar-se que se os cálculos não forem desejados, lançam um erro o mesmo cedo possível. Os cálculos não podem ser usados em toda parte que os números simples podem: eles não podem ser injetados para os identificadores de CSS (tais como .item-#{$n}), por exemplo, não podem ser passados para as funções matemáticas embutidas da Sass. Reservar operações de SassScript para números simples esclarece exatamente onde os cálculos são permitidos e onde não são:

SCSS Syntax

$width: calc(100% + 10px);
@debug $width * 2; // Error!
@debug calc($width * 2); // calc((100% + 10px) * 2);

Sass Syntax

$width: calc(100% + 10px);
@debug $width * 2; // Error!
@debug calc($width * 2); // calc((100% + 10px) * 2);

ConstantesConstantes permalink

Compatibilidade:
Sass de Dart
since 1.60.0
LibSass
Sass de Ruby

Os cálculos também podem conter constantes, que são escritas como identificadores de CSS. Para compatibilidade futura com as futuras especificações da CSS, todos os identificadores são permitidos, e por padrão são apenas tratados como sequências de caracteres sem aspas que são passadas como estão.

SCSS Syntax

@debug calc(h + 30deg); // calc(h + 30deg);

Sass Syntax

@debug calc(h + 30deg)  // calc(h + 30deg);

A Sass automaticamente resolve alguns nomes de constante especiais que são especificadas na CSS para números sem unidade:

SCSS Syntax

@use 'sass:math';

@debug calc(pi); // 3.1415926536
@debug calc(e);  // 2.7182818285
@debug calc(infinity) > math.$max-number;  // true
@debug calc(-infinity) < math.$min-number; // true

Sass Syntax

@use 'sass:math'

@debug calc(pi)  // 3.1415926536
@debug calc(e)   // 2.7182818285
@debug calc(infinity) > math.$max-number   // true
@debug calc(-infinity) < math.$min-number  // true

min() e max()min() e max() permalink

Compatibilidade (Sintaxe de Função Especial):
Sass de Dart
since >=1.11.0 <1.42.0
LibSass
Sass de Ruby

A LibSass, Sass de Ruby, e verões de Sass de Dart anteriores a 1.11.0 sempre analisam min() e max() como funções de Sass. Para criares uma chamada min() ou max() de CSS simples para estas implementações, podes escrever algo como unquote("min(#{$padding}, env(safe-area-inset-left))").

As versões da Sass de Dart entre 1.11.0 e 1.40.0, e entre 1.40.1 e 1.42.0 analisam as funções min() e max() como funções especiais se forem CSS simples válidos, mas as analisa como funções de Sass se conterem funcionalidades de Sass para além da interpolação, como variáveis ou chamadas de função.

A Sass de Dart 1.41.0 analisa as funções min() e max() como cálculos, mas não permite que números sem unidade sejam combinados com números com unidades. Isto foi retro-incompatível com as funções min() e max() globais, assim este comportamento foi revertido.

A CSS adicionou suporte para as [funções min() e max()] no Nível 4 de Valores e Unidades, de onde foram rapidamente adotados pelo Safari para suportar o iPhoneX. Mas a Sass suportava suas próprias funções min() e max() muito antes disto, e precisava de ser retro-compatível com todas aquelas folhas de estilos existentes. Isto conduz para a necessidade de inteligência sintática muito especial.

Se uma chamada de função min() e max() é uma expressão de cálculo válida, será analisada como um cálculo. Mas logo que qualquer parte da chama conter uma funcionalidade de SassScript que não é suportado num cálculo, como o [operador modulo], é analisada como uma chamada para função min() ou max() principal.

Já que cálculos são simplificados aos números quando possível de qualquer modo, a única diferença de substantivo é que as funções de Sass apenas suportam unidades que podem ser combinadas em tempo de construção, assim min(12px % 10, 10%) lançarão um erro.

⚠️ Atenção!

Outros cálculos não permitem que números sem unidades sejam adicionados a, subtraídos de, ou comparados aos números com as unidades. min() e max() são diferentes: para retro-compatibilidade com as funções min() e max() de Sass globais que permitem unidade/sem unidade misturando por razões históricas, estas unidades podem ser misturada enquanto são contidos diretamente dentro dum cálculo de min() ou max().

SCSS Syntax

$padding: 12px;

.post {
  // Já que estas chamadas de max() são expressões de cálculos válidos,
  // são analisadas como cálculos.
  padding-left: max($padding, env(safe-area-inset-left));
  padding-right: max($padding, env(safe-area-inset-right));
}

.sidebar {
  // Já que estes usam o operador modulo exclusivo de SassScript,
  // são analisados como chamadas da função de SassScript.
  padding-left: max($padding % 10, 20px);
  padding-right: max($padding % 10, 20px);
}

Sass Syntax

$padding: 12px

.post
  // Já que estas chamadas max() são expressões de cálculos válidos,
  // são analisados como cálculos.
  padding-left: max($padding, env(safe-area-inset-left))
  padding-right: max($padding, env(safe-area-inset-right))


.sidebar
  // Já que estes usam o operador modulo exclusivo de SassScript,
  // são analisados como chamadas da função de SassScript.
  padding-left: max($padding % 10, 20px)
  padding-right: max($padding % 10, 20px)

CSS Output

.post {
  padding-left: max(12px, env(safe-area-inset-left));
  padding-right: max(12px, env(safe-area-inset-right));
}

.sidebar {
  padding-left: 20px;
  padding-right: 20px;
}