如何使CSS渲染更高效

我承认我并不经常想这个问题......我们写的css的效率是怎么样的呢,浏览器渲染的速度又如何呢?

这是应该是浏览器开发者应该关心的(页面加载更快,用户就会更愉快)。Mozilla有一篇文章:about best practices . Google当然也很关心这个问题,他们也有这样一篇文章:Optimize browser rendering 。

让我们了解下他们主要倡导的东东,然后讨论他们的实用性。

从右到左

浏览器如何读取你的CSS选择器有一个很重要的原则,那就是它们从右到左读取。这意味这像 ul > li a[title="home"] 这样的选择器,a[title="home"] 将是最先被读取的。这一部分通常被称为 “key selector” (可否称为“目标选择器” -_-!)选择器的最后一部分,也是被选择的标签。

ID's 是最有效率的,通用符是最慢的

有四种目标选择器:ID, class, tag和通用符。看下他们各自的效率如何:
#main-navigation { } /* ID (最快) */
body.home #page-wrap { } /* ID */
.main-navigation { } /* Class */
ul li a.current { } /* Class *
ul { } /* Tag */
ul li a { } /* Tag */
* { } /* Universal (最慢) */
#content [title='home'] /* Universal */ 然后我们结合从右到左和目标选择器的概念,我们可以知道下面这个选择器并不高效:
#main-nav > li { } /* 看着很快实则很慢 */
尽管这让人有点费解......因为ID's是最高效的,浏览器可以通过ID迅速的找到 li。但事实是,li 标签是被先读取的。

不要用标签修饰

死也不要像下面这样干:


以下为引用的内容:

ul#main-navigation { }

ID's 是唯一的,所以不需要用标签修饰,这只会让它更低效。
如果你可以避免的话,也不要用它修饰 class 。class 不是唯一的,所以理论上你可以把它用在不同的标签。如果你愿意的话,你可以用标签控制不同的样式,这样你可能需要标签修饰(比如:li.first),但这样做的人很少,所以,don't .

绝对没有比用后代选择器更糟糕的做法了

David Hyatt:

后代选择器是CSS里最昂贵的选择器,昂贵得可怕——特别是当它放在标签和通用符后面时。
就如下面这个东东一样,绝对的效率毒瘤:


以下为引用的内容:

html body ul li a { }

一个选择器渲染失败比这个选择器被渲染更高效

我不是很确定是否有更好的证据去证明这一点,因为如果你有大量的选择器在CSS样式表里无法找到,这样的事情貌似很离奇,但一点必需注意的是,从右到左的解释一个选择器来说,一旦它找不到,那它就会停止尝试。然而如果它找到了,那它就需要花更多精力去解释了。

试想一下为何你这样写选择器

思考下这东东:


以下为引用的内容:

#main-navigation li a { font-family: Georgia, Serif; }

你可能不需要从 a 选择器开始(如果你只是想换个字体)。下面这个可能更高效些:


以下为引用的内容:

#main-navigation { font-family: Georgia, Serif; }

实用性

还刻前面提到的Mozilla的一篇文章?已经有十年了。事实是:计算机比十年前变慢了(不是我理解错了,还是作者想说现在的WEB越来越复杂了)。我感觉这东东在当年似乎还更受重视。十年前我还是个21岁的英俊小生,当然我不觉得那里我会认识css这东东。所以我也无法跟你讲以前的情况......但我觉得渲染效率的问题之所以没被重视是因为这从来就不是一个大问题。

这是我的一些看法:不管怎样上面提到的东东都是有意义的,你可以按照上面的方法去做,因为它并不会限制你的CSS制作。但你也没必要太教条主义。如果你是个完美主义者,而之前又没有考虑过那东东,那是时候去重新看一下你之前写的一些样式是否有改进的地方了。如果你没发现你的网站明显的渲染缓慢,那大可别太在意,在以后的工作中多注意就行了。

超级快速,零实用性

我们知道ID's 是最高效的选择器。当你想让渲染速度最高效时,你可能会给每个独立的标签配置一个ID,然后用这些ID写样式。那会超级快,也超级荒唐。这样的结果是语义极差,维护难到了极点。即使在核心部分你也不应该见过这样做的。我认为这个可以提醒我们不要为了高效的CSS放弃语义和可维护性。

Thanks to Jason Beaudoin for emailing me about the idea. If anyone knows more about this stuff, or if you have additional tips that you use in this same vein, let’s hear it!

顺便提一下,因为CSS选择器被很多javascript库使用,上面提到的东东仍然适用,ID选择器还是最快的,后代选择器和类似的东东比较慢。

PS:看谁还敢用N多的后代选择器,还有反对我用ID的!

时间: 2024-11-08 19:07:59

如何使CSS渲染更高效的相关文章

《疯狂动物城》 —浪潮分布式存储让动画渲染更高效

