百科狗-知识改变命运!
--

数值运算符 - scss 运算符

梵高1年前 (2023-11-21)阅读数 18#技术干货
文章标签单位

数值运算符

Sass 支持数字的标准数学运算符集。它们会在兼容单位之间自动转换。

  • +,将第一个表达式的值添加到第二个。
  • -,从第二个表达式中减去第一个表达式的值。
  • *,将第一个表达式的值乘以第二个。
  • %,返回第一个表达式的值除以第二个的余数。这称为模运算符。
@debug 10s + 15s; // 25s
@debug 1in - 10px; // 0.8958333333in
@debug 5px * 3px; // 15px*px
@debug 1in % 9px; // 0.0625in

无单位数字可以与任何单位的数字一起使用。

@debug 100px + 50; // 150px
@debug 4s * 10; // 40s

单位不兼容的数字不能与加法、减法或模数一起使用。

@debug 100px + 10s;
///     ^^^^^^^^^^^
/// Error: Incompatible units px and s.


一元运算符

你也可以将+-,写成一元运算符,它只取一个值:

  • +,返回表达式的值而不更改它。
  • -,返回表达式值的负数。
@debug +(5s + 7s); // 12s
@debug -(50px + 30px); // -80px
@debug -(10px - 15px); // 5px

⚠️注意!
因为-可以同时引用减法和一元否定,所以在空格分隔的列表中可能会混淆哪个是哪个。为了安全起见:

  • -,减法时,两边都要写空格。
  • 在负数-或一元否定之前写一个空格,但不在之后写一个空格。
  • 如果它在以空格分隔的列表中,则将一元否定括在括号中。

Sass 中不同含义的-优先顺序如下:

  • -,作为标识符的一部分。唯一的例外是单位;Sass 通常允许使用任何有效的标识符作为标识符,但单位不能包含连字符后跟数字。
  • -,在表达式和没有空格的文字数字之间,将其解析为减法。
  • -,在文字数字的开头,该数字被解析为负数。
  • -,在两个数字之间,无论空格如何,都被解析为减法。
  • -,在除文字数字之外的值之前,该数字被解析为一元否定。
@debug a-1; // a-1
@debug 5px-3px; // 2px
@debug 5-3; // 2
@debug 1 -2 3; // 1 -2 3

$number: 2;
@debug 1 -$number 3; // -1 3
@debug 1 (-$number) 3; // 1 -2 3


斜杠

数值运算符 - scss 运算符

与其他数学运算不同,Sass 中的除法是通过math.div()函数完成的。尽管许多编程语言中,/用作除法运算符,但在 CSS 中,/用作分隔符(如font: 15px/32px or hsl(120 100% 50%/ 0.8))。虽然 Sass 确实支持使用/,用作除法运算符,但它已被弃用,并将在未来的版本中删除。


斜线分隔值

目前,虽然 Sass 仍然支持/作为除法运算符,但它必须有一种方法来消除/作为分隔符和/除法之间的歧义。为了完成这项工作,如果两个数字用/分隔,除非满足以下条件之一,否则 Sass 会将结果打印为斜线分隔而不是相除:

  • 任何一个表达式都不是文字数字。
  • 结果存储在变量中或由函数返回。
  • 该操作被括号包围,除非这些括号在包含该操作的列表之外。
  • 结果用作另一个操作的一部分(除了/)。
  • 您可以使用[list.slash()]强制/用作分隔符。
@use "sass:list";

@debug 15px / 30px; // 15px/30px
@debug (10px + 5px) / 30px; // 0.5
@debug list.slash(10px + 5px, 30px); // 15px/30px

$result: 15px / 30px;
@debug $result; // 0.5

@function fifteen-divided-by-thirty() {
  @return 15px / 30px;
}
@debug fifteen-divided-by-thirty(); // 0.5

@debug (15px/30px); // 0.5
@debug (bold 15px/30px sans-serif); // bold 15px/30px sans-serif
@debug 15px/30px + 1; // 1.5


单位

Sass 对根据实际单位计算的工作方式操作单位提供了强大的支持。当两个数字相乘时,它们的单位也相乘。当一个数除以另一个数时,结果的分子单位取自第一个数,分母单位取第二个数。一个数字的分子和或分母可以有任意数量的单位。

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

与现实世界的单位计算一样,如果分子包含与分母中的单位兼容的单位(如math.div(96px, 1in)),它们将被抵消。这使得定义可用于单位之间转换的比率变得容易。在下面的示例中,我们将所需的速度设置为每 50 个像素一秒,然后将其乘以过渡覆盖的像素数以获得它应该花费的时间。

scss 语句css 语句
$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%的方式。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)