浅析CSS样式权重和优先级

1,253 阅读2分钟

这是我参与更文挑战的第13天,活动详情查看:更文挑战

一、什么是优先级:

即通过优先级来判断如何在页面上显示这些样式。优先级是基于不同种类的选择器组成的匹配规则。 关于CSS的选择器可以看这篇《一次性搞懂CSS选择器》,这里就不重复讲啦。

二、优先级是怎么样计算的?

注意: 文档树中元素的接近度对优先级没有影响

比如我们在这样一段代码当中,对同一个div进行样式的设定。

<body>
<div id="box" class="container"></div>
</body>

通配符 VS 标签选择器

当我们对其声明通配符和标签选择器两种的时候,由于标签选择器的优先级大于通配符,所以在盒子里面呈现绿色。

<style>
    .container {
        text-align: center;
        color: white;
        height: 200px;
        width: 200px;
    }
    * {  
        background-color: firebrick;    /* 通配符 */
    }
    div {
        background-color: green;   /* 标签选择器 */
    }
</style>

image.png

属性选择器VS标签选择器

同样的例子,我们修改一下选择器的类型。

    div {
        background-color: green;   /* 标签选择器 */
    }
    .container {
        background-color: crimson;   /* 属性选择器 */
    }

image.png

可以看到,属性选择器的优先级是大于标签选择器的,所以呈现红色。

id选择器 VS 属性选择器

    .container {
        background-color: crimson;   /* 属性选择器 */
    }
    #box {
        background-color: gold;   /* id选择器 */
    }    

image.png 由此可见,id选择器的优先级大于属性选择器,所以呈现金色。

行内样式 VS id选择器

我们在开发中其实也是会写到行内样式的,接下来我们就来看看哪个的优先级更高。

<div id="box" class="container" style="background-color: hotpink;"></div>
#box {
  background-color: gold;   /* id选择器 */
} 

显示的效果👇

image.png

所以行内样式其实是比普通的选择器的优先级高的。

!important

另外,!important是例外的规则,当一个样式当中使用了!important规则时,会覆盖其他的任何。

比如我们在刚刚优先级最低的通配符当中设置背景颜色,其他选择器样式都不变。

 * {
   background-color: indigo !important;
}
/* 标签选择器 */
div {
  background-color: green;
}
/* 属性选择器 */
.container {
   background-color: crimson;
}
/* id选择器 */ 
#box {
   background-color: gold;
}

image.png

可以看到,使用!important的优先级是最高的,所以覆盖了前面的样式。

但是盲目使用!important是一种坏习惯,因为它破坏了样式表当中的规则,当我们在调试的时候,就会变得非常的困难。

最后总结一下选择器上的优先级:

!important>行内样式>id选择器>class选择器/属性选择器>标签选择器>通配符*