高效渲染css
译自:http://css-tricks.com/efficiently-rendering-css/
无可否认我并不经常考虑这个问题… 我们书写的CSS的效率如何,浏览器渲染它的速度如何?
浏览器的开发者肯定关心这个问题(页面加载越快,人们用着越开心)。Mozilla有篇文章 about best practices。Google同样致力于让web更快,他们也有篇文章article about it。
先来了解一下他们提出的主要想法,然后讨论其实用性。
#从右至左#
弄明白浏览器是怎样解读CSS选择器的重要一件事情是:浏览器按“从右向左”读取。意味着在选择器 ul > li a[title="home"]中,首先被解析的是a[title="home"]。这第一部分也被称为“目标选择器”,最终选择的元素是它。
#ID选择符最高效,通配选择符效率最低#
这里有四种目标选择器: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 */
* { } /* 通配 (最慢) */
#content [title='home'] /* 通配 */
结合“从右至左”和目标选择器的思想,可以看出这样的选择器效率不是很高:
#main-nav > li { } /* 比你想象的要慢 */
即使这让人感到有悖常理…因为ID最有效,所以我们认为浏览器会快速地找到ID,然后很快地找到li子元素。但实际上,最先运行的是相对低效的li元素选择器。
#不要用标签修饰#
千万别这样做:
ul#main-navigation { }
ID是唯一的,所以它们不需要和标签在一起。这样做反而会降低效率。如果可以避免的话,也不要用class修饰。class不唯一,所以理论上你可以对多个不同的元素应用一个class。如果想让标签控制样式,你可能会加以标签修饰(eg:li.first),但这种做法很罕见,所以还是别这样做。
#后代选择器是最糟糕的#
David Hyatt:
后代选择器在CSS中是最昂贵的选择器。贵得要命——尤其是把它和标签或通配符放在一起!
换言之,像下面这样的选择器简直是效率的灾难:
html body ul li a { }
#一个选择器匹配失败比它被找到更高效#
我不确定这能让我们学到很多,因为如果在你的CSS中有大量的选择器未曾匹配任何东西…这太古怪了。不过也挺有趣,“从右至左”的解释一个选择器,一旦匹配失败就停下来,相比继续解释下来所用精力更少。
#想想你为什么会写出这样的选择器#
看看这个:
#main-navigation li a { font-family: Georgia, Serif; }
字体样式,你可能不需要特意从一个选择器(a标签)开始(如果你只想换个字体)。这样可能达到同样的效果,但更加高效:
#main-navigation { font-family: Georgia, Serif; }
#CSS3和效率#
来自David Hyatt的噩耗:
关于CSS3选择器的可悲的事实是,如果你关心页面性能的话,他们真不该被使用!
整个评论是值得一读的。
CSS3选择器(例如:第n个孩子)是令人难以置信的好,在帮助我们锁定我们想要的元素的同时保持标记的干净和语义化,但事实是,这些花哨的选择器让更多的浏览器资源被密集使用。
到底怎么回事,我不应该使用它们吗?让我们想点实用性吧!
#实用性#
开头提到Mozilla的文章?已经有10年了。事实上,10年前的计算机更慢。这些东西在那时候更重要。10年前我刚要21岁,根本不知道CSS是什么,所以没法带你去那些古老的学校…但我感觉,我们之所以不关心渲染效率的问题,是因为它从来都不是个大问题。
这是我的想法:上面提到的最佳实践都是有意义的。你可以遵循,它们不会限制你的CSS能力。但你也不必太教条。如果你刚好需要改进从前的网站,又刚好没有考虑过这些想法,不妨看看你的样式表,哪里可以做得更好。如果你的网站没有渲染速度的问题,不用去担心,以后注意就可以了。
现在我们知道ID是最高效地选择器。如果你想使页面渲染最高效,你可以给每一个元素加上唯一的ID,然后对每个ID选择器应用样式。这超级快,同样超级荒谬。这样的页面会极端的没有语义,并且很难维护。即使在以表现为主的网站,也不会这样做。我想,这堂课并不是为了高效的CSS而牺牲语义和可维护性。
感谢Jason Beaudoin email给我想法。如果有谁知道这个东西,或者你有额外的提示,请告诉我!
只是作为一个速记,我想提一提,因为CSS样式选择器也在许多JavaScript库中使用,这些相同的概念也同样适用。 ID选择将是最快的,而复杂的后代选择等会慢一些。
高效渲染css的更多相关文章
- [css] 【转载】 精简高效的CSS命名准则/方法
原文链接:http://www.zhangxinxu.com/wordpress/2010/09/%E7%B2%BE%E7%AE%80%E9%AB%98%E6%95%88%E7%9A%84css%E5 ...
- 编写高效的 CSS 选择器
高效的CSS已经不是一个新的话题了,也不是我一个非得重拾的话题,但它却是我在Sky公司工作之时,所感兴趣的,关注已久的话题. 有很多人都忘记了,或在简单的说没有意识到,CSS在我们手中,既能很高效,也 ...
- 编写高效的CSS选择器
高效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题. 很多人或者忘记了,或者仅仅是没有意识到,CSS可以是高效的也可能导致低能 ...
- [转] 编写高效的 CSS 选择器
高效的CSS已经不是一个新的话题了,也不是我一个非得重拾的话题,但它却是我在Sky公司工作之时,所感兴趣的,关注已久的话题. 有很多人都忘记了,或在简单的说没有意识到,CSS在我们手中,既能很高效,也 ...
- 书写更加高效的CSS,走出误区
根据一些CSS写作经验,如何提高渲染效率及所占用消耗的资源,我们来浅谈一下CSS的渲染效率,书写高效的CSS. 1.十六进制的颜色值对位数与大小写 编写十六进制颜色值时你可能会用小写字母或省略成3位数 ...
- 书写高效的CSS
一.使用高效是CSS ①:使用外联样式替代行间样式或内嵌样式. 不推荐使用内联样式:<style></style> 不推荐使用内嵌样式:<p style="&q ...
- 高效的CSS代码(2)
——阅读笔记,欢迎纠错^_^ 内容比较零散..... 1.让浮动元素的父容器根据元素的高度而自适应高度的方法: <div class="clearfix"><di ...
- 如何书写高效的css样式
如何书写高效的css样式? 有以下四个关键要素: 1.高效的css 2.可维护的css 3.组件化的css 4.hack-free css 书写高效的css: 1.使用外联样式替代行间样式或内嵌样式 ...
- 美团开源Graver框架:用“雕刻”诠释iOS端UI界面的高效渲染
Graver 是一款高效的 UI 渲染框架,它以更低的资源消耗来构建十分流畅的 UI 界面.Graver 独创性的采用了基于绘制的视觉元素分解方式来构建界面,得益于此,该框架能让 UI 渲染过程变得更 ...
随机推荐
- BestCoder Round #87 LCIS(dp)
LCIS 要用dp的思路想这题 [题目链接]LCIS [题目类型]dp &题意: 给定两个序列,求它们的最长公共递增子序列的长度, 并且这个子序列的值是连续的,比如(x,x+1,...,y−1 ...
- Python中HTTPS连接
permike 原文 Python中HTTPS连接 今天写代码时碰到一个问题,花了几个小时的时间google, 首先需要安装openssl,更新到最新版本后,在浏览器里看是否可访问,如果是可以的,所以 ...
- laravel加入验证码类几种方法 && Laravel引入第三方库的方法
1,使用require , inlcude 的方法将验证码类文件包含进来,再进行new 2,将验证码类文件放于Http目录下面,也就是和控制器controller放在一个目录下面,在验证码类文件中加上 ...
- 树莓派安装3.5inch RPi LCD (A)显示屏
3.5inch RPi LCD (A) 资料 产品介绍 用户手册 开发资料 开发软件 树莓派镜像 演示视频 FAQ 在自定义Raspbian系统镜像上怎么使用树莓派LCD? 先确保自定义镜像可正常进入 ...
- iostat命令详解 IO性能分析
简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...
- Python标准库11 多进程探索 (multiprocessing包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在初步了解Python多进程之后,我们可以继续探索multiprocessing包 ...
- linux 查看占用端口并kill掉
主要可以使用ps 命令 或 netstat 命令 weihong@data1:~/jd_parser/jd_parser$ ps aux | head USER PID %CPU %MEM VSZ ...
- struts (一)
1.jar 2.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id=&quo ...
- Oracle中的自增-序列-SEQUENCE
Oracle 12c 之前的版本都没有自增列,如果需要使用自增列,则需要借助SEQUENCE. DROP TABLE CUSTOMERORDER PURGE; CREATE TABLE CUSTOME ...
- 解决WinForm(C#)中MDI子窗体最大化的问题
“用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化: 1. ...