在测试一些新的布局时,我发现自己一度写作
.test1 {width: calc(50% + 0);}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,它没有用.
在验证我在任何地方都没有拼写错误后,我被迫得出结论,浏览器拒绝了这个错误.然后我想也许这是我测试的浏览器中的一个缺陷,但另一个表现相同!
那么这个表达的错误是什么呢?错误在哪里?
p {border:2px solid green}
.test1 {width:calc(50% + 0);} /* wrong! */
.test2 {width:calc(50%);} /* OK */
.test3 {width:calc(50% + 0px);} /* also OK */
Run Code Online (Sandbox Code Playgroud)
<p class="test1">test 1</p>
<p class="test2">test 2</p>
<p class="test3">test 3</p>
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,让我向你保证,我无意在生产代码中使用它;这只是测试中出现的内容.)
Man*_*mar 13
这是由于类型检查
在+或- ,检查两侧具有相同的类型,或者一面是
<number>
,另一个是一个<integer>
.如果双方都是同一类型,请解析为该类型.如果一方是a<number>
而另一方是a<integer>
,请解决<number>
.如果操作员未通过上述检查,则表达式无效.
您当前的代码有两个值,50%是a percentage
,0是integer
/ number
.它不确认类型检查的规则.
对于Poke的评论:
来自计算值的参考
如果百分比未在计算值时解析,则它们不会在calc()表达式中解析,例如calc(100% - 100%+ 1em)解析为calc(0%+ 1em),而不是calc(1em).如果存在用于计算值中的百分比的特殊规则(例如,高度属性),则只要calc()表达式包含百分比,它们就会应用.
注意:因此,calc()表达式的计算值可以表示为维度的数字或元组和百分比.
所以可以说这50% + 10px
是类型检查的一个例外,它包含在本文的计算值部分中.
这是因为,表达式(50% + 0
)由两种不同的类型组成.
您可能会认为这50%
是一个百分比并且0
是一个整数/数字,并且不应该确认类型检查的规则.但这不正确.不要混淆它units
.px, em, %
都units
在的length
类型dimension-token
.units
允许两种不同,但必须相同type
.types
不允许两种不同的方式.
数学表达式具有已解析的类型,它是其中之一
<length>, <frequency>, <angle>, <time>, <number>, or <integer>
.已解析的类型必须对放置表达式的位置有效; 否则,表达式无效.表达式的已解析类型由其包含的值的类型确定.<number-token>
是类型的<number> or <integer>
.A<dimension-token>
的类型由其单位给出(cm是<length>
,deg<angle>
等).
你表达的左侧:50%, 50px, or 50em
是所有 units
的length
类型加以<dimension-token>
小号,和你表达的右侧:0
是一种integer
类型,是一个<number-token>
.
正如@Manoj所提到的,+
或-
运算符明确地将操作数限制为相同类型,即length
或者time
或者number-token
s.
后面的上面的参考:
在
+
或-
,检查双方是否具有相同的类型,或者一方是a<number>
,另一方是a<integer>
.如果双方都是同一类型,请解析为该类型....
总结:
50% + 0px ? Both are of the same type i.e. 'length
50% + 0 ? Left is 'length' type and the right is 'integer' type.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
877 次 |
最近记录: |