`
guoxuepeng
  • 浏览: 39102 次
文章分类
社区版块
存档分类
最新评论

CSS的效率和浏览器渲染的速度

 
阅读更多

浏览器如何读取你的CSS选择器有一个很重要的原则,那就是它们从右到左读取。这意味这像 ul > li a[title="home"] 这样的选择器,a[title="home"] 将是最先被读取的。

我承认我并不经常想这个问题……我们写的 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放弃语义和可维护性。

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

分享到:
评论

相关推荐

    css书写高效的CSS-CSS的渲染效率

    ### CSS书写高效的CSS-CSS的渲染效率 在前端开发领域,CSS(层叠样式表)是构建网页布局、样式和视觉效果的关键技术之一。优化CSS不仅能够提升网站性能,还能改善用户体验。本文将从几个方面探讨如何通过改进CSS...

    JS,CSS 以及浏览器

    标题 "JS, CSS 以及浏览器" 涉及到的是前端开发中的三个核心元素:JavaScript、CSS和浏览器的交互。JavaScript是一种广泛使用的编程语言,主要负责网页的动态效果和交互功能,而CSS则是用于控制网页布局和样式的样式...

    浏览器渲染HTML过程.docx

    浏览器渲染HTML的过程是...页面重构工程师在优化这些过程方面起着重要作用,他们通过改进HTML和CSS代码,确保页面加载和渲染的效率,提高用户体验。理解浏览器渲染机制并掌握优化技巧,对于开发高性能Web应用至关重要。

    测试浏览器运行速度

    当遇到"ASP.NET开发的网页在浏览器中运行速度特别慢"的问题时,这可能是由多种因素引起的,包括但不限于网络延迟、服务器响应时间、JavaScript执行效率、CSS和HTML的加载顺序等。为了找出问题的症结所在,我们可以...

    css 浏览器兼容性速查

    主要的浏览器有Chrome、Firefox、Safari、Edge以及Internet Explorer(IE),它们各自有自己的内核和渲染机制,对新特性的支持时间不同,有时甚至存在不完全支持或错误实现的情况。例如,IE浏览器因其较早的版本对...

    用于切换CSS功能的devtools扩展以后开发人员查看页面应用在浏览器中的渲染方式

    通过它,开发者可以轻松地观察不同CSS特性和设置如何影响页面的渲染,从而提高开发效率和代码质量。同时,JavaScript的集成使得这个工具更具灵活性,能够适应各种复杂的交互需求。对于那些致力于提升网站或应用视觉...

    CSS:提高网页在浏览器的渲染速度

    以下是一些关于如何通过CSS提高网页在浏览器渲染速度的建议: 1. **避免使用通配符(*)选择器** 通配符选择器`*{}`用于清除所有元素的默认样式,但它会导致浏览器解析CSS时执行大量的遍历操作,消耗性能。应优先...

    browsh一个完全交互式实时和现代基于文本的浏览器渲染至TTY和浏览器

    1. **文本渲染引擎**:browsh需要一个能够解析和渲染HTML、CSS的引擎,将网页内容转换成适合终端显示的文本。 2. **事件处理**:通过JavaScript或其他方法处理用户的输入,如键盘命令,以模拟图形界面中的鼠标操作...

    重置浏览器默认样式的CSS文件

    在网页设计和开发中,浏览器默认样式是每个前端开发者都需要面对的...正确使用和选择合适的CSS重置方法,可以极大地提高工作效率和用户体验。在实际项目中,开发者可以根据项目需求和团队偏好选择适合的CSS重置方案。

    前端渲染性能优化及其应用.pdf

    5. 浏览器渲染性能:浏览器渲染性能是指浏览器将服务器端请求到的数据渲染成为应用页面的速度和效率,影响着应用程序的响应速度和用户体验。 6. 应用程序性能优化:应用程序性能优化是指通过软件编码层面入手,提高...

    优化浏览器渲染 避免CSS expressions

    优化浏览器渲染,尤其是避免使用CSS expressions,对于提升网站性能至关重要。CSS expressions,也称为动态属性,是Internet Explorer 5到7所特有的功能,允许开发者在CSS声明中使用JavaScript表达式来动态更新样式...

    条件CSS的高级用法.pdf

    条件CSS(Conditional-CSS)是一种强大的CSS技术,用于解决多浏览器渲染问题。它通过在CSS定义中嵌入条件语句,实现了针对特定浏览器或渲染引擎的样式应用。条件CSS的开发源于对多数浏览器上修正CSS渲染bug的需求,...

    渲染篇 2:知己知彼——解锁浏览器背后的运行机制(2).md

    - **减少重排(Reflow)和重绘(Repaint):** 重排和重绘是浏览器渲染过程中的两个关键性能消耗点。重排是当元素的布局改变时发生的,而重绘是当元素的样式改变(不涉及布局变化)时发生的。开发者应当尽量避免这两...

    pb做的浏览器模型_浏览器_pb浏览器_

    2. **浏览器引擎**:负责管理用户界面和渲染引擎之间的交互,接收用户的指令并传递给渲染引擎。 3. **渲染引擎 (Render Engine)**:也叫布局引擎,负责解析HTML、CSS,构建DOM树,并将内容显示在屏幕上。 4. **...

    手机网页浏览器 Wap浏览器 wml浏览器

    它们提供了更好的渲染性能、更快的加载速度,并且支持离线存储、地理定位、多媒体播放等高级特性。 WAP和WML虽然在当今移动互联网中已经不是主流,但在某些特定场景下,如针对低配置设备或者节省数据流量的环境,...

    浏览器的知识体系结构思维导图(PDF版)

    2. 浏览器渲染流程: 浏览器收到HTML文档后,首先解析文档,构建DOM树。接着解析CSS文件,形成样式表(styleSheets),并将CSS与DOM相结合,构建渲染树(rendertree)。在这个过程中,JavaScript代码可能会阻塞渲染...

    精通CSS(源码)

    7. **CSS重置与 normalize.css**:由于浏览器之间的样式差异,使用CSS重置(如Eric Meyer Reset或 Normalize.css)可以帮助消除默认样式,实现更一致的跨浏览器渲染。 8. **CSS Hack与浏览器兼容性**:面对不同的...

    Visual CSS 一个强悍的CSS编辑器

    6. **跨浏览器兼容性检查**:考虑到CSS在不同浏览器中的渲染差异,该工具可能会提供一些关于兼容性的警告和建议,确保样式在主流浏览器中表现一致。 7. **颜色选择器**:内置的颜色选择器提供了一种方便的方式来...

    CSS解析源代码

    总的来说,理解CSS解析源代码对于前端开发者来说是一项高级技能,它能够增强你对网页渲染底层机制的理解,从而提升开发效率和网页性能。通过阅读和研究开源的浏览器引擎代码,你可以深入探究这个过程,并可能发现...

Global site tag (gtag.js) - Google Analytics