posts - 36, comments - 419, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理


DIV#divBox p span.red{color:red;},按习惯我们对这个CSS 的理解是,浏览器先查找id为divBox的DIV元素,当找到后,再找其下的所有p元素,
然后再查找所有span元素,当发现有span的class为red的时候,就应用该style。多么简单易懂的原理,可是这个理解却是完完全全相反、错误的。

用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知道你是否也跟我一样?看1个简单的CSS:

DIV#divBox p span.red{color:red;},按习惯我们对这个CSS 的理解是,浏览器先查找id为divBox的DIV元素,当找到后,再找其下的所有p元素,然后再查找所有span元素,当发现有span的class为red的时候,就应用该style。多么简单易懂的原理,可是这个理解却是完完全全相反、错误的。


匹配原理:

     浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找。比如之前说的 DIV#divBox p span.red{color:red;},浏览器的查找顺序如下:

先查找html中所有class='red'的span元素,找到后,再查找其父辈元素中是否有p元素,再判断p的父元素中是否有id为divBox的div元素,如果都存在则匹配上。

    浏览器从右到左进行查找的好处是为了尽早过滤掉一些无关的样式规则和元素。比如如下html和css:

<style> 
   DIV#divBox p span.red
{color:red;}
<style>
<body>
  <div id="divBox">
      <p><span>s1</span></p>
      <p><span>s2</span></p>
      <p><span>s3</span></p>
      <p><span class='red'>s4</span></p>
  </div>
</body>
如果按从左到右查找,哪会先查找到很多不相关的p和span元素。而如果按从左到右的方式进行查找,则首先就查找到<span class='red'>的元素。firefox称这种查找方式为key selector(关键字查询),所谓的关键字就是样式规则中最后(最右边)的规则,上面的key就是span.red。

简洁、高效的CSS:
      所谓高效的CSS就是让浏览器在查找style匹配的元素的时候尽量进行少的查找,下面列出一些我们常见的写CSS犯一些低效错误(也是我以前常常犯的错误,还老以为这样写才是高效的):
   
  1.不要在ID选择器前使用标签名
 一般写法:DIV#divBox
 更好写法:#divBox
 解释: 因为ID选择器是唯一的,加上div反而增加不必要的匹配。
  
  2.不要再class选择器前使用标签名
 一般写法:span.red
 更好写法:.red
 解释: 同第一条,但如果你定义了多个.red,而且在不同的元素下是样式不一样,则不能去掉,比如你css文件中定义如下:
     p.red{color:red;}
     span.red{color:#ff00ff}
     如果是这样定义的就不要去掉,去掉后就会混淆,不过建议最好不要这样写
  3.尽量少使用层级关系
 一般写法:#divBox p .red{color:red;}      
 更好写法:.red{..}
  
  4.使用class代替层级关系
 一般写法:#divBox ul li a{display:block;}      
 更好写法:.block{display:block;}




    有需要请查看:高性能WEB开发系列



[作者]:BearRui(AK-47)
[博客]: http://www.blogjava.net/bearrui/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
英雄,别走啊,帮哥评论下:  

精彩推荐 好文要顶 水平一般 看不懂 还需努力

评论

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-08 08:43 by BeanSoft
学习 收藏了

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-08 08:49 by BearRui(AK-47)
@BeanSoft
谢谢老大支持啊,^_^

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-08 16:57 by BearRui(AK-47)
@爱之谷
谢谢收藏

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-08 17:05 by 16楼
实用,总结的不赖

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-08 17:07 by BearRui(AK-47)
谢谢

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-09 16:48 by panasia
很实用的例子。。学习了。。

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-12 17:58 by Aidan
好文章,顶一下!

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-12 20:23 by BearRui(AK-47)
谢谢楼上的支持

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-16 20:31 by 向东而立
( 不要再class选择器前使用标签名
一般写法:span.red
更好写法:.red
解释: 同第一条....)
要再class选择器前使用标签名!
class,表示一组(类)或一个具有同样性质的元素,它们可以共用样式,并且在页面中将会出现多次(如果他能唯一,那么要ID又是什么)
所以CSS选择器选择class时,没有标签名,选择将是所以的类的集合...

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-16 21:31 by BearRui(AK-47)
@向东而立
class当然唯一是表示在产品中所有唯一,比如.red就表示所有的文字颜色为红色,并不是跟id一样的含义。

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-06-17 10:07 by tony徐
简单实用啊,现在才发现原来是倒着匹配的

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效[未登录]  回复  更多评论   

2010-06-20 19:42 by kkk
的确,倒着查找是单链,顺次查找是多链

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-09-23 18:14 by jsonz
当时我就精呆啦。

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-11-18 14:15 by Ace.lee
4.使用class代替层级关系
一般写法:#divBox ul li a{display:block;}
更好写法:.block{display:block;}

首先,这个原理。俺还真是现在才知道。大部分观点表示赞同。
前面3点总结来说,就是在能正确实现样式的情况下,层级尽可能少。
第4点有点疑问。虽然用class代替层级减少了匹配的时间,但是,class多用一个就多了一个额外的资源开销,通常,提倡的是尽可能少用类和ID,从这个方面来说,是否是就是因为类和ID的开销超过了匹配所浪费的资源??

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2010-12-17 13:55 by nicolas
是的,一直以为也是从左至右的,直到有次面试,面试官问了我CSS的优化,我才知道,原来一直习惯的span.classname{}反而比.classname{}的性能差,CSS的遍历是从右向左的。支持!

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2011-05-16 00:06 by hax
知其然不知其所以然。浏览器为什么要这样匹配?不就是为了优化CSS匹配的性能?而web开发者为啥要优化css的写法?这不是浪费了浏览器实现者的苦心么?css selector你该怎么写就应该怎么写。首先考虑的应该是这条规则想要表达什么,而不是是否能快20ms(实际上在通常的case里根本快不了20ms)。

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2011-06-12 21:32 by 水煮丫软件
而如果按从左到右的方式进行查找,则首先就查找到<span class='red'>的元素。

楼主,上面这句话好像有点问题,应该是而如果按从右到左的方式进行查找

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2011-08-18 16:31 by wangjie
老大不看你这篇文章我还以为我写的css都是高效的呢

# ID选择器前究竟用不用用标签名?  回复  更多评论   

2013-04-11 17:31 by 森-pirate
我现在在做一个页面,出现的问题就是如果id选择器不设置标签div的话,选择器内所设置的效果就无效。
div#llinks ul {
list-style: none;
padding: 0px;
margin: 5px 5px 0px 25px;
}
div#llinks ul li {
float: left; /* 显示为同一行,如果不加div浮动无效 */
width: 80px; /* 指定每一项的宽度 */
background: none;
padding: 0px;
border: none;
}

# re: 了解CSS的查找匹配原理,让CSS更简洁、高效  回复  更多评论   

2013-06-07 16:52 by 漂流的兔子
写的很清楚 很受用 学习了

只有注册用户登录后才能发表评论。


网站导航: