为什么 min() (或 max())不能与无单位 0 一起使用?

Jad*_*sta 5 css css-calc

我四处寻找答案,但找不到任何有用的信息。我正在尝试将topCSS 中元素的属性设置为max(0, 120vh - 271px). 我已经尝试了几种变体:

  • top: max(0, 120vh - 271px);
  • top: max(0, (120vh - 271px));
  • top: max(0, calc(120vh - 271px));

我的语法有问题吗?我一直让 Chrome 告诉我这是一个无效的属性错误。

Chrome 中显示的无效属性错误

在实践中,我实际上使用 CSS 变量来表示数字。所以120vh实际上是var(--height)或类似的东西。当我使用 CSS 变量时,该行没有做任何事情。它不应用样式,我没有收到任何警告。我在这里做错了什么?

我正在使用最新版本的 Chrome(我相信是 83),所以应该支持它。

Tem*_*fif 6

您需要添加一个单位,0否则浏览器会混淆处理无单位值和带单位值之间的比较:

top: max(0px, 120vh - 271px)
Run Code Online (Sandbox Code Playgroud)

要理解这一点,您需要遵循规范

min()max()功能包含一个或多个以逗号分隔的计算,并表示它们中的最小(最负)或最大(最正的),分别。

然后进行计算:

calc() 函数包含单个计算,它是一个散布运算符的值序列,并可能按括号分组(匹配<calc-sum>语法),

所以基本上所有的规则都calc()适用于min()/max()并且0是无效的

注意:因为<number-token>s 总是被解释为<number>s 或<integer>s,<length>所以在calc(). 也就是说,width:calc(0 + 5px);是无效的,即使 width: 0; 和宽度:5px;是有效的。参考

相关:为什么在方程中使用 0 时 css-calc() 不起作用?

您可能会感到惊讶,但使用top:0有效而top:calc(0)无效。为了使后者有效,它需要是top:calc(0px). 相同的逻辑min()/max()

值得注意的是,这同样适用于,clamp()因为它等价于max(MIN, min(VAL, MAX))