为了获得最快的速度,应该按什么顺序列出 CSS 属性?

2023-12-22

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

outline
伪元素
颜色属性
背景和边框属性
框属性
灵活的盒子布局
文本属性
文本装饰属性
字体属性
书写模式
表属性
Lists
动画片


如果您想最大限度地提高渲染速度,您应该按什么顺序列出 CSS 属性?


简短的回答是:没关系。

 

To elaborate on that: Say you would implement a browser1 and get to the part where you parse CSS. How would you do that? Well, there is a grammar https://www.w3.org/TR/css-syntax-3/ of CSS, so you use that to tokenize https://en.wikipedia.org/wiki/Tokenization_(lexical_analysis) the stylesheet, build an AST https://en.wikipedia.org/wiki/Abstract_syntax_tree and parse https://en.wikipedia.org/wiki/Parsing the stylesheet. This approach means that you would need to read everything2 before you can start to actually interpret the stylesheet. That is, apply the selectors to your DOM (also something you parsed, but from the HTML source instead of the CSS) and then apply the rules to elements matching those selectors. Note that everything we are doing so far is only modifying state of our data structures. We store on our elements what they should look like.

完成后,layout https://www.w3.org/TR/css-position-3/阶段就可以开始了(对于现代 CSS,这更加困难,这要归功于柔性盒 https://www.w3.org/TR/css-flexbox-1/ and grid https://www.w3.org/TR/css-grid-1/布局)。听起来很简单:计算每个元素在页面上的最终位置。事实并非如此,但假设我们是优秀的程序员,对我们需要遵守的规范有透彻的了解,所以我们可以做到这一点。我们需要知道什么?好吧,所有规则都适用于所有元素。就这么简单。我们无法计算布局然后从解析器中了解到“哦等等,我忘了,HTML 源代码开头的这个元素实际上是绝对定位 https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Positioning#Absolute_positioning,所以你应该重新开始你的定位”。因此,我们需要处理样式表中的所有内容。我们了解规则的顺序不要紧.

好像这还不够,我们的浏览器的下一阶段将是绘制所有内容,这又是不平凡的。您对构建自己的浏览器感到兴奋吗? ????

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

So, 请注意 http://pirates.wikia.com/wiki/Pirates_Ye_Be_Warned_sign.

&子弹;铬(Chromium)用途Blink https://en.wikipedia.org/wiki/Blink_(web_engine) (源代码 https://chromium.googlesource.com/chromium/blink/+/master,分叉自WebKit https://en.wikipedia.org/wiki/WebKit).
&子弹;边缘用途EdgeHTML https://en.wikipedia.org/wiki/EdgeHTML(分叉自Trident https://en.wikipedia.org/wiki/Trident_(layout_engine)).
&子弹;火狐使用Gecko https://en.wikipedia.org/wiki/Gecko_(software) (源代码 https://github.com/mozilla/gecko-dev),但正在开发一种名为Servo https://en.wikipedia.org/wiki/Servo_(layout_engine) (源代码 https://github.com/servo/servo).
&子弹; Internet Explorer 使用Trident https://en.wikipedia.org/wiki/Trident_(layout_engine).
&子弹;歌剧用途Blink https://en.wikipedia.org/wiki/Blink_(web_engine) (used Presto https://en.wikipedia.org/wiki/Presto_%28layout_engine%29歌剧 15 之前)。
&子弹; Safari 使用WebKit https://en.wikipedia.org/wiki/WebKit (源代码 https://github.com/WebKit/webkit).

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

Disclaimer: I merely scratched the surface of building a browser. I haven't discussed interactivity, implementing a JavaScript engine, making HTTP requests, debugging tools, GUI design and implementation, et cetera.3 Building a browser is merely used to have a story in this answer. If you are actually interested in building a browser, consider these great resources4 don't. Rather, contribute to the development of your favorite browser, if it is open source!

 

想阅读更多内容吗?
&子弹;这篇 Mozilla Hacks 文章 https://hacks.mozilla.org/2017/08/inside-a-super-fast-css-engine-quantum-css-aka-stylo/对渲染引擎的大致工作原理有很好的解释。
它还包括漂亮的图画!

 

