Sass 中单位的工作方式存在很多混淆。然而,它们的工作方式与现实生活中完全相同。如果你想删除值的单位,你必须将其除以 1 个单位。例如,要删除 42cm
的 cm
单位,你必须将其除以 1cm
。在 Sass 中也是一样的。
$length: 42px;
$value: $length / 1px;
// -> 42
但如果你不知道正在使用的单位呢?假设它可以是任何东西,从像素到 em
甚至 vw
和 ch
。然后我们需要在一个函数中抽象逻辑。
/// Remove the unit of a length
/// @param {Number} $number - Number to remove unit from
/// @return {Number} - Unitless number
@function strip-unit($number) {
@if type-of($number) == 'number' and not unitless($number) {
@return $number / ($number * 0 + 1);
}
@return $number;
}
计算可能看起来很奇怪,但它实际上是有意义的。为了获得 $number
单位的 1
,我们可以将 $number
乘以 0
,然后加 1
。
用法
$length: 42px;
$value: strip-unit($length);
// -> 42
我们究竟可以在哪里使用此函数?我无法想到具体的用途,因为到目前为止,Sass 至少可以计算相同单位值的运算。很明显,存在可能的不同单位运算。但如果你可以,请给我们举个例子!
同意,用例非常少见。Reda Lemeden(Bourbon、Neat 等)向我建议过一个。
大多数情况下,可以通过正确的方式操作单位来解决问题。
如果您发现自己使用带有单位的变量设置了无单位的行高计算,则这是一个具体的示例……
我目前正在为我们公司开发一个专有框架,在处理“rem”单位时遇到了一个重大障碍。正如您在 https://caniuse.cn/#feat=rem 中看到的,Internet Explorer(即使是版本 11)在许多情况下都不支持 rem 单位,并且在经过试验后,我意识到它实际上比他们看起来要糟糕得多。我遇到了字体大小失控和禁用边距/填充等问题,仅举几例。
此页面上的解决方案使我能够生成一个使我的 rem 单位万无一失的 Sass 混合宏。我所要做的就是在开头获取一个实际的 $unit 变量,然后可以用它乘以结果。
http://codepen.io/anon/pen/vNJMLY
如您所见,这两个值都按最不可取的顺序呈现给浏览器。我认为 OP 的文章实际上有助于处理这些向后兼容性问题。或者可能只是我。
在我的特定情况下(但我想每个 polyfill 都是一样的)缺点是它有点违背了首先使用 rem 单位的目的……最简单的解决方案最终是使用一个混合宏来将根单位乘以任何值,从而完全替换 rem 的功能。
我现在非常讨厌你 Internet Explorer 以及你仍然有意义的浏览器市场份额。
1232
一个用例是,如果您想编写自己的函数,这些函数需要对提供的百分比进行数学运算。您无法对百分比数字执行任何操作,因此您必须删除百分比。Sass 将其视为需要删除的“单位”。不要忘记将无单位的百分比值除以 100 以获得一个真正的计算值。
相反的函数是 percentage(),它已经包含在 Sass 中。他们只是忘记了 unpercentage() 函数。
由于重大更改:斜杠作为除法,去除单位函数在 Sass 1.49.9 中不再有效。
https://sass-lang.com.cn/documentation/breaking-changes/slash-div
这是 Dart Sass 的修订版本。
这实际上与实际数学中的单位工作方式并不完全相同,因为您无法简化具有不同单位的值的加法。
所以,对于 $number: 5px;
$number / ($number * 0 + 1)
5px / (5px * 0 + 1)
5px / (0px + 1)
undefined + 5px