浏览器计算样式的规则
通常来说,计算样式的第一步是创建一组匹配选择器,即浏览器计算出给指定元素应用哪些类、伪选择器和 ID;第二步涉及到从匹配选择器中获取所有样式规则,并计算出此元素的最终样式。
浏览器读取 CSS 选择器遵循从右到左的顺序,例如下面的 CSS 选择器:
.box:nth-last-child(-n+1) h1 .title {
    /* styles */
}
那么浏览器要做的事情是:
- 寻找所有包含 
title类的元素 - 在这些元素中,筛选出其父元素是 
<h1>标签的元素 - 接着再筛选出父元素是其父元素中第奇数个子元素的元素
 - 对经过筛选后的元素应用样式
 
CSS 选择器性能排行
Steve Souders(Google Web 工程师,曾经写过三本 Web 性能为主题的 O’Reilly)曾于 2009 年总结了 CSS 选择器性能排行:
- ID 选择器( 
#id) - 类选择器( 
.className) - 标签选择器( 
divh1p) - 相邻选择器( 
h1+p) - 子选择器( 
ul > li) - 后代选择器( 
li a) - 通配符选择器( 
*) - 属性选择器( 
a[rel="external"]) - 伪类选择器( 
a:hoverli:nth-child) 
由于从右往左匹配,因此即使是同一类型的选择器之间的性能也有差异 —— 后代选择器中,最右侧是 ID 的选择器的性能就优于最右侧是类的选择器。