【CSS 选择器的特异度 CSS 继承 CSS 求值过程解析 CSS 布局方式及相关技术】

news/2025/2/26 8:46:06

以下是关于 CSS 选择器特异度、继承、求值过程及布局技术 的详细解析,结合核心概念和实际应用场景:


一、CSS 选择器特异度(Specificity)

1. 特异度规则

特异度用于决定当多个选择器作用于同一元素时,哪个样式优先级更高。计算方式如下:

  • 权重层级(从高到低):
    • !important > 行内样式 > ID 选择器 > 类/伪类/属性选择器 > 元素/伪元素选择器
  • 权重值计算
    • ID 选择器:1-0-0
    • 类选择器、属性选择器、伪类(如 :hover):0-1-0
    • 元素选择器、伪元素(如 ::before):0-0-1
    • 通配符(*)、组合符(+, >)等不增加特异度
2. 示例对比
css">#header .nav li.active {}  /* 特异度:1-2-1 (ID=1, 类=2, 元素=1) */
div#sidebar a:hover {}     /* 特异度:1-1-2 */
body .menu > ul li {}      /* 特异度:0-1-3 */
3. 注意事项
  • 避免滥用 !important 和 ID 选择器(难以覆盖和维护)
  • 使用 :where() 可降低选择器特异度,:is() 则继承最高特异度

二、CSS 继承(Inheritance)

1. 可继承属性
  • 文本相关font-family, color, line-height, text-align
  • 列表相关list-style, list-style-type
  • 表格相关border-collapse
  • 部分视觉属性visibility, cursor
2. 不可继承属性
  • 布局相关width, height, margin, padding, border
  • 定位相关position, top, left
  • 背景相关background, background-image
3. 显式继承
css">.child {
  border: inherit;  /* 强制继承父元素的 border 属性 */
}

三、CSS 求值过程解析

浏览器将 CSS 属性值应用到元素时的计算流程:

  1. 收集所有声明:匹配元素的所有 CSS 规则(包括继承的和直接应用的)
  2. 解决层叠冲突
    • 按来源优先级排序:用户 !important > 作者 !important > 作者样式 > 用户样式 > 浏览器默认
    • 特异度高的选择器覆盖低的
    • 后定义的规则覆盖先定义的
  3. 处理继承:若属性可继承且未被显式设置,继承父元素的值
  4. 应用默认值:未匹配任何规则时,使用浏览器默认样式
  5. 计算值转换
    • 将相对单位(如 em, %)转换为绝对值(如 px
    • 处理函数(如 calc())和变量(var(--x)
  6. 生成最终值:得到实际渲染使用的值(如 width: 50% 转换为具体像素)

四、CSS 布局方式及相关技术

1. 传统布局
  • 文档流:默认布局方式,块级元素垂直排列,行级元素水平排列
  • 浮动(Float)
    css">.left { float: left; width: 30%; }
    .right { float: right; width: 70%; }
    
    • 需配合 clearfix 解决父容器高度塌陷
  • 定位(Position)
    • relative:相对自身原始位置偏移
    • absolute:相对最近非 static 定位的祖先元素定位
    • fixed:相对视口定位
    • sticky:滚动时吸附效果
2. 现代布局
  • Flexbox(一维布局):

    css">.container {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    
    • 适用场景:导航栏、等高布局、动态内容对齐
  • Grid(二维布局):

    css">.container {
      display: grid;
      grid-template-columns: 1fr 2fr;
      gap: 20px;
    }
    
    • 适用场景:复杂网格布局、响应式设计
  • 多列布局

    css">.article {
      column-count: 3;
      column-gap: 30px;
    }
    
3. 响应式布局技术
  • 媒体查询(Media Queries)
    css">@media (max-width: 768px) {
      .sidebar { display: none; }
    }
    
  • 视口单位vw, vh, vmin, vmax
  • 容器查询(Container Queries)(实验性):
    css">@container (min-width: 500px) {
      .card { flex-direction: row; }
    }
    
4. 其他布局方案
  • 表格布局display: table(语义化不推荐)
  • 圣杯布局/双飞翼布局:传统三栏布局方案(已被 Flex/Grid 替代)
  • Subgrid(CSS Grid Level 2):嵌套网格与父网格对齐

五、布局选择策略

需求场景推荐技术
简单一维排列(水平/垂直居中)Flexbox
复杂二维网格布局CSS Grid
响应式多列内容媒体查询 + Flex/Grid
固定位置元素(如导航栏)position: fixed
等高布局Flexbox 或 Grid
瀑布流布局Grid + grid-auto-rows: masonry(实验性)

总结流程图

CSS 规则应用流程:
选择器匹配 → 特异度排序 → 继承处理 → 默认值填充 → 计算值转换 → 最终渲染

布局技术演进:
传统流式 → Float → Flex → Grid → 容器查询(未来)

通过理解这些核心机制,可以更高效地编写可维护的 CSS 代码并优化页面性能。


http://www.niftyadmin.cn/n/5868413.html

相关文章

布署elfk-准备工作

建议申请5台机器部署elfk: filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客,搜索人自己的社区 官方…

当AI搜索撕开传统搜索的裂缝,警惕AI搜索的“信息茧房”

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…

鸿蒙NEXT开发-用户通知服务

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 1. 用户通知服务基本介绍 2. 能力范围 …

笔记20250225

关于上拉电阻和下拉电阻的作用 原理 上拉电阻:在上拉电阻所连接的导线上,如果外部组件未启用,上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时,对输入端来说,外部“看上去”就是高阻抗的&#xff0c…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表? 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法(时间复杂度O(1)) 尾插法(时间复杂度O(n)) 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

系统调用过程

注意:本系统调用过程基于32位操作系统 中断服务程序的寻址过程 1.用户态程序产生系统调用write(); 2.产生中断指令ENTER_KERNEL(int $0x80128),CPU收到中断指令去查询中断向量表,找出中断号0x80对应的中断服务程序的内存基地址(0…

C# string转unicode字符

在 C# 中,将字符串转换为 Unicode 字符(即每个字符的 Unicode 码点)可以通过遍历字符串中的每个字符并获取其 Unicode 值来实现。Unicode 值是一个整数,表示字符在 Unicode 标准中的唯一编号。 以下是实现方法: 1. 获…

[H滑动窗口] lc239. 滑动窗口最大值(模拟+数据结构+单调队列+滑动窗口模板题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:239. 滑动窗口最大值 相关博文: [单调队列模板] 单调队列模板 题单: 待补充 2. 题目解析 一道单调队列模板题,不赘述了吧。 看看日后有没有写不出来来补题、或者有新…