了解CSS的查找匹配原理,让CSS更简洁、高效
用了这么多年的 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:
1 2 3 4 5 6 7 8 9 10 11 | < 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 > |
PS:看有些同学对从右到左的理论保持怀疑,下面贴出 firefox 和 google 的 2 篇相关 css 解释的文章,供大家参考
mozilla firefox:https://developer.mozilla.org/en/Writing_Efficient_CSS
google page-speed:http://code.google.com/intl/zh-CN/speed/page-speed/docs/rendering.html
有需要请查看:高性能 WEB 开发系列