博客为何而来:今天遇到一个问题:标签.类名的权重是多少?这个我也不是很清楚,本来想走捷径:问问别人,百度一下啊……问了一个同学,他开口直接说是20;我问为毛是20,他说标签名10,类名是10,共计20。在我指出标签名权重是1后,他也觉得自己说错了。我百度了一下,也没有得到什么结果。觉得自己的验证过程可以写篇小博客,然后此刻也不是很慢,那我就不拖拉,就是干咯。

类名.标签,可以解释为:标签中有此类名的元素。

大家都知道

  • id选择器的权重加0,1,0,0;
  • 类选择器、属性选择器或伪类的权重加0,0,1,0;
  • 元素和伪元素的权重加0,0,0,1;
  • 元素和伪元素的权重加0,0,0,1;
  • 通配选择器*对权重没有贡献,即0,0,0,0;
  • 最后比较特殊的一个标志!important,它的优先级是最高的,为了方便记忆,可以认为它的权重为1,0,0,0,0;

权重越高,样式被应用的优先级也就越高,约难被其他样式覆盖;

话不多说,计算权重代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>标签.类名的权重是多少?</title>
        <style>
            /* 权重:10+10=20 位置:1*/
            .container .child{
                color: red;
            }
            /* 权重:10 位置:2*/
            .child{
                color: blue;
            }
            /* 权重:10+1=11 位置:3*/
            .container p{
                color: green;
            }
            /* 权重是多少呢? 位置:4*/
            p.child{
                color: yellow;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <p class="child">标签.类名的权重是多少?</p>
        </div>
    </body>
    </html>

我计算的方法:通过比较已知的类名权重和层叠样式表中权重相同的样式,后面的样式会覆盖前面的样式的样式,来计算出标签.类名的权重。放到代码中具体实现是:通过定义样式,来改变p标签的文本颜色,查看浏览器渲染结果,来得出权重值;

为了高效计算这个值,我们直接在浏览器中调试样式了。
首先,直接执行上面代码,结果截图如下:

clipboard.png

分析:我们知道,类名的权重是10,两个类名叠加权重值为20;而且这个样式位置在最顶部,添加在同一个标签上的其他样式都没有生效,所以其他的样式权重都小于20;
其次,直接在浏览器中取消已经生效的样式,看看浏览器会渲染哪个样式,渲染哪个,第二个权重高的样式可能就是哪个啦,结果截图如下:

clipboard.png

分析:难道这个权重是第二高的吗?我们知道,同权重的样式,层叠样式表中越靠后的会覆盖前面的,上面代码中标签.类名这个样式是写在最后,我们可以先换换样式的位置,再下定论;
接下来,换位置,再执行:
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>标签.类名的权重是多少?</title>
<style>
    /* 权重:10+10=20 位置:1*/
    /*.container .child{
        color: red;
    }*/
    /* 权重是多少呢? 位置:4*/
    p.child{
        color: yellow;
    }
    /* 权重:10 位置:2*/
    .child{
        color: blue;
    }
    /* 权重:10+1=11 位置:3*/
    .container p{
        color: green;
    }
</style>
</head>
<body>
    <div class="container">
        <p class="child">标签.类名的权重是多少?</p>
    </div>
</body>
</html>

注意:这里的标签.类名的样式已经被提到第二的位置了,并且通过前面的操作,我们已经知道标签.类名的权重小于20,所以我们这里直接把双类名的权重给注释掉;

重新执行代码,运行结果截图如下:

clipboard.png

分析:更换位置之后的结果和上面的结果不符,所以这里是因为靠下的样式会覆盖同权重的样式的缘故。这里也可以得出,(类名 标签)的权重和(标签.类名)的权重一样,也就是11

小结:标签.类名的权重是11。

好啦,博客随着有了结果,也就写完了,趁着下午天气不是很热,砖不烫手,赶紧去搬砖了。


半岛铁盒
100 声望45 粉丝

我想成为“大”前端,在杭州拥有“大”未来~