编写高效的CSS选择器

  效的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选择器的性能有重大影响....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值