CSS 属性值计算过程

目录

例子

我们来举例说明<h1> 标签最终的样式:

html 复制代码
<div>
  <h1 class="red">标题一</h1>
</div>

样式表1------自定义样式

css 复制代码
.red {
  color: salmon;
  font-size: 40px;
}

h1 {
  font-size: 30px;
}

div h1.red {
  font-size: 20px;
  font-size: 3em;
}

div {
  background-color: rgba(0, 0, 0, 0.3);
  text-align: center;
}

样式表2------浏览器默认样式


一个 css 属性计算出的最终属性值,会经过下面4个步骤。

1,确定声明值

在所有样式表中,没有冲突的 css 样式就是最终样式

可以看到,没有冲突的 css 样式有 color display margin-block-start... 等等。

所以这一步得到确定的最终样式:

css 复制代码
h1 {
  color: salmon;
  display: block;
  margin-block-start: 0.67em;
  margin-block-end: 0.67em;
  margin-inline-start: 0px;
  margin-inline-end: 0px;
  font-weight: bold;
  /* 其他 css 声明... */
}

2,层叠冲突

对样式表中,有冲突的声明使用层叠规则

2.1,比较源重要性

重要性:自定义样式 > 浏览器默认样式。

所以font-size 的最终值会在自定义样式中确定:

css 复制代码
.red {
  font-size: 40px;
}

h1 {
  font-size: 30px;
}

div h1.red {
  font-size: 20px;
  font-size: 3em;
}

这一步能够解释:为什么选择器权重低的自定义样式 * { margin: 0 },会覆盖浏览器默认的样式 body { margin: 8px }

2.2,比较优先级

也就是选择器的权重。很明显这个选择器的权重最高:

css 复制代码
div h1.red {
  font-size: 20px;
  font-size: 3em;
}

2.3,比较源次序

相同 css 样式,代码靠后的覆盖代码靠前的。

此时得到的最终样式:

css 复制代码
h1 {
  font-size: 3em;
  color: salmon;
  display: block;
  margin-block-start: 0.67em;
  margin-block-end: 0.67em;
  margin-inline-start: 0px;
  margin-inline-end: 0px;
  font-weight: bold;
  /* 其他 css 声明... */
}

3,使用继承

对仍然没有值的样式,若可以继承,则继承父元素的样式

可以看到自定义样式还有一条 css 声明

css 复制代码
div {
  background-color: rgba(0, 0, 0, 0.3);
  text-align: center;
}

其中 background-color 不能继承,text-align 可以继承。所以得到继承样式:

css 复制代码
h1 {
  text-align: center;
  font-size: 3em;
  color: salmon;
  display: block;
  margin-block-start: 0.67em;
  margin-block-end: 0.67em;
  margin-inline-start: 0px;
  margin-inline-end: 0px;
  font-weight: bold;
  /* 其他 css 声明... */
}

4,使用默认值

对仍然没有值的样式,使用默认值(预设值)

比如 <h1>background-color 默认值是 transparent

css 复制代码
h1 {
  background-color: transparent;
  text-align: center;
  font-size: 3em;
  color: salmon;
  display: block;
  margin-block-start: 0.67em;
  margin-block-end: 0.67em;
  margin-inline-start: 0px;
  margin-inline-end: 0px;
  font-weight: bold;
  /* 其他 css 声明... */
}

此时已经确定了最终的样式,还需要通过最后一步单位转换,让浏览器能够识别。

尺寸相关的样式,会将相对单位转换为绝对单位,比如 em rem % auto 都转为 px

颜色都会转换 rgb()。red 转为 rgb(255, 255, 255)transparent 转为 rgba(0, 0, 0, 0)


其他

有了上面的规则,再看一个例子:

html 复制代码
<div class="box">
  <a href="">超链接</a>
</div>
css 复制代码
.box {
  color: red !important;
}

效果:

解释:

在第一步确定声明值中,<a> 的浏览器默认样式中是有 color 样式的。而且也没有对 <a> 设置自定义样式。所以直接就能确定 <a>color 样式值。

所以,一般在项目中会对 <a> 设置如下自定义样式,来继承父级的 color,方便后续的操作。

css 复制代码
a {
  text-decoration: none;
  color: inherit; /* 表示继承 */
}

以上。


参考:渡一教育。

相关推荐
wuhen_n28 分钟前
TypeScript 强力护航:PropType 与组件事件类型的声明
前端·javascript·vue.js
wuhen_n34 分钟前
组件设计原则:如何设计一个高内聚、低耦合的 Vue 组件
前端·javascript·vue.js
Moment12 小时前
Vibe Coding 时代,到底该选什么样的工具来提升效率❓❓❓
前端·后端·github
IT_陈寒13 小时前
SpringBoot性能飙升200%?这5个隐藏配置你必须知道!
前端·人工智能·后端
小时前端14 小时前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
Nicko14 小时前
Jetpack Compose BOM 2026.02.01 解读与升级指南
前端
小蜜蜂dry15 小时前
nestjs学习 - 控制器、提供者、模块
前端·node.js·nestjs
优秀稳妥的JiaJi15 小时前
基于腾讯地图实现电子围栏绘制与校验
前端·vue.js·前端框架
前端开发呀15 小时前
从 qiankun(乾坤) 迁移到 Module Federation(模块联邦),对MF只能说相见恨晚!
前端
没想好d15 小时前
通用管理后台组件库-10-表单组件
前端