什么是权重
- 权重决定了你css规则怎样被浏览器解析直到生效。“css权重关系到你的css规则是怎样显示的”。
- 当很多的样式被应用到某一个元素上时,权重是一个决定哪种样式生效,或者是优先级的过程。
- 每个选择器都有自己的权重。你的每条css规则,都包含一个权重级别。 这个级别是由不同的选择器加权计算的,通过权重,不同的样式最终会作用到你的网页中 。
- 如果两个选择器同时作用到一个元素上,权重高者生效。
权重记忆口诀:从0开始,一个行内样式+1000,一个id选择器+100,一个属性选择器、class或者伪类+10,一个元素选择器,或者伪元素+1,通配符+0。
css权重值记忆图
接下来增加一下记忆,下面是我瞎写的一个样式,只看选择器那里就可以了,具体样式请忽略,我分别用了id选择器、class选择器和标签选择器各一次。

样式重复多写情况
在css样式表中,同一个CSS样式你写了两次,后面的会覆盖前面的,在开发中基本不会使用。
#box {background-color: green;}/* 这条生效 */#box {background-color: blue;}
不同的权重,权重值高则生效
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>权重高的样式生效</title><style>/* 权重值:1 */div{width: 100px;height: 100px;background-color: red;}/* 权重值:10 */.box2{width: 100px;height: 100px;background-color: yellow;}/* 权重值:100 */#box{width: 100px;height: 100px;background-color: green;}</style></head><body><div id='box' class='box2'></div></body></html>
id的权重高,所以id选择器中的样式生效
从上面的例子不难看出,id选择器的权重值高于其它2种选择器的权重值,所以id选择器中的样式生效了。
!important(提升样式优先级)
!important的作用是提升样式优先级,如果加了这句的样式的优先级是最高的。不过我这里*_建议大家一下,!important最好不要使用。_
<style>div{background: blue !important;}#box{background-color: green;}</style></head><body><div id="box" style="background-color: red;width: 100px;height: 100px;"></div></body>
!important 优先级是最高的,不建议使用
两种样式都使用!important时
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>当两个样式都使用!important时</title><style>.box{width: 100px;height: 100px;background-color: red !important;}div{width: 100px;height: 100px;background-color: green !important;}</style></head><body><!-- 当两个样式都使用!important时,权重值大的优先级更高 --><div class='box'></div></body></html>
当两个样式都使用!important时,权重值大的优先级更高
!important应用于简写样式
如果!important被用于一个简写的样式属性,那么这条简写的样式属性所代表的子属性都会被作用上!important。
例如:background: blue !important;
简单写的样式如果使用!important,子属性也会默认加上important
上述结果可以看出,background的子属性都加上了!important,到这里,我提醒一下开发者们,这种复合性样式不建议大量使用,如果里面的属性大多数是可以用到的,还是可以写复合性样式的。我经常看到一些开发都,给某一元素加上颜色,经常性的写成这样
background:red;
这个样式从表面来说,和background-color:red;一样可以实现效果。
这时你可以通过浏览器的调试工具来查看它具体的样式:
goolge下的效果图
使用复合写法的时候,它不光只加载了背景颜色样式,还加载了其它一些样式。可想而知,如果一个项目的前台全部都采用复合写法的方式,第设置一个background样式时background相关的样式都会被加载进去,这样性能一定非常差,这也是一种不合理的设计方 案,而单例写法却看不到这种情况。
行内、内联和外联样式优先级
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>css优先级</title><link rel='stylesheet' href='css/styles.css'><style>div{background-color: blue;}#box{background-color: green;}</style></head><body><!-- 行内样式生效 --><div id="box" style="background-color: red;width: 100px;height: 100px;"></div></body></html>
效果图
根据权重值来计算,行内样式的权重值最大,所以行内样式生效了。
内联和外联样式优先级
这里我曾经一直以为内联样式的优先级一定大于外联样式的,直到最近的几天我才发现我一直都学错了,所以这里也是给大家提个醒,希望自己也牢记这个教训。
/* styles.css */#box{background-color: yellow;}#div{width: 500px;height: 500px;background-color: pink;}
1.外联样式写前面,内联样式写后面
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>内联和外联样式的优先级问题</title><link rel='stylesheet' href='css/styles.css'><style>#div{width: 200px;height: 200px;background-color: yellow;}</style></head><body><!-- 内联样式生效 --><div id='div'></div></body></html>
内联样式生效
2.内联样式写前面,外联样式写后面
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>内联和外联样式的优先级问题</title><style>#div{width: 200px;height: 200px;background-color: yellow;}</style><link rel='stylesheet' href='css/styles.css'></head><body><!-- 内联样式生效 --><div id='div'></div></body></html>
外联样式生效
上面的例子足以说明内联样式的优先级并不一定比外联样式高,因为css样式是单线程,依次从上向下加载的,这也就证明了*_内联样式和外联样式的优先级和加载顺序有关_。
总结一下:!important > 行内样式 > 内联样式 and 外联样式
样式优先级
样式应用于非目标标签时
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>样式应用于非目标标签时</title><style>div p{color: red};#box{color: blue}</style></head><body><!-- 选中非目标元素的情况下,离目标越近者优先 --><div id="box"><p><span>神来之笔</span></p></div></body></html>
效果图
权重相等的情况下
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>权重相等的情况下</title><style>/* 权重值:201 */#box #box2 p{width: 200px;height: 200px;background-color: red;}/* 权重值:201,离目标最近 */#box #box3 p{width: 200px;height: 200px;background-color: yellow;}</style></head><body><!-- 同等权重下,靠近目标的优先 --><div id="box" class="boxs"><div id="box2" class="boxs2"><div id="box3" class="boxs3"><p></p></div></div></div></body></html>
同等权重下,靠近目标的优先
总结
- 常用选择器权重优先级:*_!important > id > class > tag_
- !important可以提升样式优先级,但不建议使用。如果!important被用于一个简写的样式属性,那么这条简写的样式属性所代表的子属性都会被应用上!important。 例如:background: blue !important;
- 如果两条样式都使用!important,则权重值高的优先级更高
- 在css样式表中,同一个CSS样式你写了两次,后面的会覆盖前面的
- 样式指向同一元素,权重规则生效,权重大的被应用
- 样式指向同一元素,权重规则生效,权重相同时,就近原则生效,后面定义的被应用
- 样式不指向同一元素时,权重规则失效,就近原则生效,离目标元素最近的样式被应用