<疯狂动物城>这部以动物为主题的迪士尼动画很火爆,在华上映10天票房已达7.47亿,豆瓣评分达到9.3分.里边许多小细节很有趣:恶搞现实世界的品牌,星巴克logo换成了长颈鹿,NIKE的"just zoo it",还有慢到令人发笑却有个名字叫闪电的树獭.不过,这和分布式存储能扯上什么关系呢? 渲染耗时1000万小时以上,"拖延症"咋治疗? 有一些拍摄花絮你可能没注意,<疯狂动物城>是迪斯尼迄今为止最长的动画电影之一,片长达108分钟,50多个

如何使网站购物车环节更高效?

网站购物环节设计好不好.高不高效,直接关系着http://www.aliyun.com/zixun/aggregation/9332.html">网站转化率高不高.很多用户在进入到购物车环节后放弃购买,这对网站来说损失不小.如何使购物车环节更高效呢?知名电子商务智能应用平台专家.香港海洋科技(www.idcsea.com)认为,从问题出发,在设计.运营等方面尽量解决问题,或可提高购物车效率. 国外有研究显示,超过46%的在线顾客表示,高昂的运费是他们放弃购物车的"非常重要的原因&

css选择器: 编写高效的CSS选择器

高效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题.很多人或者忘记了,或者仅仅是没有意识到,CSS可以是高效的也可能导致低能.然而,我们可以不考虑当你自认为会的太少而使用了低效的CSS这种情况.这些规则只真正用在性能要求很高的网站上,这些网站对速度要求很高,任何一个页面可能含有成百上千个DOM元素.但是实践出真理,不管你是在打造下一个facebook 还是在开发一个本地的展示网页,多学点总是好的....CSS 选择器CSS

创建CSS的对象 使CSS对象的粒度合适

网页制作Webjx文章简介:创建CSS的对象 使CSS对象的粒度合适. 强硬的把CSS和HTML塞到PHP里面可以防止代码太枯燥(DRY)并最终导致代码臃肿,因为的CSS和HTML需要比PHP更细致的对象结构.事实上,PHP的模板不是天生合适的,因为每个模板包含了许多不同的HTML,以及以不同的方式相结合的CSS对象. 然后,我并没有解释它,或者给出适当的语境.抱歉! 正确的粒度是减小CSS的关键之一 在PHP层,下面的会话流(来自Facebook)或许是一个单个对象.所有的检测哪些HTML要显

Avast 2017发布安全新功能:杀毒更高效,玩游戏更畅快

本文讲的是Avast 2017发布安全新功能:杀毒更高效,玩游戏更畅快, 对于装有杀毒软件的游戏玩家来说,最痛苦的事情莫过于游戏打的正火热,忽然杀毒软件提醒你各种注意事项(各种安全对话框.气泡提示和扫描计划等常常成为游戏的"杀手",影响着游戏的运行.),让你不得不切换界面进行操作处理,然后等你回来的时候,战斗已经结束. 除了这些麻烦不说,占用资源太大,也会影响游戏的运行速度,游戏最重要的是什么?运行速度和畅快淋漓是玩游戏的前提条件.昨天,Avast(中文名为爱维士)宣布,他们已正式发布

这些小工具让你的Android开发更高效_Android

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vysor Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用. Vector Asset Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset:它可以帮助你在Android 项目中添加Materia

怎样将交付物打造的直观易懂,使它们具有更强的沟通能力

摘要: [编者按]本文作者Barnabas Nagy ,译者@C7210.Barnabas是一名拥有六年从业经验的UX设计师.信息架构师,其对用户体验设计的交付提出一点:你的合作伙伴未必会看懂你的交付. 为了让自 [编者按]本文作者Barnabas Nagy ,译者@C7210.Barnabas是一名拥有六年从业经验的UX设计师.信息架构师,其对用户体验设计的交付提出一点:"你的合作伙伴未必会看懂你的交付". 为了让自己的设计能够让人更容易理解,交付一个优秀可视化的成果是一个不错的选择

让城市更智能 让管理更高效

智慧高新指挥运营中心 南昌高新区大力推进智慧城市建设 关于智慧城市,人们已经不再陌生,因为她已慢慢渗透到人们的日常生活中.去年3月份,南昌高新区被国家住建部.科技部批准列为第三批国家智慧城市试点,高新区计划总投资6.094亿元,实施智慧城管.智慧管网.智慧公共照明等13个智慧城市重点项目. 一年多来,各个部门积极推进项目建设,让城市更智能,让管理更高效.目前,高新区101智慧大厦已建成投入使用,并在全国综治"南昌会议"召开期间,受到中央.省.市媒体的关注并报道:智慧管网项目一期已完成创

让Java代码更高效_java

本文简单介绍一下在写代码过程中用到的一些让JAVA代码更高效的技巧. 1,将一些系统资源放在池中,如数据库连接,线程等.在standalone的应用中,数据库连接池可以使用一些开源的连接池实现,如C3P0,proxool和DBCP等,在运行在容器中的应用这可以使用服务器提供的DataSource.线程池可以使用JDK本身就提供的java.util.concurrent.ExecutorService. import java.util.concurrent.Executors; import j