什么是权重

    1. 权重决定了你css规则怎样被浏览器解析直到生效。“css权重关系到你的css规则是怎样显示的”。
    2. 当很多的样式被应用到某一个元素上时,权重是一个决定哪种样式生效,或者是优先级的过程。
    3. 每个选择器都有自己的权重。你的每条css规则,都包含一个权重级别。 这个级别是由不同的选择器加权计算的,通过权重,不同的样式最终会作用到你的网页中 。
    4. 如果两个选择器同时作用到一个元素上,权重高者生效。

    权重记忆口诀从0开始,一个行内样式+1000,一个id选择器+100,一个属性选择器、class或者伪类+10,一个元素选择器,或者伪元素+1,通配符+0。

    权重 - 图1css权重值记忆图

    接下来增加一下记忆,下面是我瞎写的一个样式,只看选择器那里就可以了,具体样式请忽略,我分别用了id选择器、class选择器和标签选择器各一次。

    权重 - 图2

    样式重复多写情况

    在css样式表中,同一个CSS样式你写了两次,后面的会覆盖前面的,在开发中基本不会使用。

    1. #box {
    2. background-color: green;
    3. }
    4. /* 这条生效 */
    5. #box {
    6. background-color: blue;
    7. }

    不同的权重,权重值高则生效

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>权重高的样式生效</title>
    6. <style>
    7. /* 权重值:1 */
    8. div{
    9. width: 100px;
    10. height: 100px;
    11. background-color: red;
    12. }
    13. /* 权重值:10 */
    14. .box2{
    15. width: 100px;
    16. height: 100px;
    17. background-color: yellow;
    18. }
    19. /* 权重值:100 */
    20. #box{
    21. width: 100px;
    22. height: 100px;
    23. background-color: green;
    24. }
    25. </style>
    26. </head>
    27. <body>
    28. <div id='box' class='box2'></div>
    29. </body>
    30. </html>

    权重 - 图3id的权重高,所以id选择器中的样式生效

    从上面的例子不难看出,id选择器的权重值高于其它2种选择器的权重值,所以id选择器中的样式生效了。

    !important(提升样式优先级)

    !important的作用是提升样式优先级,如果加了这句的样式的优先级是最高的。不过我这里*_建议大家一下,!important最好不要使用。_

    1. <style>
    2. div{
    3. background: blue !important;
    4. }
    5. #box{
    6. background-color: green;
    7. }
    8. </style>
    9. </head>
    10. <body>
    11. <div id="box" style="background-color: red;width: 100px;height: 100px;"></div>
    12. </body>

    权重 - 图4!important 优先级是最高的,不建议使用

    两种样式都使用!important时

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>当两个样式都使用!important时</title>
    6. <style>
    7. .box{
    8. width: 100px;
    9. height: 100px;
    10. background-color: red !important;
    11. }
    12. div{
    13. width: 100px;
    14. height: 100px;
    15. background-color: green !important;
    16. }
    17. </style>
    18. </head>
    19. <body>
    20. <!-- 当两个样式都使用!important时,权重值大的优先级更高 -->
    21. <div class='box'></div>
    22. </body>
    23. </html>

    权重 - 图5当两个样式都使用!important时,权重值大的优先级更高

    !important应用于简写样式

    如果!important被用于一个简写的样式属性,那么这条简写的样式属性所代表的子属性都会被作用上!important。

    例如:background: blue !important;

    权重 - 图6简单写的样式如果使用!important,子属性也会默认加上important

    上述结果可以看出,background的子属性都加上了!important,到这里,我提醒一下开发者们,这种复合性样式不建议大量使用,如果里面的属性大多数是可以用到的,还是可以写复合性样式的。我经常看到一些开发都,给某一元素加上颜色,经常性的写成这样

    1. background:red;

    这个样式从表面来说,和background-color:red;一样可以实现效果。

    这时你可以通过浏览器的调试工具来查看它具体的样式:

    权重 - 图7goolge下的效果图

    使用复合写法的时候,它不光只加载了背景颜色样式,还加载了其它一些样式。可想而知,如果一个项目的前台全部都采用复合写法的方式,第设置一个background样式时background相关的样式都会被加载进去,这样性能一定非常差,这也是一种不合理的设计方 案,而单例写法却看不到这种情况。

    行内、内联和外联样式优先级

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>css优先级</title>
    6. <link rel='stylesheet' href='css/styles.css'>
    7. <style>
    8. div{
    9. background-color: blue;
    10. }
    11. #box{
    12. background-color: green;
    13. }
    14. </style>
    15. </head>
    16. <body>
    17. <!-- 行内样式生效 -->
    18. <div id="box" style="background-color: red;width: 100px;height: 100px;"></div>
    19. </body>
    20. </html>

    权重 - 图8效果图

    根据权重值来计算,行内样式的权重值最大,所以行内样式生效了。

    内联和外联样式优先级

    这里我曾经一直以为内联样式的优先级一定大于外联样式的,直到最近的几天我才发现我一直都学错了,所以这里也是给大家提个醒,希望自己也牢记这个教训。

    1. /* styles.css */
    2. #box{
    3. background-color: yellow;
    4. }
    5. #div{
    6. width: 500px;
    7. height: 500px;
    8. background-color: pink;
    9. }

    1.外联样式写前面,内联样式写后面

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>内联和外联样式的优先级问题</title>
    6. <link rel='stylesheet' href='css/styles.css'>
    7. <style>
    8. #div{
    9. width: 200px;
    10. height: 200px;
    11. background-color: yellow;
    12. }
    13. </style>
    14. </head>
    15. <body>
    16. <!-- 内联样式生效 -->
    17. <div id='div'></div>
    18. </body>
    19. </html>

    权重 - 图9内联样式生效

    2.内联样式写前面,外联样式写后面

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>内联和外联样式的优先级问题</title>
    6. <style>
    7. #div{
    8. width: 200px;
    9. height: 200px;
    10. background-color: yellow;
    11. }
    12. </style>
    13. <link rel='stylesheet' href='css/styles.css'>
    14. </head>
    15. <body>
    16. <!-- 内联样式生效 -->
    17. <div id='div'></div>
    18. </body>
    19. </html>

    权重 - 图10外联样式生效

    上面的例子足以说明内联样式的优先级并不一定比外联样式高,因为css样式是单线程,依次从上向下加载的,这也就证明了*_内联样式和外联样式的优先级和加载顺序有关_。

    总结一下:!important > 行内样式 > 内联样式 and 外联样式

    权重 - 图11样式优先级

    样式应用于非目标标签时

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>样式应用于非目标标签时</title>
    6. <style>
    7. div p{color: red};
    8. #box{color: blue}
    9. </style>
    10. </head>
    11. <body>
    12. <!-- 选中非目标元素的情况下,离目标越近者优先 -->
    13. <div id="box">
    14. <p>
    15. <span>神来之笔</span>
    16. </p>
    17. </div>
    18. </body>
    19. </html>

    权重 - 图12效果图

    权重相等的情况下

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>权重相等的情况下</title>
    6. <style>
    7. /* 权重值:201 */
    8. #box #box2 p{
    9. width: 200px;
    10. height: 200px;
    11. background-color: red;
    12. }
    13. /* 权重值:201,离目标最近 */
    14. #box #box3 p{
    15. width: 200px;
    16. height: 200px;
    17. background-color: yellow;
    18. }
    19. </style>
    20. </head>
    21. <body>
    22. <!-- 同等权重下,靠近目标的优先 -->
    23. <div id="box" class="boxs">
    24. <div id="box2" class="boxs2">
    25. <div id="box3" class="boxs3">
    26. <p></p>
    27. </div>
    28. </div>
    29. </div>
    30. </body>
    31. </html>

    权重 - 图13同等权重下,靠近目标的优先

    总结

    1. 常用选择器权重优先级:*_!important > id > class > tag_
    2. !important可以提升样式优先级,但不建议使用。如果!important被用于一个简写的样式属性,那么这条简写的样式属性所代表的子属性都会被应用上!important。 例如:background: blue !important;
    3. 如果两条样式都使用!important,则权重值高的优先级更高
    4. 在css样式表中,同一个CSS样式你写了两次,后面的会覆盖前面的
    5. 样式指向同一元素,权重规则生效,权重大的被应用
    6. 样式指向同一元素,权重规则生效,权重相同时,就近原则生效,后面定义的被应用
    7. 样式不指向同一元素时,权重规则失效,就近原则生效,离目标元素最近的样式被应用