可是,制止元素样式彼此影响,并不代表可以随意地利用担任选择符。前面提到,欣赏器会从右向左读取整个选择符序列,直到读取完毕并匹配完成,可能因不匹配而打消。因此,短的选择符序列更有利于欣赏器更快地完成匹配进程。相对的,冗长的选择符序列则认为是低效的,好比:
.header ul li .nav_link{}
发起写为:
.header .nav_link{}
一般来说,不高出3层的担任层级就可以满意实际中的开拓要求。因此,应淘汰不须要的担任层级,利用更短的选择符序列。
另外,较长的选择符序列尚有一个问题。有较长选择符的样式法则,css优先级的计较值也较大,因此,假如在今后需要写新的样式来包围掉它,就需要写更长的选择符(可能利用ID)以得到更高的css优先级。这对机能和代码可读性都是倒霉的。
制止链式选择符
链式选择符(Chaining selectors)是对单个元素同时写了多个选择符鉴定的环境。好比p.name是指class名为name,且标签是p的元素,才应用样式。这些鉴定组合可以是ID选择符,标签选择符,class选择符的任意组合。
可是,链式选择符是太过界说(over qualified)的,倒霉于重用,也倒霉于机能优化。如:
a#author{}
发起写为:
#author{}
这里的a是不须要的。一个ID只对应一个元素,没有须要再强调这个元素的标签是什么(同理,class也不必)。别的有
.content span.arrow{}
发起写为:
.content .arrow{}
这里的span.arrow中的span也是不须要的。一方面,这为欣赏器在样式匹配时增加了一项特别事情:查抄class名为arrow的元素的标签名是不是span,也因此低落了机能。另一方面,假如去掉了这个限定,.arrow的样式界说,就可以用在更多的元素上,也就有着更好的重用性。不然,就还得汇报别人,利用这个的时候只能用在span标签上。
同理,多个class的链式写法,如
.tips.succuss{}
发起变动定名,写为:
.tips_succuss{}
这样可以辅佐欣赏器淘汰特另外样式匹配事情。
另外,IE6还存在一个链式选择符的问题,多个class选择符写在一起时,譬喻.class1.class2.class3,正常环境是只有同时有这全部的class的元素,才应用样式。但IE6只认最后一个,也就是切合.class3这个选择符的元素,就应用样式。
破例环境
前面所述的选择符的写法的发起,只是从欣赏器渲染机能优化,及代码的重用性方面阐明获得的理论功效。在实际利用中,你并不需要严格凭据这些内容来做。譬喻,假如你确实是筹备为class名为intro的元素内的所有a标签元素都加上某样式,那么.intro a这样的选择符是明智的。
结语
关于高效的css选择符的指南,你还可以阅读google developer中的Use efficient CSS selectors。
如今,现代欣赏器在样式匹配上也逐渐有了更多的优化(参考CSS Selector Performance has changed!),有些方面的内容我们已经不再需要再担忧了。可是,这并不料味着不需要思量写公道的css选择符了。css选择符机能优化是依然存在的事,你的选择符应该更好地浮现你的意图,而不是随心所欲地利用。更重要的是,以这样一种稍细腻的,颠末思考的想法来写css选择符,并不是一件坚苦的事。只要你想,形成这样的一种习惯,你就可以自然地在这方面做得更好,何乐而不为呢?