Numbers
Sass 中的数字有两个组成部分:数字本身及其单位。例如,在 16px 中,数字是 16,单位是 px。数字可以没有单位,也可以有复杂的单位。有关更多详细信息,请参见下面的单位。
Sass 中的数字有两个组成部分:数字本身及其单位。例如,在 16px 中,数字是 16,单位是 px。数字可以没有单位,也可以有复杂的单位。有关更多详细信息,请参见下面的单位。
@debug 100; // 100
@debug 0.8; // 0.8
@debug 16px; // 16px
@debug 5px * 2px; // 10px*px (read "square pixels")
@debug 100 // 100
@debug 0.8 // 0.8
@debug 16px // 16px
@debug 5px * 2px // 10px*px (read "square pixels")
Sass 数字支持与 CSS 数字相同的格式,包括科学计数法,它在数字和 10 的幂之间用 e 书写。由于浏览器对科学计数法的支持历来参差不齐,Sass 总是将其编译成完全展开的数字。
@debug 5.2e3; // 5200
@debug 6e-2; // 0.06
@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
@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.
// 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);
}
@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)
.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% 的更明确的写法。精度
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
@debug 0.012345678912345 // 0.0123456789
@debug 0.01234567891 == 0.01234567899 // true
@debug 1.00000000009 // 1
@debug 0.99999999991 // 1
当数字在与精度相关的地方使用时,它才会被惰性地四舍五入到 10 位精度。这意味着数学函数将在内部使用完整的数字值来避免累积额外的舍入误差。