CSS压缩器会清除零值(px、ms、em)的单位

5
在combres文件中,我使用了 defaultCssMinifierRef="msajax"
该压缩程序将所有零值的单位(px,em,ms)删除。 但是 0ms 不同于 0s。如果我需要在最小化后保留单位,该怎么办?

2
00ms之间有什么区别? - alex
2
0em、0px和0之间没有任何区别。 正确的语法是不带单位的0。 你为什么认为它们不同呢? - İbrahim Duran
2
即使单位不同,零值仍然表示零,在这些情况下,单位并不重要(无论单位是用来测量时间还是空间)。 你的设计在缩小后是否会出现问题?你有这方面的问题吗? 更详细的描述您的问题将有所帮助。 - zeropaper
除了频率值之外,没有任何区别:https://developer.mozilla.org/zh-CN/docs/Web/CSS/frequency - Fabrizio Calderan
1
@Andrea CSS中的calc()函数在0值上也需要一个单位,否则会失败。似乎除了Cloudflare之外的每个压缩器都有这个问题 ;) - dhaupin
显示剩余5条评论
2个回答

5
单位标识符只有在长度为零时才能省略。其他单位即使为零值也需要单位标识符,其中包括empx等。目前存在争议是是否最好加上它(请参见这个问题这一个)。在长度为零的情况下,代码压缩程序将删除并应该删除长度的单位标识符。在这里可以查看规范

对于零长度,单位标识符是可选的

非长度类型的值,无论是否为零,都需要单位标识符。如果代码压缩程序移除了非长度类型的单位标识符,例如用作属性transition-duration的值中的ms,则这是代码压缩程序的错误。

那么,解决问题的最佳方式是更改代码压缩工具吗? - Marina Kolesnikova
1
是的。但是,我没有直接测试过YUI压缩器,但我尝试了一些在线版本,它没有移除“ms”。你确定它可以删除“ms”,而不仅仅是长度单位标识符吗? - user663031
抱歉,我错了。我使用了msajax minificator。当我将其改为yui时 - 问题得到了解决。 - Marina Kolesnikova
但我应该使用msajax缩小器,你能告诉我如何做吗? - Marina Kolesnikova
但我刚刚下载了它,它并没有删除时间单位标识符。所以你能否再仔细检查一下,看看它正在删除你认为不应该删除的内容? - user663031
显示剩余2条评论

0

你不需要使用单位来保存0值。

在CSS中,使用没有单位的0与使用带有单位的0是相同的。 例如,你可以使用top: 20px将元素放置在距离顶部20像素的位置,具体取决于其位置。

如果你使用top: 0,浏览器会将其转换为top: 0px,因此你不必担心这个问题。

编译器只会去掉值中的单位,例如0px0em,因为它们是多余的,可以直接使用0代替。

如果编译器去掉了top: 20px中的值,这会导致问题,因为渲染引擎无法确定它是top: 20rem还是top: 20px,这两者之间存在明显的差异。

从具有单位的0值中去除单位实际上是一个优势,因为需要发送到网络的字节数更少,这只是非常微小的,但由于它是自动处理的过程,对于开发人员来说并不会有任何成本(例如考虑手动从单位中删除0值)。

然而,正如@torazaburo在评论中指出的那样,也有例外情况。在CSS中,例如100ms0.1s的时间需要一个单位,但正如@torazaburo所指出的,这也会被缩短器自动处理,将像100ms这样的内容缩短为0.1s以节省字节。


根据链接:仅当存在<length>值而不是<frequency>时,零值才可以无单位编写。 ms是频率,所以在这种情况下我需要为0加上单位吗? - Marina Kolesnikova
这是错误的。transition-duration: 0; 是无效的,它需要一个时间单位。 - user663031
此外,你提到网络字节的观点是无关紧要的,因为缩小器会根据需要进行剥离/压缩。例如,缩小器将把 0ms 转换为 0s,以节省一个字节,同时保留时间所需的单位。 - user663031
顺便说一下,ms不是频率,它是时间。但是时间仍然需要一个单位,比如sms - user663031
4
IE 10/11存在一个flexbox错误,需要为flex-basis值指定一个单位。例如:flex: 1 0 0px;。详情请参见:https://github.com/philipwalton/flexbugs#flexbug-4 - nils
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接