前言

上篇文章中有提到CSS值的处理过程,但如果想要确定一个元素的最终样式值可以不需要这么多步。实际上我们写的任何一个标签元素无论写没写样式,它都会有一套完整的样式。理解这一点非常重要️

比如:一个简单的p标签

打开浏览器控制台,选中元素,切换到computed选项,勾选show all,这里就能够看到元素的所有CSS样式,尽管你什么样式也没写,它们也是有默认值的。任何标签都是这样,只不过默认值可能不一样。

一道面试题

<div style="color: red;">
   <p>前端</p>
   <a href="#">南玖</a>
</div>

很简单的一段代码,只需回答出这两个元素各自的文字颜色。

如果能够正确回答出,并知道其中的原理,OK那么这篇文章要讲的内容你都掌握了,如果不能,那么这篇文章需要好好阅读并理解一番。

答案是一红一蓝。

CSS属性值的确定步骤

要确定属性值的话,我们可以先想想CSS属性值都可以从哪里来?

声明值?继承?默认值?

想了想CSS值好像也只能从这三个地方来获取,再加上一个比较权重,我们是不是就可以确定一个CSS属性的值了?

ok,浏览器也确实是按这些步骤来确定CSS属性值的:

  • 声明值:这里包含开发者自定义声明与用户代理的样式表【user agent stylesheet】(相当于浏览器默认样式表需要与默认值区分开)
  • 比较权重:因为可能会有重复声明
  • 继承:如果前两步还没确定值并且这个属性是可以继承的话,那么这个时候就可以使用继承值
  • 默认值:最后如果还是无法确认值的话才会使用默认值

声明值

第一步是确认声明值,还是以上面代码为例

<div style="color: red;">
   <p>前端</p>
   <a href="#">南玖</a>
</div>

当前div既有开发者自定义声明样式(红框)也有用户代理样式(蓝框),这两块都属于声明值。

比较权重

再把代码做点变更

<div style="color: red;">
   <p style="margin: 2px;">前端</p>
   <a href="#">南玖</a>
</div>

注意看此时p标签的外边距

由于开发者自定义声明样式表与用户代理样式表都有定义margin值,最终应用的是开发者自定义声明样式表,所以开发者自定义声明样式表的权重要高于用户代理样式表

如果同为开发者自定义声明的样式表有冲突,则按正常的样式权重进行比较。对比较规则不了解的同学可以查看文档

继承

同样还是上面的代码,我们可以看到对于p标签我们既没有声明他的文字颜色,用户代理样式表同样也没声明文字颜色,那么它的红色是从哪来的呢?

答案是继承自div的文字颜色,因为前两步都不能确定p标签的color属性值,而color又恰好是可以继承的,并且父元素又正好有定义color属性的值。所以此时p标签就会继承父元素的color属性,渲染成红色字体。

这里需要注意的是继承采用就近原则,与权重无关

比如:

<div style="color: yellow !important;">
   <div style="color: red;">
       <p style="margin: 2px;">前端</p>
       <a href="#">南玖</a>
   </div>
</div>

这里虽然important的权重更高,但最终继承的还是最近的属性值。

默认值

如果前三步都没能确认属性的值,则会使用默认值。

代码同上,比如还是p标签,我们没有自定义声明它的font-size,用户代理样式表也同样没有声明,它的父级元素同样没有声明,这也就说明对于font-size来说既没有声明值也没有继承值,那它最终渲染是按多大的字号来呈现的呢?

答案就是默认值,谷歌浏览器对于p标签的默认字号为16px。

面试题解答

<div style="color: red;">
   <p>前端</p>
   <a href="#">南玖</a>
</div>

p标签文字为红色这很好理解,因为继承自父元素的color值。

问题在于为什么a标签没有继承呢?

因为对于a标签来说,虽然没有自定义声明color,但用户代理样式表中有声明color,所以会直接使用用户代理样式表中的color值,而不会使用继承值。

