您现在的位置是:网站首页> 编程资料编程资料
CSS代码编写的一些性能优化技巧总结深入理解CSS @font-face性能优化网站前端性能优化之javascript和css篇CSS性能优化提高css性能的方法 网站性能优化之CSS无图片技术CSS 网站性能优化笔记对css性能优化的一点看法css性能优化-will-change使用详解
2023-10-22
167人已围观
简介 这篇文章主要介绍了CSS代码编写方面的一些优化技巧总结,谈到了包括避免通用规则和后代选择器等方面来使代码更加高效,需要的朋友可以参考下
CSS规范并没有明确浏览器如何去实现样式系统,仅仅是说明了它们必须这样做。有鉴于此,不同的样式系统引擎可能会拥有完全不同的表现和行为,特别是 Gecko 与 WebKit, 这两个引擎都是开源项目,实现了类似的算法,具有极其相近的优缺点。因此下面介绍的小技巧对于真实世界的 Web 文档将会十分有用。
第一部分内容综合讨论了常见的样式系统是如何分类规则的。接下来的部分包含了书写规则的指南,它利用了前面讨论的样式系统的优点。
样式系统如何拆分规则
样式系统将规则拆分成四个主要类别:
1.ID 规则
2.Class 规则
3.标签规则
4.通用规则
理解这些分类是十分关键的,因为它们是构建规则匹配块的基础。
我在下面的段落中使用术语 关键选择器(key selector)。选择器的最后面的部分即为关键选择器(即用来匹配目标元素的那部分,而不是该元素的祖先元素)。
例如,在下面规则中…
- a img,
- div > p,
- h1 + [title] {
- …
- }
关键选择器为 img、 p 和 title.
ID 规则
这第一个类别包含了那些将 ID 选择器作为关键选择器的规则。
示例
- button#backButton {…} /* This is an ID-categorized rule */
- #urlBar[type="autocomplete"] {…} /* This is an ID-categorized rule */
- treeitem > treerow > treecell#myCell:active {…} /* This is an ID-categorized rule */
Class 规则
如果一个规则将一个 class 明确作为它的关键选择器,那么它就属于该类别。
示例
- button.toolbarButton {…} /* A class-based rule */
- .fancyText {…} /* A class-based rule */
- menuitem > .menu-left[checked="true"] {…} /* A class-based rule */
标签规则
如果既没有 class 也没有 ID 来明确作为关键选择器,那么接下来的候选者就是 标签 类别。 如果一条规则将一个标签作为它的关键选择器,那么这条规则就属于该类别。
示例
- td {…} /* A tag-based rule */
- treeitem > treerow {…} /* A tag-based rule */
- input[type="checkbox"] {…} /* A tag-based rule */
通用规则
不属于上面那些类别的规则都属于这个类别。
示例
- [hidden="true"] {…} /* A universal rule */
- * {…} /* A universal rule */
- tree > [collapsed="true"] {…} /* A universal rule */
样式系统如何匹配规则
样式系统从关键选择器开始匹配规则,然后左移(查找规则选择器的任何祖先元素)。只要选择器的子树(substree)一直在检查,样式系统就会持续左移,直到和规则匹配,或者是因为不匹配而放弃该条规则。
规则过滤是你需要学习的最基础的概念。分类存在的意义就是过滤掉无关的规则(这样样式系统就不会浪费时间去匹配它们了)。
这就是能够极大提高性能的关键。对于一个给定的元素,需要匹配的规则越少,样式的解析就会越快。
举个例子,如果一个元素拥有一个 ID,那么只有匹配该 ID 的 ID 规则才会被选中。同理,只有当 Class 规则中的 class 出现在元素上时该规则才被检查。只有当标签规则的标签匹配时该规则才被检查。通用规则始终都会检查。
高效 CSS 指南
避免通用规则
请确保规则不以通用类型选择器作为结束!
不要用标签名或 classes 来限定 ID 规则
如果规则拥有 ID 选择器作为其关键选择器,则不要为规则增加标签名。因为 ID 是唯一的,增加标签只会没必要地减缓匹配过程。
差
- button#backButton {…}
差
- .menu-left#newMenuIcon {…}
好
- #backButton {…}
好
- #newMenuIcon {…}
例外:在不同的场景下,要动态改变元素的class,从而应用不同的样式,这是可取的。但是这个相同的class是与其他元素所共享的。
不要用标签名限定 class 规则
前面那节内容在这里同样适用。虽然在同一页面能够多次使用 class,但它仍然比标签名更独特。
按照惯例,你可以将标签名包含在 class 名里。但是,这会有损灵活性;如果设计更改以至于要变更标签,这条class 名也必须跟着变动。(最好的办法是选择严格语义化的名字,毕竟分离样式表的一个目标就是为了灵活性。)
差
- treecell.indented {…}
好
- .treecell-indented {…}
棒
- .hierarchy-deep {…}
尽量使用最具体的类别
解析速度变慢的罪魁祸首就是标签类别中有过多的规则。通过增加 class 到元素上,我们就可以进一步的将这些规则划分到 Class 类别中,这将减少用于匹配标签的时间。
差
- treeitem[mailfolder="true"] > treerow > treecell {…}
好
- .treecell-mailfolder {…}
避免后代选择器
后代选择器是 CSS 中性能耗用最大的选择器。 它是性能开销相当大的——特别是当选择器在标签或通用类别中。
通常我们需要的是 子选择器。比如说,当性能十分差的时候,Firefox 的用户界面CSS 将毫无理由的禁止掉后代选择器。你也应该在网页中这么做。
差
- treehead treerow treecell {…}
略好,但还是差(查看下一条指南)
相关内容
- 使用CSS3实现多列布局与多背景的技巧CSS3实现多背景模拟动态边框的效果CSS3点击按钮实现背景渐变动画效果CSS3条纹背景制作的实战攻略用CSS3实现背景渐变的方法css3中背景尺寸background-size详解使用CSS3的背景渐变Text Gradient 创建文字颜色渐变多重CSS背景动画实现方法示例CSS3之多背景background使用示例CSS3之背景尺寸Background-size使用介绍css3背景_动力节点Java学院整理
- 详解CSS3 Media Queries中媒体属性的使用 CSS3 @media的基本用法总结详解使用CSS3的@media来编写响应式的页面 CSS3 media queries + jQuery实现响应式导航css3 media 响应式布局的简单实例css3media响应式布局实例CSS3中的Media Queries学习笔记使用 CSS3 中@media 实现网页自适应的示例代码
- CSS3媒体查询Media Queries基础学习教程CSS3中媒体查询结合rem布局适配手机屏幕纯js和CSS3媒体查询制作简单的响应式导航菜单特效源码详解CSS3 Media Queries中媒体属性的使用 使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法CSS3媒体查询(Media Queries)介绍css3 响应式媒体查询的示例代码
- CSS黑魔法之计数器counter的使用技巧CSS计数器counter()的用法简介CSS计数器(序列数字字符自动递增)详解
- 通过CSS3的object-fit来调整图片适配尺寸的技巧简介浅谈CSS中的 object-fit 与 object-position的使用
- CSS3中currentColor关键字的妙用
- 魔幻般冒泡背景的CSS3按钮动画CSS3鼠标滑过图片效果 用Font Awesome库实现悬停图标基于CSS3实现鼠标滑过图片上移代码纯CSS3实现鼠标滑过按钮动画第二节
- 你值得拥有的CSS下拉菜单效果纯CSS实现下拉菜单的示例代码CSS3模拟动画下拉菜单效果CSS导航栏及弹窗示例代码CSS下拉菜单简单制作教程 css制作黑色经典导航下拉菜单基于CSS实现的4级下拉菜单效果代码CSS实现的灰色下拉菜单效果代码纯CSS实现的大型下拉菜单的示例代码
- 天天酷跑3月2日版全自动刷分高效无异常脚本方法_手机游戏_游戏攻略_
- 天天酷跑1.0.1.0叉叉助手刷分刷钻无异常版下载及使用攻略分享_手机游戏_游戏攻略_
点击排行
本栏推荐
