Spec-Zone.ru › Sass

Числа

Числа в 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; // 24px*px (read "square pixels")
@debug math.div(5px, 2s); // 2.5px/s (read "pixels per second")

// 3.125px*deg/s*em (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; // 20deg/s
@debug math.div(1, $degrees-per-second); // 0.05s/deg
// SASS
@use 'sass:math'

@debug 4px * 6px  // 24px*px (read "square pixels")
@debug math.div(5px, 2s)  // 2.5px/s (read "pixels per second")

// 3.125px*deg/s*em (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  // 20deg/s
@debug math.div(1, $degrees-per-second)  // 0.05s/deg

Поскольку CSS не поддерживает сложные единицы измерения, такие как квадратные пиксели, использование числа со сложными единицами измерения в качестве значения свойства вызовет ошибку. Однако это можно рассматривать как функцию; если вы не получаете нужную единицу измерения, это обычно означает, что в ваших расчётах есть ошибка! И помните, вы всегда можете использовать @debug правило для проверки единиц измерения любой переменной или выражения.

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%.

Точность

Совместимость (по умолчанию 10 знаков после запятой):
Dart Sass
✓
LibSass
✗
Ruby Sass
с версии 3.5.0
➤

LibSass и более старые версии Ruby Sass по умолчанию используют 5 знаков после запятой для точности чисел, но могут быть настроены на использование другого количества знаков. Рекомендуется настроить их на 10 знаков для большей точности и совместимости.

Числа в Sass внутренне представляются в виде 64-битных чисел с плавающей запятой. Они поддерживают до 10 знаков после запятой при сериализации в CSS и для целей сравнения. Это означает несколько разных вещей:

  • В сгенерированном 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API