浏览器如何确定最终的CSS属性值?解析计算优先级与规则的更多相关文章

  1. javascript之复习(css属性值的计算)

    js取div的宽高咋办,css有content-box,border-box,padding-box,表现又不一样.好在有个offsetWidth, <style type="text ...

  2. JS中使用document.defaultView.getComputedStyle()、currentStyle()方法获取CSS属性值

    在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属性 ...

  3. CSS学习(7)继承、属性值的计算过程

    子元素会继承父元素的某些css属性 通常跟字体相关的属性都能被继承,具体的可以在mdn里查询是否是可继承属性 属性值的计算过程(渲染过程) 按照页面文档的树形目录结构进行依次渲染 前提条件:渲染的元素 ...

  4. CSS属性值一览

    牢记内联式>嵌入式(嵌入式中设置各种文字字体.大小.位置.颜色.外距.内距最好用选择器)>外部式(外联式)的使用 属性和属性值(点击可展开) font-family(字体) Microso ...

  5. css属性值语法解读

    //margin 形式语法: [ <length> | <percentage> | auto ]{1,4} //合法实例: margin: style /*单值语法 */ 举 ...

  6. js修改css属性值

    推荐用dom.style.setProperty('属性','属性值'); 例如: $("#id")[0].style.setProperty('margin-top','1px' ...

  7. 通过id设置的css属性和通过元素设置的css属性冲突了,优先级哪个高?

    ---恢复内容开始--- <!DOCTYPE html> <html> <head> <title>div test</title> < ...

  8. 在不同的浏览器下FORM及它的小伙伴们默认样式的CSS属性值是不全然一致

    我们一般在定义CSS样式的时候都须要定义去掉HTML标签默认样式的CSS,原因是在不同的浏览器以下它们的表现出来的默认样式不全然一致,我们要保证在不同的浏览器下它们能正常显示出我们想要达到的预期效果, ...

  9. JS使用getComputedStyle()方法获取CSS属性值

    在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如下: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属 ...

  10. JS 获取CSS属性值

    obj: 元素对象 attribute: 属性 返回值:该对象这个属性的值 function getDefaultStyle(obj,attribute){ // 返回最终样式函数,兼容IE和DOM, ...

随机推荐

  1. VSCODE接入DeepSeek R1实现AI完成自动化脚本实战开发

    大家好,我是六哥,今天还是我们喜爱的DeepSeek的玩法,今天来个实战案例,和大家分享一下如何将DeepSeek接入VS Code,结合AI Toolkit插件完成自动化脚本的实战开发. 一.准备 ...

  2. SQL注入的业务场景以及危害

    SQL注入的业务场景以及危害 在现代Web应用中,数据库是存储和检索数据的核心组件.然而,当Web应用未能正确验证和过滤用户输入时,就可能会遭受SQL注入攻击.SQL注入是一种严重的安全漏洞,它允许攻 ...

  3. 支付宝 v3 自签名如何实现

    今天在看文档的时候,发现支付宝新出了一个 v3 版本的接口调用方式,感觉有点意思,花了点时间研究了下这个版本要怎么实现自签名,大家有兴趣可以看看. 什么是支付宝 API v3 版本? 官网上给的解释是 ...

  4. ASP.NET Core 6 基础入门系列(1) ASP.NET Core 6.0 简介

    系列目录     [已更新最新开发文章,点击查看详细] 预备知识1:  C#5.C#6.C#7.C#8.C#9.C#10 预备知识2:  .NET 对比 .NET Framework 预备知识3:   ...

  5. DXF文件导入PADS板框问题

    在使用PADS时,经常会从CAD文件中导出板框形状到PADS中. 也经常碰到一个问题:就是单位不匹配,CAD中明明设置成毫米了,可导入到PADS时却是mil. 发现单位不匹配的情况跟AUTOCAD里面 ...

  6. WPF调用FishSpeech的Demo

    写了一个FishSpeech的教程:使用FishSpeech进行语音合成推理 - 天命小猪 - 博客园 研究了一下如何调用服务器API,朗读文本. 经过调研,决定使用NAudio库播放音频.遇到了一些 ...

  7. Flink学习(十六) ProcessFunctionAPI(底层API)

    我们之前学习的转换算子是无法访问时间的时间戳信息和水位线信息的.而这些在一些应用场景下,极为重要,例如MapFunction这样的map转换算子就无法访问时间戳或者当前事件的事件时间. 基于此,Dat ...

  8. [Software Note ] Fibersim-export-OffsetedMesh

    输出Offseted 的Drape data 只在fibersim 导出界面打开Allow offset simulation 选项,输出的网格还是在layup surface 上: 输出的数据并未偏 ...

  9. MySQL 8.0 语法记录

    SQL又杂又烦,记不住,网上搜到的语句还未必正确.这里做一个Record 基本操作 数据库操作 数据表操作 create index [索引名] on [表名]([列名]); /* 以选定列为索引信息 ...

  10. go 组合函数 Collection

    我们经常需要程序在数据集上执行操作,比如选择满足给定条件的所有项,或者将所有的项通过一个自定义函数映射到一个新的集合上. 在某些语言中,会习惯使用泛型. Go 不支持泛型,在 Go 中,当你的程序或者 ...