在编写 CSS3 属性时,现代的智慧是将“真实”属性放在最后,将供应商前缀放在前面
.not-a-square {
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
为什么这种属性排序方法是 如此普遍地被教授?以下是“错误方法”的样子
.not-a-square {
border-radius: 10px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
}
即使使用“错误方法”,边框半径永远不会相同吗?快速调查可能会让你得出结论,它会相同,这种属性排序是毫无意义的。
- 很久以前:没有任何属性被支持,顺序无关紧要。
- 过去:只支持供应商前缀,顺序无关紧要。
- 现在:供应商前缀和实际属性都得到支持。如果前缀在最后,它将覆盖实际属性,但两者都是相同的。
- 未来:只支持实际属性,顺序无关紧要。
这是一个简单的图表,其中包含此概念的实际应用。
等等,牛仔
事实上,CSS3 属性的排序很重要,以上说法从根本上是有缺陷的。“现在”正是问题所在。我们正处在浏览器历史的关键时刻,一些浏览器同时支持供应商前缀版本和实际 CSS3 属性。目前,具体来说是 WebKit 正在这样做,他们实现它的方式是,如果你将供应商前缀列在实际属性之后,供应商前缀将覆盖并成为渲染的属性。
为什么这很重要?在我们上面看到的简单的 border-radius 示例中,无论哪种方式,该元素的角都会有 10px 的边框半径。供应商前缀和“真实”属性在仅设置一个值时处理圆角的方式没有区别。问题在于,当传递多个值时,属性实现之间存在差异。
.not-a-square {
/* These do totally different things */
border-radius: 30px 10px;
-webkit-border-radius: 30px 10px;
}
规范或“真实”版本将渲染左上角和右下角为 30px,渲染右上角和左下角为 10px。供应商前缀将渲染所有四个角为宽度 30px、高度 10px 的椭圆角。
因此,如果你一直盲目地将真正的border-radius
放在属性列表的末尾,使用相同的数值,然后从 Safari 4 切换到 Safari 5,你将会看到上述代码对你的框进行样式的方式发生了巨大变化。
你可以通过调整数值来修复这个问题,以确保它们做相同的事情……但是,如果你要调整任何东西,你也可以调整真正的属性,因为这将在未来被支持。将真正的属性放在最后绝对是最好的做法。因为它将完全基于规范,它将与其他浏览器的实现相匹配,并且随着时间的推移,供应商前缀被移除后,它将成为唯一支持的版本。
边框半径并非唯一的例子。请注意 background-image
渐变的显著不同的语法。现在还没有这些值的“真实”规范版本,但是如果有,实现将与我们现在使用的不同。这应该在属性排序中放在最后,以防范未来出现这种情况。
感谢 @mattwiebe 和 @snookca 帮助我更好地理解这一点。
感谢您的提示!!
以前不知道。谢谢您。
很好的提示,Chris,非常感谢
使用 CSS3 可以做很多很棒的事情,但这是对带宽的浪费。
Chris,您知道您的标题字体总是需要一两秒才能改变吗?看起来也很奇怪。
并不完全正确!CSS3 之于 CSS,就像盐之于烹饪。使用得当,它可以真正使某物从平庸变为非凡。过度使用会导致所有其他投入的努力付诸东流。
太棒了!这是一个很棒的比喻。
Lars。我同意它添加了这一点。
我只是觉得很沮丧,我们需要编写四个 (!) 属性才能获得圆角,而 CSS 实际上很精简。
我相信 Bego 知道这一点——这是一个大家似乎都能接受的缺陷!稍微加载自定义字体需要一点时间,这并不涉及图像替换,也不是 Times New Roman?我很乐意。
我同意杰克。
这就像抱怨图像加载。字体和图像都需要时间加载。话虽如此,字体可以被压缩,这将大大减少时间。
我喜欢 Chris 的作品,从他的屏幕录像中学到了很多,当然不想抱怨。只是有时,如果你不在自己的 Mac 上,网页设计的工作方式就不同了(指的是下载时间和浏览器兼容性)。
无论如何,我现在明白了:这不是一个错误,而是一个功能。:-)
是的,基本上是这样。虽然我同意带宽在某种程度上“浪费”了,但我们谈论的是毫秒级的微不足道的程度,它几乎可以忽略不计。编写四个独立的属性比带宽更浪费时间,所以我同意。
总而言之,如果您的设计技巧足够好,在 CSS 文件中添加几行额外的代码应该不会产生任何影响。:)
可能在您的屏幕上,但我立即看到了正确的字体。
这被称为 FOUT。如果真的让您心烦,请尝试使用 Webkit 而不是 Firefox。
前缀或后缀 由 Eric Meyer 撰写,这是一篇关于这个问题以及为什么它实际上不是带宽浪费的好文章。
有一个官方的渐变规范,它与 Mozilla 的语法类似:http://dev.w3.org/csswg/css3-images/#linear-gradients
Chris,我以前不知道!非常感谢您的提醒。您是在进行重新设计时发现的这个问题,它的非对称标签很漂亮吗?还是您以前就知道?
另外,我真的很讨厌在 Safari 中填写整个评论表单,然后发现(因为我上次忘记了)它无法工作。如果您有空闲时间(哈哈!我知道那是个难以捉摸的生物),可以查看一下吗?
Jessi,您能帮我录制一下这个问题吗?比如使用 screenr.com 之类的工具?我经常使用 Safari,其他人肯定也是,而且我只从您那里听到过这个问题!我确信它是真实存在的,我只是没有可以用来开始排查故障的东西。
嗨 Chris,
如果其他人没有看到或提到过这个问题,很明显,这只是我的问题,如果是这样,我为打扰您道歉!
请不要花时间在上面。我会看看是否可以自己解决,如果/当我解决后,我会汇报的。
测试,测试,使用新的 Safari 5.0.2。
嘿,现在可以用了!苹果已经修复了这个问题。更新说明中提到修复了可能阻止用户提交表单的错误。
奇怪的是,其他人没有遇到过这个问题……
正确的方法是
.not-a-square {
-moz-border-radius: 10px;
border-radius: 10px;
}
WebKit 支持没有供应商前缀的版本。它已经支持了几周了。Chrome(5 和 6)和 Safari 都是如此。
没错,但是,例如,Safari 4 仍然需要它,所以如果您试图支持尽可能多的浏览器,您仍然需要使用 -webkit-
我很高兴你指出了这一点,因为我和@mingos 有一样的想法。我甚至没有意识到忽略 webkit 浏览器扩展会降低对 Safari 4 的支持。谢谢!
很棒的文章!
我一直这样排列我的 CSS3 属性,但很高兴看到如此深入的解释,说明为什么这是良好的实践。
太棒了!我一直用“正确”的方式做,但没有考虑到那些椭圆形的角落。那会让我彻底疯掉!
我一直使用<a href="http://incident57.com/less/"Less.js 在过去的一周左右的时间里写了一些 css。真的让那些浏览器前缀不那么繁琐。
是的,LESS 很棒,虽然我使用的是 PHP 版本。它保证即使有人决定禁用 JavaScript 也会正常工作;)
哦,LESS 还存在一个问题:M$IE 黑客无法正确解析。在某些情况下,一些花哨的 CSS3 东西也无法正常解析。
糟糕...漏了一个括号 Less.js
非常及时 - 我今天正在用 border-radius 和 box-shadow 做一些事情。我从未意识到这种区别!幸运的是,我已经在最后包含了“真正的”属性。
嘿,我刚查看了您的网站,除非您刚刚极简化,否则您的网站存在一些 CSS 问题!
它看起来相当有意……那是 WordPress 的 Sandbox 主题。
简洁的帖子。我很想看到更多关于 css3 和 html5 的快速提示。
是的,我完全同意!
你的论点很有道理,也许我能自己想明白这一点,但我没有把我的 css 表中的顺序看得太重要,而且快速打字总是让我忽略这些细节。
谢谢,这对于跟踪 CSS3 非常重要!我会在 MyWord 中使用它 :)
我同意盐的比喻,CSS3 的点缀会给设计项目带来那么一点额外的东西。LT
与之相关的是,我发现 Firebug 喜欢自动按字母顺序对新的 css 属性进行排序,这让我很恼火。
我以前用的是错误的方式……哇
感谢您的解释!
我同意上面许多评论,比如
-- 盐的比喻很好
-- 一个非常好的、有用的、简短的提示
-- 我也不知道,我一直做错了
谢谢
我觉得这个关于 web 设计的博客很有趣,而且应用程序确实很棒。
啊……现在要更改我所有的样式表了。我发誓,我的 CSS 变乱的原因仅仅是因为所有的 CSS3 最佳实践都在不断变化。
我认为我从现在开始要用 PHP 来提供 CSS3 东西,以防止出现这些问题。类似于 LESS,但没有那么多花哨的东西。
:: -moz-selection 和 ::selection 也应该按照这种方式排序,还是没有区别?
很棒的技巧,我需要在我的网站上做一些修改。
很棒的文章!我来自巴西,我一直关注你的作品,我总是在你那里学到新东西,恭喜你。
太棒了
感谢您的快速提示。
很棒的提示。
在 Opera 中所有都正常工作,FF4 中所有都正常工作,这个 bug 只存在于 Safari/Chrome 上!
太棒了!这很有趣。我们可以通过使用这个 css 来节省更多时间。
不错的...以前不知道。