CSS的层叠性

CSS指层叠样式表(Cascading Style Sheets),一般通过定义HTML元素的样式来影响页面的布局及外观。

层叠性体现在多个选择器选中同一个标签,设置同一个样式,浏览器中加载时,不会加载所有的属性值,挑选其中一个加载,其中一个值层叠/覆盖掉其他的值。

样式来源

1、浏览器默认的样式,比如你还没有显性设置CSS属性,h1就会显示粗体,em显示斜休。

2、用户自定义样式。一些页面中会提供一些让用户自定义字体大小颜色等的快捷键;

3、外部样式,即<link>引用的CSS后缀文件;

4、内部样式,即写在<style></style>标签内的样式;

5、内联样式,即直接写在标签style属性内的样式。

样式来源分类:

1、创作人员(上面提到的第3、4、5点都可归到这一点)

2、读者(用户自定义样式)

3、用户代理(浏览器默认样式)

一般来说优先级上:创作人员 > 读者 > 用户代理

CSS2.1的层叠规则:

1、找出所有相关的规则,这些规则都包含与一个给定元素匹配的选择器。

2、按显式权重对应用到该元素的所有声明进行排序,有!important标志的声明的权重要高于不带!important标志的声明。

3、按来源对应用到给定元素的所有声明进行排序。正常情况下,创作人员的样式要胜过读者的样式。有!important标志的的读者样式要强于所有其他样式,包括有!important标志的创作人员样式。创作人员的样式和读者样式斗都比用户代理的默认样式强。

4、按选择器优先级对应用到给定元素的所有声明进行排序,有较高优先级的元素权重要大于有较低特殊性的元素。

5、按出现顺序对应用到给定元素的所有声明进行排序,后面出现的声明权重要大于前面出现的声明,即后定义的样式会覆盖前面定义的样式。

总结:找出一个给定元素的所有声明后,先按显式权重和来源进行排序。如果相同,则比较选择器优先级。若再相同,则比较顺序。

按选择器优先级的层叠规则:

将优先级分为四组,即a-b-c-d,分别对应:内联style--id--类class--标签元素,当a相同时比较b,b相同时比较c,c相同时比较d。

1、对于内联样式,a加1,即1-0-0-0。
2、对于选择器中出现的ID属性值,在b处加1,即0-1-0-0(有多少个ID值就在b位加几位) 。
3、对于选择器中出现的类属性值,属性选择及伪类,在c处加1,即0-0-1-0(共出现多少个就在c位加几位)。
4、对于选择器中出现的元素,以及伪元素,在d处加1,,即0-0-0-1(共出现多少个就在d位加几位)。
5、通配符(*)对特殊性没有任何贡献,即特殊性是0,0,0,0。
6、结合符没有特殊性,连0特殊性也没有。
7、继承的CSS完全没有特殊性,连0特殊性也没有(CSS中的继承是有选择性的,并不是全部CSS都继承,像边框属性就不会继承)。

*             {}  /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
 li            {}  /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
 li:first-line {}  /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
 ul li         {}  /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
 ul ol+li      {}  /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */
 h1 + *[rel=up]{}  /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
 ul ol li.red  {}  /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
 li.red.level  {}  /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */
 #x34y         {}  /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
 style=""          /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
 

由以上可以知道style优先级别最高。

以上的层叠规则是基于标签有被选择器选中的情况,但标签没被选择器选中时,样式属性一般有两个来源,一个是浏览器默认样式,一个来源于继承,接下来简单说一下继承。

继承是指在CSS中的祖先元素会向后代传递CSS属性的值。例如body元素是所有元素的祖先,所有标签都是它的后代,比如为body元素设置一种字体,那么文档中的所有元素,无论它在层次结构中多么靠后,都将继承这些样式。

当然,CSS中也不是所有属性都能被后代继承,比如边框border属性就不能够被继承。

最后附上本文的参考文章:

CSS的“层叠”规则的总结

id 的选择器为什么要这么写 li#first?

其实很想用实例来说明,一是理解及使用上还不够深刻,二是时间原因,只能先到这,后面我会继续补充,加入我在使用中的理解。
发布了39 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/HU_YEWEN/article/details/84487360
今日推荐