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.
- 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
- 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:
-
pi
é uma abreviatura para a constante matemática π. -
e
é uma abreviatura para a constante matemática e. -
infinity
,-infinity
, eNaN
representam os valores de ponto flutuante correspondentes.
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
- 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;
}