css属性值的计算、选择器权重

元素能呈现效果,归功于样式的属性值,同一个样式,属性值不一样,呈现的效果就不一样。在页面呈现出来之前,在我们看不到的地方(浏览器的渲染引擎)进行着复杂的css属性值的计算,在对最后的计算结果属性值进行渲染。

属性值的计算过程

1.确定声明值

我们把样式属性编写在样式表中,就是对该样式属性的声明,告诉渲染引擎我们要用到这个属性。当新的样式表中没有出现旧样式表声明过的属性时,没有被重新声明的属性的属性值不变。如:

.div{   /* 旧样式表 */
	height: 100px;
	width: 100px;
	}
.div{   /* 新样式表 */
	display: none;
	}

新的样式表中,并没有重新声明width和height,所以元素的width还是100px,height还是100px。

2.层叠冲突

当样式表中有冲突的声明时(新旧样式表都声明了同一个属性),我们需要使用层叠规则(比较重要性;特许性;源次序)来判断并确定css属性值:

(1)重要性

重要性排序:添加了!important的样式 > 普通声明的样式 > 浏览器中的默认样式

.span{
	font-size: 20px !important;
	font-size: 30px;
}

“font-size: 30px”会覆盖浏览器的默认字体大小,但是“font-size: 20px;!important”会覆盖“font-size: 30px”,所以最终字体大小会呈现为20px

(2)特殊性(比较选择器的权重)

权重的比较,我们可以用一个4位数规则来进行:

a.千位:内联样式表记在千位,有就记1,否则记0(内联样式表的样式优先级比外联样式表的都大);
b.百位:百位用来记ID选择器的数量,出现多少个ID选择器,百位数值就是多少;
c.十位:十位用来记类选择器、属性选择器、伪类选择器一共的数量,一共有多少个以上选择器,十位数值就是多少;
d.个位:个位用来记元素选择器(标签选择器)、伪元素选择器的数量,一共有多少个以上选择器,个位数值就是多少;

<style>
    /* 100 + 10 + 10   =120*/
    #div .ul .li{
        font-size: 16px;
    }
    /* 100 + 10 + 1   =111*/ 
    #div .ul li{
        font-size: 20px;
    }
    /* 10 + 10 + 10   =30*/
    .div .ul .li{
        font-size: 30px;
    }
    /* 10 + 100 + 100    =210*/
    .div #ul #li{
        font-size: 60px;
    }
    /* 100 + 100 +100    =300*/
    #div #ul #li{
        font-size: 25px;
    }
</style>
<body>
    <div id="div" class="div">
        <ul id="ul" class="ul">
            <li class="li" id="li">
                我的字体大小是多大!   <!-- 25px -->
            </li>
        </ul>
    </div>
</body>
(3)源次序

按照代码在文档中的顺序:后来居上

.span{
	font-size: 20px;
	font-size: 30px;
}

如上,“font-size: 30px;”会把“font-size: 20px;”覆盖,最后字体大小会是30px

3.继承性

在样式表中,有些属性的属性值可以继承父级元素中对应属性的属性值;如果有属性经过上面两步的计算仍然没有赋予属性值,并且是可以继承属性值的属性,会继承父级元素的属性值

可继承属性:所有 line-/font-/text- 开头的属性、colorvisibilitycursor

<style>
    #div{
        font-size: 25px;
        text-align: center;
        line-height: 25px;
    }
</style>

<body>
    <div id="div" class="div">
        <ul id="ul" class="ul">
            <li class="li" id="li">
                我的字体大小是多大!
                <!-- 25px -->
            </li>
        </ul>
    </div>
</body>

逐级继承:li继承ul,ul继承div,最终li元素中的font-size、text-align、line-height属性的属性值都继承自div

在这里插入图片描述

继承自div的样式中,text-align属性会被划掉,是因为li元素自身有text-align的默认样式

4.默认值

如果有属性经过上面三步的计算仍然没有赋予属性值,该属性的属性值使用浏览器渲染引擎中的默认值;

CSS选择器权重计算是通过CSS Specificity(特殊性)来确定的。在计算权重时,可以按照以下规则进行计算: 1. 选择器的特殊性由选择器本身的组成部分决定,包括元素选择器、类选择器、id选择器和内联样式。通常来说,id选择器的特殊性最高,其次是类选择器属性选择器,再次是元素选择器。 2. 对于相同特殊性的选择器,后面出现的选择器会覆盖前面出现的选择器。 3. 使用!important声明的样式具有最高的特殊性,将覆盖其他所有的样式。 根据上述规则,可以用以下公式来计算选择器权重: - id选择器权重为1,例如#myId{} - 类选择器属性选择器或伪类选择器权重为10,例如.class{}、[type="text"]{}、:hover{} - 元素选择器或伪元素选择器权重为100,例如div{}、::before{} - 内联样式:权重为1000,例如<div style="color:red;"> 在计算完各个选择器权重后,具体的权重比较规则是:按照权重从左到右依次比较,权重较大的样式会覆盖权重较小的样式。 需要注意的是,CSS权重计算只适用于冲突的样式规则。如果没有发生冲突,那么所有样式规则都会生效。 总结起来,CSS选择器权重计算是通过特殊性来确定的,特殊性由选择器本身的组成部分决定,而权重比较是按照权重从左到右依次比较的原则。这样,在编写CSS样式时,我们可以更好地控制样式的优先级。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CSS选择器权重计算(详细)](https://blog.csdn.net/weixin_44164982/article/details/107227294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [CSS选择器权重计算](https://blog.csdn.net/u010297791/article/details/58602255)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值