以下是关于 CSS 选择器特异度、继承、求值过程及布局技术 的详细解析,结合核心概念和实际应用场景:
一、CSS 选择器特异度(Specificity)
1. 特异度规则
特异度用于决定当多个选择器作用于同一元素时,哪个样式优先级更高。计算方式如下:
- 权重层级(从高到低):
!important
> 行内样式 > ID 选择器 > 类/伪类/属性选择器 > 元素/伪元素选择器
- 权重值计算:
- ID 选择器:
1-0-0
- 类选择器、属性选择器、伪类(如
:hover
):0-1-0
- 元素选择器、伪元素(如
::before
):0-0-1
- 通配符(
*
)、组合符(+
,>
)等不增加特异度
- ID 选择器:
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 属性值应用到元素时的计算流程:
- 收集所有声明:匹配元素的所有 CSS 规则(包括继承的和直接应用的)
- 解决层叠冲突:
- 按来源优先级排序:
用户 !important
>作者 !important
>作者样式
>用户样式
>浏览器默认
- 特异度高的选择器覆盖低的
- 后定义的规则覆盖先定义的
- 按来源优先级排序:
- 处理继承:若属性可继承且未被显式设置,继承父元素的值
- 应用默认值:未匹配任何规则时,使用浏览器默认样式
- 计算值转换:
- 将相对单位(如
em
,%
)转换为绝对值(如px
) - 处理函数(如
calc()
)和变量(var(--x)
)
- 将相对单位(如
- 生成最终值:得到实际渲染使用的值(如
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 代码并优化页面性能。