____________________
1 You don't want to do that. Seriously. It's a lot of work. But, say you would.
2 Except maybe if you would be willing to work with the AST while it is built. But that is hard and error prone. It also won't gain you much in the end, as we'll see later.
3 That is discussed in a little more detail in this Mozilla Hacks blog post https://hacks.mozilla.org/2017/05/quantum-up-close-what-is-a-browser-engine/.
4 There never were any, you don't need to check the revision history of this post. It's just a joke.
   Sorry if you find it a lame one.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为了获得最快的速度,应该按什么顺序列出 CSS 属性? 的相关文章

  • CSS 继承、别名和其他很酷的东西

    有一天 我随机浏览网页 发现了一些程序 可以让你编写 CSS 别名和其他很酷的东西 我现在不记得了 举个例子 我记得你可以这样做 myclass background color red greenfont 其中 greenfont 在其他
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在模态打开时防止主体滚动

    我在用着W3schools 模态脚本 https www w3schools com howto tryit asp filename tryhow css modal我想添加一个功能 防止模型打开时整个主体滚动 我根据我的需要对原始脚本做
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 使用 CSS 的响应式图像

    我发现调整图像大小以使其具有响应能力很棘手 我正在开发一个 php 应用程序来自动将网站转换为响应式版本 我有点被图像困住了 我已经成功地为网站上的每个图像添加了一个包装类 并且可以很好地调整图像的大小 我的问题在于自然小于窗口的图像 例如
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • Webpack 4:如何使用 LESS 获取 CSS 源映射?

    多年来我一直在尝试让 CSS 源映射在 webpack 中工作 但没有成功 我不确定链条中哪里出了问题 我希望有人能指出我正确的方向 这是发生的事情 行号是错误的 实际上文件名也是错误的 main less只是包含一堆 import也就是说
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • jQuery 生成 div 和碰撞检测

    所以我的学校作业项目快要结束了 我只是错过了两件我似乎无法弄清楚的主要事情 1 如何生成具有随机位置的间隙的管道障碍物 以便鸟可以飞过 尝试使用一个函数来更改间隙位置的管道 div 的 css right attr 并在以下情况下移除管道它
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出
  • 将 SVG 的高度设置为行高?

    我想将我的 SVG 图像作为图标包含在标题旁边 h1 img src icon sell svg class icon Verkaufen h1 字体大小为h1 is 36px和line heigt is 1 1 我使用检查器工具发现计算出
  • 使用反增量更改 z-index

    我尝试制作一个图像滑块 当鼠标悬停在一个点上时 它将显示图片 我也尝试使用在图像之间切换z index但什么也没动 slider counter reset index 1000 slider input name slide switch
  • 指南针字体输出错误的字体文件路径

    font face font family HelveticaNeueLTStd Lt src url css fonts HelveticaNeueLTStd Lt otf format opentype 这是我的指南针代码的输出 inc
  • 如何在 select2 下拉列表中换行?

    我正在使用 select 2 下拉菜单 然后在其内容中显示一些长句子 我想在句子的正确位置添加换行符 但下拉菜单是自动调整的 For example the content of the dropdown right now looks l
  • 如何在更大的 div 中垂直和水平居中一个 div?

    如何将一个 水平居中于另一个 中 我设法使用已接受答案中的样式水平居中 我怎样才能让它垂直居中 内部 div 的高度未知 https stackoverflow com questions 114543 how to center div
  • CSS 类命名约定

    在网页上 有两个控件块 主要和次要 大多数人会使用什么类名 选择一 div class primary controls div
  • 如何创建适合屏幕宽度的等宽/高框? [复制]

    这个问题在这里已经有答案了 我正在尝试建立一个网站 其中有很多宽度和高度相等的框 例如 我有一个页面 其中并排有两个相同大小的框 简单的解决方案是将宽度和高度设置为 50vw 这在出现滚动条之前效果很好 我已经用谷歌搜索了几个小时 但无法理
  • 在 HTML 下拉列表中有一个滚动条

    我正在寻找一种在 HTML 的下拉列表中添加滚动条的方法 这样如果下拉列表包含的内容超过例如 5 项 将出现滚动条以查看其余项 这是因为我将被迫列出一些大清单 过去几个小时我一直在谷歌上搜索它 但没有运气 它需要适用于 IE8 FF 和 C

