您应该以什么顺序列出CSS属性以获得最快速度?

时间:2017-05-11 05:40:43

标签: performance css3 processing-efficiency css-parsing

让我们取一些CSS属性并将它们随机放在我们的CSS文件中:

  

轮廓
  伪元素
  颜色属性
  背景和边界属性
  箱子属性
  灵活的盒子布局
  文字属性
  文字装饰属性
  字体属性
  写作模式
  表属性
  列表
  动画

如果你想最大化渲染速度,你应该以什么顺序列出你的CSS属性?

1 个答案:

答案 0 :(得分:4)

简短的回答是:没关系。

详细说明:假设您将实现浏览器 1 并进入解析CSS的部分。你会怎么做?好吧,有一个grammar的CSS,所以你用它来tokenize样式表,构建一个ASTparse样式表。这种方法意味着在开始实际解释样式表之前,您需要阅读所有 2 。也就是说,将选择器应用于您的DOM(也是您解析的内容,但是来自HTML源而不是CSS),然后将规则应用于与这些选择器匹配的元素。请注意,到目前为止我们所做的一切只是修改数据结构的状态。我们在元素上存储应该的样子。

完成后,layout阶段就可以开始了(对于现代CSS,由于flexible boxgrid布局,这更加困难)。这听起来很简单:计算每个元素最终会在页面上的位置。它不是,但假设我们是伟大的程序员,对我们需要遵守的规范有透彻的了解,所以我们可以做到这一点。我们需要知道什么?那么,适用于所有元素的所有规则。就这么简单。我们无法计算布局,然后从解析器中学习“哦等等,我忘了,这个元素一直在HTML源代码的开头实际上是positioned absolutely,所以你应该重新开始定位“。因此,我们需要处理样式表中的所有内容。我们了解规则的顺序无关紧要

好像这还不够,我们浏览器的下一个阶段就是绘制所有内容,这也是非常重要的。您是否对构建自己的浏览器感到兴奋?

如果您对主要浏览器如何实现所有这些感兴趣,您可以查看他们的引擎。我根本不熟悉那些,但我知道它们......令人生畏。

所以,ye be warned

•Chrome(Chromium)使用Blinksource code,从WebKit分叉)。
•Edge使用EdgeHTML(从Trident分叉) •Firefox使用Geckosource code),但正在使用名为Servosource code)的新引擎。
•Internet Explorer使用Trident •Opera使用Blink(在Opera 15之前使用Presto) •Safari使用WebKitsource code)。

我尽可能多地包含了源代码的链接,但是一些浏览器引擎是专有的。 Presto的来源不久前泄露了,但我不会在这里链接。你也许能找到它。

免责声明:我只是略微构建了一个浏览器。我没有讨论交互性,实现JavaScript引擎,发出HTTP请求,调试工具,GUI设计和实现等等。 3 构建浏览器只是用来在这个答案中有一个故事。如果您真的对构建浏览器感兴趣,那么考虑这些优秀资源 4 不要。相反,如果它是开源的,请为您喜爱的浏览器的开发做出贡献!

想要了解更多信息?
This Mozilla Hacks article可以很好地解释渲染引擎的工作原理 它还包括漂亮的图纸!

____________________
   1 你不想这样做。认真。这是很多的工作。但是,说你愿意。
   2 除非您愿意使用AST 构建它。但这很难并容易出错。它最终也不会给你带来太大的收获,我们稍后会看到。
   3 这在this Mozilla Hacks blog post中有更详细的讨论    4 从来没有,你不需要查看这篇文章的修订历史。这只是个玩笑   对不起,如果你觉得它很蹩脚。