为了获得最快的速度,应该按什么顺序列出 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 属性? 的相关文章

  • 继承子节点的高度(A内的IMG)

    我的电脑上有一个漂亮的 CSS a 标签 放一个 img 链接内部使图像粘在链接外部 a 块 尽管它仍然可以点击 但看起来很愚蠢 改变 a to display block or float left修复了这个问题 但有一个不良的情况not
  • 缩放对象上的弹跳动画

    拥有对象比例 然后在返回到原始比例因子之前以该比例因子执行弹跳动画的最佳方法是什么 我意识到我可以做一些事情 比如将其缩放到 2 2 然后 1 8 然后 2 0 但我正在寻找一种方法 您只需在比例因子上执行弹跳动画 因为我的比例因子会改变
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • SVG 沿圆弧添加文本

    我正在尝试绘制 SVG 径向饼图 如下所述 色卡 https stackoverflow com a 18210763 1395178 现在我尝试将文本与圆弧一起添加到每个切片 我试图展示Text 1具有与 M 和 A 值完全相同的 x y
  • 在高负载站点中使用 PHP 的策略

    在你回答这个问题之前 我从未开发过任何足够流行的东西来达到高服务器负载 把我当作 叹气 一个刚刚登陆地球的外星人 尽管我了解 PHP 和一些优化技术 我正在开发一个工具PHP如果效果好的话 可以吸引相当多的用户 然而 虽然我完全有能力开发该
  • 电子邮件通讯未正确呈现

    我是 CSS 和 HTML 新手 我有一个包含 HTML 和 CSS 代码的电子邮件模板 我在新闻通讯模板的右上角放置了一个粉色圆圈框 http www pedersenshotell se newsletter http www pede
  • 是否可以使 Font Awesome 图标大于“fa-5x”?

    我正在使用这个 HTML 代码 div class col lg 4 div class panel div class panel heading div class row div class col xs 3 i class fa f
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 停止 CSS 动画但让其当前迭代完成

    我有以下 HTML div class rotate div 以及以下 CSS webkit keyframes rotate to webkit transform rotate 360deg rotate width 100px hei
  • 为什么删除 else 会减慢我的代码速度?

    考虑以下函数 def fact1 n if n lt 2 return 1 else return n fact1 n 1 def fact2 n if n lt 2 return 1 return n fact2 n 1 它们应该是等价的
  • 清理 CSS 抖动

    我已经构建了这些圆圈 当鼠标悬停时它们会扩展边框 我现在遇到的唯一问题是有时圆圈会抖动 摇晃 当我设置transition all 1s ease in out 超过 0 2 秒 有解决这个问题的方法吗 还是事情就是这样 这是其中的代码Js
  • 在 Bootstrap 3 中将容器类嵌套在容器流体类中?

    除了填充问题之外 为什么不建议将 container 嵌套在 container fluid 中 如果将子容器填充归零 如下面我的代码所示 则效果与拥有一个容器相同 此外 如今 不同的全宽和固定宽度布局似乎很常见 我知道文档说了什么 LIN
  • C# html-helper 扩展现有方法而不覆盖?

    我已经搜索过这个问题并发现可能answer https stackoverflow com questions 11232041 how to create an html helper to extend textboxfor to ad
  • 将一个 div 放置在另一个 div 的底部

    我有外部 div 和内部 div 我需要将内部 div 放在外部 div 的底部 外层div是有弹性的 例如宽度 70 我还需要将内部块居中 所述化妆的简单模型如下图所示 已在 Firefox 3 Chrome 1 和 IE 6 7 和 8
  • 使用边距与填充? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近开始自己在线学习周三开发 并且是这个领域的新手 所以对我的基本查询表示歉意 我知道边距和填充之间的区别 用逻辑术语 但不太确定 何时应该使
  • .NET 程序集大小会影响性能吗?

    net 程序集的大小是否会影响性能 您的 Windows 窗体 Web 窗体项目中的程序集数量如何 来自微软的模式和实践提高 NET 应用程序性能和可扩展性 http msdn microsoft com en us library ms9
  • jQuery 面板滑块通过单击按钮打开但不会关闭

    我的页面上有一个按钮 可以使用 jquery 和 Modernizr 框架打开右侧面板 按钮位于屏幕最右侧 单击时 它会向左滑动并打开打开的面板 问题是 再次单击时它不会滑回到原来的位置 HTML div class cd panel fr
  • IE 中的文件上传按钮和奇怪的文本光标行为

    我构建了一个上传按钮 其格式类似于典型的 html 按钮 而不是浏览器标准文件上传表单 该方法是设置锚元素的样式并在顶部覆盖透明文件输入元素 这种方法在除 IE 之外的所有浏览器中都可以正常工作 在 IE 中 当用户单击上传按钮时 会出现一
  • 如何将外部 div 的高度设置为始终等于特定内部 div 的高度?

    我有一个外部 div 其中包含三个内部 div 我希望最左边的内部 div 始终确定外部 div 的高度 如果其他内部 div 的内容 比最左边的 div 少 它们将有空白空间 如果他们有更多的内容 比最左边的div 他们将得到一个滚动条
  • 更改 CSS 样式表的选择器属性

    以下是我们传统上如何更改重复元素的样式 将样式应用到每个元素 function changeStyle selector prop val var elems document querySelectorAll selector Array

随机推荐

  • 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动画片 如果您想最大限度地提高渲染速度 您应该按什么顺序列出