随机推荐

  • CakePHP 保存外键问题

    我在将 用户 表的外键保存在另一个名为 基本 的表中时遇到问题 我试图向用户询问一系列问题 每个完成的系列问题和用户 ID 都应该保存到相应的表中 这是在模型中进行验证后保存我的数据的内容 验证成功 所有数据均已保存 但外键保存为 0 pu
  • 如何将Mandelbrot的每个像素计算划分到不同的节点上?

    我的问题是我应该使用什么数据结构将工作分配给每个线程并从中获取计算值 我首先想到的是用保存 x y 和 iterate value 的结构填充向量 0 向量 63999 对于800x800像素 将这些向量传递给每个节点 gt 然后将给定向量
  • 当元素数据更改时,jQuery data() 属性不会更新

    我想使用 jQuerydata api 用于检索元素的所有数据属性 但这个 api 的缓存性质确实很烦人 有时我需要更改 javascript 中元素的某些数据属性 但是data api 始终返回每个数据属性的初始值 所以我必须使用attr
  • 在python中创建具有一定宽度边框的图像

    我用过PIL back color width for x in range w for y in range h if x 0 or y 0 or x w 1 or y h 1 pixels x y back color 我需要向图像添加
  • 合并 pandas 数据框列表

    我有一个数据框列表 我需要使用唯一的列将它们合并在一起 date 字段名称不同 因此不能使用 concat 我可以手动使用df 0 merge df 1 on Date merge df 3 on Date 等等将每个df一一合并 但问题是
  • 即使用户允许,Gmail 也会隐藏外部电子邮件图像

    我正在尝试在 html 电子邮件中插入带有图像的签名 我在使用 GMail 时遇到一些问题 它在 iPhone 客户端上运行良好 在用户接受图像之前 它们的大小正确 并且替代文本可见 每个图像的 HTML 为 img alt Bonne w
  • 警告主要版本 52 比该编译器支持的最高主要版本 51 更新

    基本上我是超级新手 开始在IT公司实习 我用 Xamarin 安装了 VS 我面临的问题非常令人沮丧 因此 即使我创建空项目 我也无法编译它并收到如下错误 严重性代码 说明 项目文件行抑制状态 警告主要版本 52 比该编译器支持的最高主要版
  • 如何让 Eclipse 记住 Android SDK 位置?

    每当我尝试使用 Eclipse 创建新的 Android 项目 在空工作区中 时 构建目标 列表都是空的 因此 我需要取消 新建 Android 项目 对话框 然后转到首选项并重新输入 Android 的 SDK 位置 完成此操作后 我可以
  • Android:使用自定义视图从对话框中检索 EditText 值

    我使用 AlertDialog Builder 类创建了一个对话框 并调用 builder setView int resource 为其提供文本输入的自定义布局 当用户点击 确定 时 我试图从布局上的 EditText 检索值 但是当调用
  • 如何从div中删除class属性?

    我正在使用 JavaScript 如果单击按钮 我想添加 删除 Class 属性 我可以添加该类 但我不知道如何删除它 我怎样才能做到这一点 window onload function var buttonGo document getE
  • 何时使用表运算符 APPLY

    我试图理解表运算符APPLY 这是示例 CREATE TABLE y Name char 8 hoursWorked int GO INSERT INTO y VALUES jim 4 INSERT INTO y VALUES michae
  • 类型错误:无法读取 Proxy.$_setUpEditorEvents 处未定义的属性(读取“模型”)

    我正在尝试将 CKEditor 5 与 Laravel 中的 Inertia 应用程序一起使用 但在遵循文档后 我收到以下错误 索引 vue file
  • 将证书导入 VisualSVN 服务器

    是否可以将安装了VisualSVN的Windows Server的有效证书导入到VisualSVN中 阅读文章KB134 为 VisualSVN 服务器配置 SSL 证书 https www visualsvn com support to
  • clojure.lang 真的只是实现细节吗?

    在 Clojure 中 一些任务 例如实例化PersistentQueue https github com clojure clojure blob master src jvm clojure lang PersistentQueue
  • 如何在控制台应用程序中使用 System.Web.Caching.Cache?

    上下文 Net 3 5 C 我想在我的控制台应用程序中拥有缓存机制 我不想重新发明轮子 而是想使用System Web Caching Cache 这是最终决定 我不能使用其他缓存框架 不要问为什么 然而 看起来像System Web Ca
  • learnyounode Node.js 教程的 console.log 以错误顺序打印语句

    我正在做一个GET请求 存储数据 然后注意到响应已结束 我有一个console log一条语句表示我完成接收数据时的情况 另一条语句表示程序完成时的情况 见下文 var a 1 var b 10e9 http get process arg
  • WebDriverIO Selenium 将命令行参数从 config.js 文件传递​​到 Chrome

    我需要 chrome 来运行我的 UI 测试的禁用网络安全标志 如何使用 wdio config 文件注入任何命令 http webdriver io http webdriver io capabilities browserName c
  • 如何按枚举值对对象进行排序?

    我有Workout与 一起上课Difficulty财产 enum Difficulty String case easy easy case moderate moderate case hard hard class Workout va
  • Cloud 9 IDE 中有离线模式吗

    我现在工作的地方网络一直断线 Cloud 9 IDE 中是否有离线模式 通过该模式 我可以提前缓存 预下载所有源文件 如果网络暂时中断 我可以继续工作 并在网络恢复时同步更改 Thanks 这是一个重要的用例 我们尚未提供此功能 并且正在考
  • 为了获得最快的速度,应该按什么顺序列出 CSS 属性?

    让我们获取一些 CSS 属性并将它们随机放置在 CSS 文件中 outline伪元素颜色属性背景和边框属性框属性灵活的盒子布局文本属性文本装饰属性字体属性书写模式表属性 Lists动画片 如果您想最大限度地提高渲染速度 您应该按什么顺序列出