Css 权重计算规则 
CSS:Cascading Stylesheets(层叠样式表,也叫级联样式表)
级联(层叠)算法可以分为以下四个模块: 
- 位置和出现的顺序:css 规则出现的顺序。
- 特征性(具体性 Specificity):确定 css 选择器具有最高匹配权的算法。
- 来源: css 在何时何处生成。它是否是一个浏览器样式或者是浏览器插件添加的样式,又或者是你写的 css 代码。
- 重要性:一些 css 规则具有更高的重要性,特别是包含!important 值的规则。
一:位置和出现的顺序 
link,style 样式越靠后权重越高,但是不适用于內联样式(通过元素 style 属性定义的样式,内联样式会覆盖所有其他的 css,无论这些 css 出现的位置和顺序,除非 css 规则的声明值定义为!important,!important 比内联样式的重要性更高。)
css
<style>
button {
  color: yellow;
}
button {
  color: red;
}
</style>
<button>这里是红色的按钮</button>二:特征性(具体性 Specificity) 
特征性是一种决定哪个 css 选择器最具体的算法。这里的最具体的意思,你可以看成哪个 css 权重最高的意思,选择器权重最高的 css 规则,在规则冲突中将会胜出。 有了特征性算法,即使有多个不同的 css 规则具有不同的选择器产生了规则冲突,浏览器也可以决定最后使用哪个 css 规则去渲染页面。
1. 特征性分数(权重) 
比较两个选择器的特征性(权重)大小,实际上是计算两个选择器的分数(权重,后面我统称权重),权重大的将会在规则冲突中胜出。
通配选择器:0 
类型(标签)选择器和伪元素选择器:1 
类选择器、伪类选择器和属性选择器:10 
ID 选择器:100 
内联样式:1000 
!important:10000 
2. 权重的累加 
一个选择器的权重分数是累加计算的。
css
// 假设有如下html:
<a class="my-class another-class" href="#">A link</a>
/* 权重为 1 */
a {
  color: red;
}
/* 加一个类使选择器,权重为 11 */
a.my-class {
  color: green;
}
/* 再添加一个类名,权重为 21 */
a.my-class.another-class {
  color: rebeccapurple;
}
/* 在上面的基础上,添加一个属性,权重为 31 */
a.my-class.another-class[href] {
  color: goldenrod;
}
/* 添加一个伪类,权重为 41 */
a.my-class.another-class[href]:hover {
  color: lightgrey;
}3. 可视化特征性 
至此你应该知道了如何去计算一个选择性的权重(分数)。如何去写一个规则覆盖另一个规则。下面的示意图很好的总结了各类型选择器的权重(分数)。  最左侧是 id 选择器,中间是类选择器、属性选择器和伪类选择器,最后面是元素选择器和伪元素选择器。 如果用图中的格式描述权重,下面的权重为 0-4-1:
 最左侧是 id 选择器,中间是类选择器、属性选择器和伪类选择器,最后面是元素选择器和伪元素选择器。 如果用图中的格式描述权重,下面的权重为 0-4-1:
css
a.my-class.another-class[href]:hover {
  color: lightgrey;
}三:来源 
css 来自不同的地方,也会影响是否会在规则冲突中胜出。关于样式的来源的特征性从低到高如下:
- 用户代理样式:也就是浏览器默认样式。
- 本地用户样式:一般来源于系统设定,也可以是浏览器插件设定的样式。某些浏览器插件允许用户定义自己的浏览器页面样式。
- 开发者定义的 css 规则:指网页开发者写下的 css 样式。
- 标记为!important 的 css: 网页开发者写的含!important 标记的 css 样式。
- 含!important 的本地用户样式:与 2 来源相同,不过这个 css 含有!important 标记。
- 含!important 的用户代理样式:与 1 来源相同,不过这个 css 含有!important 标记。
四:重要性 
并不是所有的 css 规则都和其他 css 按照同样方式计算特征性。 不同种类的 css 规则重要性从低到高依次如下:
- 普通规则:例如 font-size、background 或者 color。
- animation 规则。
- !important 规则。
- transition 规则。
所以当某些动画规则或者变换规则激活时,它会取代普通规则,进行渲染页面。