Числа
У чисел в Sass есть два компонента: само число и его единицы измерения. Например, в 16px число — это 16, а единица измерения — px. Числа могут быть без единиц измерения, а также могут иметь составные единицы. Подробнее см. ниже в разделе Единицы измерения.
@debug 100; // 100 @debug 0.8; // 0.8 @debug 16px; // 16px @debug 5px * 2px; // 10px*px (read "square pixels")
// SASS @debug 100 // 100 @debug 0.8 // 0.8 @debug 16px // 16px @debug 5px * 2px // 10px*px (read "square pixels")
Числа Sass поддерживают те же форматы, что и числа CSS, включая научную нотацию, которая записывается с помощью e между числом и его степенью 10. Поскольку поддержка научной нотации в браузерах исторически была нестабильной, Sass всегда компилирует её в полностью развернутые числа.
@debug 5.2e3; // 5200 @debug 6e-2; // 0.06
// SASS @debug 5.2e3 // 5200 @debug 6e-2 // 0.06
Sass не различает целые числа и десятичные дроби, поэтому, например, math.div(5, 2) возвращает 2.5, а не 2. Такое же поведение наблюдается в JavaScript, но отличается от поведения во многих других языках программирования.
Единицы измерения
Sass предоставляет широкие возможности для работы с единицами измерения, основанные на том, как выполняются вычисления с единицами измерения в реальном мире. При умножении двух чисел перемножаются и их единицы измерения. При делении одного числа на другое результат получает единицы в числителе от первого числа, а в знаменателе — от второго. У числа может быть любое количество единиц в числителе и/или знаменателе.
@use 'sass:math'; @debug 4px * 6px; // calc(24px * 1px) (read "square pixels") @debug math.div(5px, 2s); // calc(2.5px / 1s) (read "pixels per second") // calc(3.125px * 1deg / 1s / 1em) (read "pixel-degrees per second-em") @debug 5px * math.div(math.div(30deg, 2s), 24em); $degrees-per-second: math.div(20deg, 1s); @debug $degrees-per-second; // calc(20deg / 1s) @debug math.div(1, $degrees-per-second); // calc(0.05s / 1deg)
// SASS @use 'sass:math' @debug 4px * 6px // calc(24px * 1px) (read "square pixels") @debug math.div(5px, 2s) // calc(2.5px / 1s) (read "pixels per second") // calc(3.125px * 1deg / 1s / 1em) (read "pixel-degrees per second-em") @debug 5px * math.div(math.div(30deg, 2s), 24em) $degrees-per-second: math.div(20deg, 1s) @debug $degrees-per-second // calc(20deg / 1s) @debug math.div(1, $degrees-per-second) // calc(0.05s / 1deg)
В CSS числа с составными единицами можно представить только в виде calc() и других математических выражений, поэтому Sass выводит такие числа в виде выражений calc(). Обычные свойства CSS не принимают составные единицы, но они могут быть полезны в пользовательских свойствах или функциях.
- Dart Sass
- начиная с 1.96.0
- LibSass
- ✗
- Ruby Sass
- ✗
В спецификации CSS поддержка составных единиц, таких как квадратные пиксели, была определена только в Values and Units Level 4, а браузеры начали её реализовывать только в 2025 году. В более ранних версиях Sass при попытке использовать в CSS значение с составными единицами возникали ошибки, хотя такие значения по-прежнему можно было использовать в переменных и функциях Sass.
Начиная с Dart Sass 1.69.6, meta.inspect() возвращает корректные выражения calc() для чисел с составными единицами.
Sass автоматически преобразует совместимые единицы, однако выбор единицы для результата зависит от используемой реализации Sass. Если попытаться объединить несовместимые единицы, например 1in + 1em, Sass выдаст ошибку.
// CSS defines one inch as 96 pixels. @debug 1in + 6px; // 102px or 1.0625in @debug 1in + 1s; // ^^^^^^^^ // Error: Incompatible units s and in.
// SASS // CSS defines one inch as 96 pixels. @debug 1in + 6px // 102px or 1.0625in @debug 1in + 1s // ^^^^^^^^ // Error: Incompatible units s and in.
Как и при вычислениях с единицами в реальном мире, если в числителе есть единицы, совместимые с единицами в знаменателе (например, math.div(96px, 1in)), они сокращаются. Это позволяет легко задать коэффициент, который можно использовать для преобразования единиц. В примере ниже мы задаём требуемую скорость — одну секунду на 50 пикселей, — а затем умножаем её на количество пикселей, которое охватывает переход, чтобы получить его длительность.
@use 'sass:math';
$transition-speed: math.div(1s, 50px);
@mixin move($left-start, $left-stop) {
position: absolute;
left: $left-start;
transition: left ($left-stop - $left-start) * $transition-speed;
&:hover {
left: $left-stop;
}
}
.slider {
@include move(10px, 120px);
}// SASS
@use 'sass:math'
$transition-speed: math.div(1s, 50px)
@mixin move($left-start, $left-stop)
position: absolute
left: $left-start
transition: left ($left-stop - $left-start) * $transition-speed
&:hover
left: $left-stop
.slider
@include move(10px, 120px)/* CSS */
.slider {
position: absolute;
left: 10px;
transition: left 2.2s;
}
.slider:hover {
left: 120px;
}Если в результате арифметических операций вы получили неправильную единицу измерения, вероятно, нужно проверить вычисления. Возможно, вы не указали единицы измерения у величины, для которой они необходимы! Если единицы измерения указаны правильно, Sass сможет сообщить об ошибках, когда что-то пойдёт не так.
В частности, следует избегать интерполяции, например #{$number}px. Она не создаёт число! Она создаёт строку без кавычек, которая выглядит как число, но не работает ни с какими операциями над числами или функциями. Старайтесь правильно указывать единицы измерения в вычислениях, чтобы $number уже содержало единицу измерения px, или напишите $number * 1px.
Проценты в Sass работают так же, как и любые другие единицы измерения. Они не взаимозаменяемы с десятичными дробями, поскольку в CSS десятичные дроби и проценты означают разные вещи. Например, 50% — это число с единицей измерения %, и Sass считает его отличным от числа 0.5.
Преобразовать десятичные дроби в проценты и наоборот можно с помощью арифметических операций над единицами измерения. math.div($percentage, 100%) вернёт соответствующую десятичную дробь, а $decimal * 100% — соответствующий процент. Также можно использовать функцию math.percentage() как более явный способ записи $decimal * 100%.
Точность
- Dart Sass
- ✓
- LibSass
- ✗
- Ruby Sass
- начиная с 3.5.0
В LibSass и старых версиях Ruby Sass по умолчанию используется точность в 5 цифр, но можно настроить другое значение. Для большей точности и совместимости с будущими версиями рекомендуется установить точность в 10 цифр.
Числа Sass внутри представлены значениями с плавающей точкой двойной точности (64 бита). При сериализации в CSS и при проверке на равенство они поддерживают точность до 10 цифр после десятичной точки. Это означает несколько вещей:
-
В сгенерированный CSS попадут только первые десять цифр числа после десятичной точки.
-
Такие операции, как
==и>=, считают два числа равными, если их значения совпадают до десятой цифры после десятичной точки. -
Если число отличается от целого менее чем на
0.0000000001, оно считается целым для функций, таких какlist.nth(), которым требуются целочисленные аргументы.
@debug 0.012345678912345; // 0.0123456789 @debug 0.01234567891 == 0.01234567899; // true @debug 1.00000000009; // 1 @debug 0.99999999991; // 1
// SASS @debug 0.012345678912345 // 0.0123456789 @debug 0.01234567891 == 0.01234567899 // true @debug 1.00000000009 // 1 @debug 0.99999999991 // 1
💡 Интересный факт:
Округление чисел до 10 цифр точности выполняется по мере необходимости, когда они используются там, где важна точность. Благодаря этому математические функции внутри работают с полным значением числа и не накапливают дополнительные ошибки округления.
© 2006–2025 the Sass team, and numerous contributors
Licensed under the MIT License.
https://sass-lang.com/documentation/values/numbers