效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题。
很多人或者忘记了,或者仅仅是没有意识到,CSS可以是高效的也可能导致低能。然而,我们可以不考虑当你自认为会的太少而使用了低效的CSS这种情况。
这些规则只真正用在性能要求很高的网站上,这些网站对速度要求很高,任何一个页面可能含有成百上千个DOM元素。但是实践出真理,不管你是在打造下一个facebook 还是在开发一个本地的展示网页,多学点总是好的....
CSS 选择器
CSS 选择器对我们大多数人来说并不新鲜,较基础的选择器分别是类型(如 div),ID(如#header)和类(如.tweet)。
较不寻常的包括基础的伪类(如:hover)和更复杂的CSS3以及 '正则'(‘regex’)选择器,比如:first-childor[class^="grid-"]。
选择器具有固有效率,引用Steve Souders的话来说,较有效到较不有效的CSS选择器的顺序是这样的:
ID,如#header
Class, 如.promo
Type, 如div
Adjacent sibling, 如h2 + p
Child, 如li > ul
Descendant,如ul a
Universal,即*
Attribute, 如[type="text"]
Pseudo-classes/-elements, 如a:hover
引用自Steve Souders的Even Faster网站
认识这很重要,虽然一个ID技术上更快而且表现更优,但几乎都不这样用。用Steve Souders的CSS测试器,我们可以发现一个 ID 选择器 和 一个类选择器 在再渲染速度方面差别很小。
在一台Windows机器上的Firefox6中,我获得了关于一个简单的类选择器的平均再渲染数据。ID选择器给出了12.5的平均值,所以实际上它要比一个类再渲染得慢一点。
ID与类之间的速度差异几乎是不相干的。
对一个类型()的选择测试,相比一个类或ID给出了慢得多的再渲染。
对一个层次非常多的子孙选择器的测试给出了 大约440的数值!
通过这我们可以发现IDs/classes与types/descendants的差别非常巨大...它们自身之间的差异很细微。
注意 这些数值在不同的机器和浏览器变化非常大。我极力建议你自己运行一下。
组合选择器jhfp.codeplex.com;
jhdfp.codeplex.com;
jhfpq.codeplex.com;
zjkfp.codeplex.com;
zjfpq.codeplex.com;
zjfp.codeplex.com;
zjdfp.codeplex.com;
yzfp.codeplex.com;
yzkfp.codeplex.com;
yzfpq.codeplex.com;
yzfpw.codeplex.com;
ncfp.codeplex.com;
nckfp.codeplex.com;
ncdfp.codeplex.com;
ncdpe.codeplex.com;
ncfpe.codeplex.com;
gzfp.codeplex.com;
gzkfp.codeplex.com;
gzfpw.codeplex.com;
gzdfp.codeplex.com;
gzfpt.codeplex.com;
szfpa.codeplex.com;
szfps.codeplex.com;
szfpd.codeplex.com;
szfpf.codeplex.com;
szfpg.codeplex.com;
zsfp.codeplex.com;
zsdfp.codeplex.com;
zskfp.codeplex.com;
stfp.codeplex.com;
stkfp.codeplex.com;
stdfp.codeplex.com;
fsfp.codeplex.com;
fskfp.codeplex.com;
fsfpq.codeplex.com;
fsdfp.codeplex.com;
lzkfp.codeplex.com;
lzfpq.codeplex.com;
lzfpw.codeplex.com;
lzdfp.codeplex.com;
lzfpe.codeplex.com;
zhfp.codeplex.com;
zhkfp.codeplex.com;
zhfpq.codeplex.com;
hzfpz.codeplex.com;
hzfpx.codeplex.com;
bjfp.codeplex.com;
bjcfp.codeplex.com;
bjdfp.codeplex.com;
jncfp.codeplex.com;
jnzfp.codeplex.com;
jnfp.codeplex.com;
hfzfp.codeplex.com;
hfcfp.codeplex.com;
hffpa.codeplex.com;
szzfp.codeplex.com;
szcsp.codeplex.com;
szdfp.codeplex.com;
nbfpa.codeplex.com;
nbzfp.codeplex.com;
nbfps.codeplex.com;
wxfpa.codeplex.com;
wxsfp.codeplex.com;
wxfpd.codeplex.com;
njfpz.codeplex.com;
njzsp.codeplex.com;
njfpx.codeplex.com;
cssfp.codeplex.com;
csfpc.codeplex.com;
csdfp.codeplex.com;
qdfpz.codeplex.com;
qdsdp.codeplex.com;
qdfpc.codeplex.com;
cqzfp.codeplex.com;
cqcfp.codeplex.com;
cqdfp.codeplex.com;
cddfp.codeplex.com;
cscfp.codeplex.com;
cdfpa.codeplex.com;
shzfp.codeplex.com;
skcfp.codeplex.com;
shdep.codeplex.com;
hebfp.codeplex.com;
hefpq.codeplex.com;
hefpw.codeplex.com;
cczfp.codeplex.com;
ccyfp.codeplex.com;
ccefp.codeplex.com;
syzfp.codeplex.com;
sydfp.codeplex.com;
syyfp.codeplex.com;
zzfpa.codeplex.com;
zzcfp.codeplex.com;
zzefp.codeplex.com;
hzzfp.codeplex.com;
hzfpy.codeplex.com;
hzefp.codeplex.com;
kmzsp.codeplex.com;
kmcfp.codeplex.com;
kmzfp.codeplex.com;
dlzfp.codeplex.com;
dlcfp.codeplex.com;
dldfp.codeplex.com;
whzsp.codeplex.com;
whcfp.codeplex.com;
whefp.codeplex.com;
fzyfp.codeplex.com;
fzsfp.codeplex.com;
fzefp.codeplex.com;
gzyfp.codeplex.com;
gzzfp.codeplex.com;
gzefp.codeplex.com;
sjcfp.codeplex.com;
sjsfp.codeplex.com;
sjefp.codeplex.com;
xafpz.codeplex.com;
xasfp.codeplex.com;
xaafp.codeplex.com;
szcfp.codeplex.com;
szsfp.codeplex.com;
szxfp.codeplex.com;
tycfp.codeplex.com;
tyfp.codeplex.com;
tyefp.codeplex.com;
ncsfp.codeplex.com;
nccfp.codeplex.com;
ncefp.codeplex.com;
gyzfp.codeplex.com;
gycfp.codeplex.com;
gydfp.codeplex.com;
dgfp.codeplex.com;
dgkfp.codeplex.com;
bjzfp.codeplex.com;
bjyfp.codeplex.com;
bjefp.codeplex.com;
jnyfp.codeplex.com;
jnsfp.codeplex.com;
jnefp.codeplex.com;
hfzsp.codeplex.com;
hfyfp.codeplex.com;
hfefp.codeplex.com;
szfpz.codeplex.com;
szyfp.codeplex.com;
szefp.codeplex.com;
nbyfp.codeplex.com;
nbzsp.codeplex.com;
nbefp.codeplex.com;
wxyfp.codeplex.com;
wxzfp.codeplex.com;
wxefp.codeplex.com;
njyfp.codeplex.com;
njzfp.codeplex.com;
njefp.codeplex.com;
csfpd.codeplex.com;
csyfp.codeplex.com;
csfpz.codeplex.com;
qdyfp.codeplex.com;
qdsfp.codeplex.com;
qdfpx.codeplex.com;
cqsfp.codeplex.com;
cqyfp.codeplex.com;
cqefp.codeplex.com;
cdsfp.codeplex.com;
cdyfp.codeplex.com;
cdefp.codeplex.com;
shsfp.codeplex.com;
shkfp.codeplex.com;
shefp.codeplex.com;
heyfp.codeplex.com;
hesfp.codeplex.com;
hefpe.codeplex.com;
ccsfp.codeplex.com;
cccfp.codeplex.com;
ccdfp.codeplex.com;
sysfp.codeplex.com;
syefp.codeplex.com;
sycfp.codeplex.com;
zzfps.codeplex.com;
zzyfp.codeplex.com;
zzdfp.codeplex.com;
hzsfp.codeplex.com;
hzcfp.codeplex.com;
hzfpd.codeplex.com;
kmsfp.codeplex.com;
kmyfp.codeplex.com;
kmfps.codeplex.com;
dlsfp.codeplex.com;
dlyfp.codeplex.com;
dlefp.codeplex.com;
whzfp.codeplex.com;
whxfp.codeplex.com;
whdfp.codeplex.com;
fzcfp.codeplex.com;
fzzfp.codeplex.com;
fzdfp.codeplex.com;
gzcfp.codeplex.com;
gzsfp.codeplex.com;
gzfps.codeplex.com;
sjfps.codeplex.com;
sjfpz.codeplex.com;
sjdfp.codeplex.com;
xacfp.codeplex.com;
xafps.codeplex.com;
xaefp.codeplex.com;
szfpx.codeplex.com;
szafp.codeplex.com;
szqfp.codeplex.com;
tysfp.codeplex.com;
tyfpa.codeplex.com;
tydep.codeplex.com;
nczsp.codeplex.com;
ncyfp.codeplex.com;
ncfps.codeplex.com;
gysfp.codeplex.com;
gyqfp.codeplex.com;
gywfp.codeplex.com;
你可以单独使用一种标准选择器,如#nav,来选择所有以"nav"为ID的元素,你也可以使用组合选择器,如#nav a,来选择任何在ID为’nav’的元素里面的链接元素。
现在,我们从左到右读这个组合标签。我们先找到#nav ,然后再找到里面的元素。但是我们的浏览器不是这样解析的,它是从右到左来解析这些组合选择器的。
当我们看到#nav里面有个a,而浏览器看到的却是有个a在 #nav里面,这些细微的差异对浏览器的性能有重大影响,同事学习他们是很有价值的。
如果想知道浏览器这样解析的原因,请参考this discussion on Stack Overflow.
对浏览器来说,从最右边的元素(它最想渲染的元素)开始,然后回溯到DOM树比从DOM树的最高层开始选择向下寻找,甚至可能达不到最右边的选择器(关键的选择器)要高效。
这对CSS选择器的性能有重大影响....