【CSS】CSS 属性计算过程

1. 概述

我们所书写的任何一个 HTML 元素,实际上都有完整的一整套 CSS 样式。如果没有修改某样式,大概率可能使用默认值。

例如:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>这是一个h1标签</h1>
</body>
</html>

2. CSS 属性值计算过程

属性值的计算过程,分为如下这么 4 个步骤:

  • 确定声明值
  • 层叠冲突
  • 使用继承
  • 使用默认值

从上到下优先级依次降低。

2.1 确定声明值

所谓声明值就是我们自己所书写的 CSS 样式。

例如:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        h1 {
            color: aqua;
        }
    </style>
</head>
<body>
    <h1>这是一个h1标签</h1>
</body>
</html>

上述我们看到除了作者样式表,一般浏览器还会存在"用户代理样式表",简单来讲就是浏览器内置了一套样式表。

2.2 层叠冲突

在确定声明值时,可能出现声明的样式规则发生了冲突。

此时会进入解决层叠冲突的流程:

  • 比较源的重要性
  • 比较优先级
  • 比较次序
2.2.1 比较源的重要性

整体来讲样式表有三种来源:

  • 浏览器会有一个基本的样式表来给任何网页设置默认样式。这些样式统称用户代理样式
  • 网页的作者可以定义文档的样式,这是最常见的样式表,称之为页面作者样式
  • 浏览器的用户,可以使用自定义样式表定制使用体验,称之为用户样式

对应的重要性顺序依次为:页面作者样式 > 用户样式 > 用户代理样式 。(参考:MDN

2.2.2 比较优先级

比如,同属于页面作者样式 ,源的重要性是相同的,此时会以选择器的权重来比较重要性。(参考:MDN

2.2.3 比较次序

比如,同样都是页面作者样式选择器的权重也相同,此时位于下面的样式声明会层叠掉上面的那一条样式声明。

2.3 使用继承

  1. 子元素继承最近的父元素身上的属性。

  2. 可以继承的属性,直接在MDN上查阅。

    例如:

2.4 使用默认值

如果前面的步骤都进行过了,那么剩下的就只能是使用默认值了。

3. 面试题

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta
        name="viewport"
        content="width=device-width, initial-scale=1.0"
    >
    <title>Document</title>
    <style>
        div {
            color: red;
        }
    </style>
</head>

<body>
    <div>
        <a href="">test</a>
        <p>test</p>
    </div>
</body>

</html>

会出现什么样的效果,为什么?


a 元素在用户代理样式表中已经设置了 color 属性对应的值,因此会应用此声明值。

而在 p 元素中无论是作者样式表还是用户代理样式表,都没有对此属性进行声明,然而由于 color 属性是可以继承的,因此最终 p 元素的 color 属性值通过继承来自于父元素。

相关推荐
DevUI团队43 分钟前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600442 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
kyriewen2 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒2 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户938515635073 小时前
Type vs Interface:读完这篇就没有面试官能难倒你了
前端·面试·typescript
油丶酸萝卜别吃4 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang4 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方4 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript
半个落月4 小时前
React useRef 详解:DOM 引用、持久化值与 Worker 实例
前端·react.js
阿黎梨梨4 小时前
TypeScript 类型编程:从新手到 Harness 工程实践
前端