
CSS核心知识体系结构化总结
CSS 布局体系从基础盒模型到现代二维布局,再到多端适配,形成了一套完整的「基础渲染规则 → 布局方案 → 多端适配」的知识层级。以下从六大核心模块进行系统性梳理。
一、CSS 盒模型(Box Model)
盒模型是 CSS 布局的原子基础,所有元素在页面中都会被渲染为一个矩形盒子,由内到外分为四层结构。
1. 盒子的四层组成
- 内容区(Content):文本、图片等实际内容所在区域,由
width/height控制尺寸。 - 内边距(Padding):内容区与边框之间的空白区域,背景色会延伸至此。
- 边框(Border):包裹内边距与内容的边界,支持样式、宽度、颜色设置。
- 外边距(Margin):盒子与外部元素之间的透明间距,用于控制元素间距。
2. 两种盒模型标准
通过 box-sizing 属性切换盒子尺寸的计算方式:
| 盒模型类型 | box-sizing 值 |
宽度计算公式 | 特点 |
|---|---|---|---|
| 标准盒模型(W3C) | content-box |
总宽度 = content + padding + border + margin | width 仅控制内容区大小 |
| IE 怪异盒模型 | border-box |
总宽度 = width + margin | width 包含 content + padding + border |
工程最佳实践:全局重置
* { box-sizing: border-box; },让元素尺寸计算更符合直觉,降低布局复杂度。
3. 不同 display 类型的盒模型差异
- 块级元素(block):独占一行,
width/height、上下左右margin/padding均生效。 - 行内元素(inline):与其他行内元素并排,
width/height无效;水平 margin/padding 生效,垂直方向不占据布局空间。 - 行内块元素(inline-block):并排显示且支持宽高,兼具行内与块级特性。
4. 经典问题:外边距折叠(Margin Collapse)
发生条件:同属一个 BFC 的块级元素,垂直方向的外边距会发生合并。
- 三种场景:相邻兄弟元素、父元素与首尾子元素、空块级元素自身。
- 折叠规则:同号取最大值;一正一负取代数和;均为负取绝对值最大值。
- 解决方案:
- 父元素触发 BFC 隔离
- 父元素设置
border或padding隔开 - 使用 Flex / Grid 布局(子元素不存在外边距折叠)
二、格式化上下文:BFC 与 IFC
格式化上下文是 CSS 视觉格式化模型的核心规则,定义了盒子在页面中的排列方式与渲染边界。
1. 基础概念
CSS 根据元素的 display 属性生成不同类型的盒子,块级盒子参与块级格式化上下文(BFC),行内级盒子参与行内格式化上下文(IFC)。
2. BFC(Block Formatting Context)
BFC 是页面中一个完全独立的渲染区域,内部布局不受外部影响,也不会影响外部。
(1)触发条件
满足任意一条即可创建 BFC:
- 根元素
<html> - 浮动元素:
float: left / right(非none) - 绝对定位:
position: absolute / fixed - 特殊 display:
inline-block/table-cell/table-caption/flex/grid/flow-root - 溢出控制:
overflow: hidden / auto / scroll(非visible)
(2)核心特性
- 内部块级元素沿垂直方向依次排列
- 垂直方向的外边距在 BFC 内部会发生折叠
- BFC 区域不会与浮动元素发生重叠
- 计算 BFC 高度时,内部浮动子元素会参与高度计算(包裹浮动)
- BFC 是独立容器,内外元素互不干扰
(3)典型应用场景
- 清除浮动:父元素触发 BFC,解决高度塌陷
- 防止 margin 重叠:给子元素外层套一个 BFC 容器
- 自适应两栏布局:左侧浮动,右侧触发 BFC 实现自适应填充
- 避免文字环绕图片:文字区域触发 BFC
3. IFC(Inline Formatting Context)
IFC 是行内级盒子水平排列的渲染规则,由块级容器包含行内内容时生成。
核心特性
- 行内盒子从左到右水平排列,起点为包含块左上角
- 水平方向
margin、padding、border完全生效 - 垂直对齐由
vertical-align控制,默认基线(baseline)对齐 - 一行内所有盒子组成一个行框(line box),行框高度由行内最高盒子决定
text-align控制行框内行内盒子的整体水平对齐
常见问题
- 图片下方空白:行内元素默认基线对齐导致,解决方案:
vertical-align: middle/top或display: block。
三、现代布局方案:Flex 布局
Flex(弹性盒子)是一维布局方案,擅长处理单行/单列的空间分配与对齐问题,是目前组件级布局的首选。
1. 核心概念
- Flex 容器:设置
display: flex/inline-flex的父元素 - Flex 项目:容器的直接子元素,自动成为弹性项目
- 主轴(Main Axis):项目排列的主方向
- 交叉轴(Cross Axis):与主轴垂直的方向
2. 容器属性(全局控制)
| 属性 | 作用 | 常用值 |
|---|---|---|
flex-direction |
设置主轴方向 | row(默认)/ row-reverse / column / column-reverse |
flex-wrap |
项目超出容器时是否换行 | nowrap(默认)/ wrap / wrap-reverse |
justify-content |
项目在主轴上的对齐方式 | flex-start / center / space-between / space-around / space-evenly |
align-items |
项目在交叉轴单行上的对齐方式 | stretch(默认)/ flex-start / center / baseline |
align-content |
项目在交叉轴多行上的对齐方式(仅换行生效) | stretch / flex-start / center / space-between |
3. 项目属性(个体控制)
| 属性 | 作用 | 说明 |
|---|---|---|
order |
项目排列顺序 | 数值越小越靠前,默认 0 |
flex-grow |
剩余空间放大比例 | 默认 0,即不放大;数值越大分配越多剩余空间 |
flex-shrink |
空间不足时的缩小比例 | 默认 1,即等比缩小;设为 0 则不收缩 |
flex-basis |
项目在主轴上的初始基准尺寸 | 默认 auto,可设具体像素/百分比;优先级高于 width |
flex |
以上三个属性的简写 | 默认值 0 1 auto;常用值:1(等价 1 1 0%)、auto(1 1 auto) |
align-self |
单个项目的交叉轴对齐 | 覆盖容器的 align-items |
4. 典型布局实现
- 水平垂直居中
- 等高列布局
- 导航栏与标签栏
- 圣杯/双飞翼布局简化版
- 流式卡片列表
5. 优势与局限
- ✅ 优势:语法简洁、一维布局能力极强、自适应能力优秀
- ❌ 局限:二维复杂布局能力弱,复杂网格场景代码冗余
四、现代布局方案:Grid 布局
Grid 是二维布局方案,可同时控制行与列,是页面级整体骨架布局的最优解。
1. 核心概念
- 网格容器:设置
display: grid/inline-grid的元素 - 网格线(Grid Lines):划分网格的分界线,可通过编号或命名定位
- 网格轨道(Track):两条相邻网格线之间的区域,即行/列
- 单元格(Cell):行列交叉的最小单元
- 网格区域(Area):由多个单元格组成的矩形区域
2. 容器属性(网格定义 + 对齐)
(1)网格结构定义
grid-template-columns/grid-template-rows:定义列/行轨道尺寸- 支持单位:
px、%、fr(剩余空间比例)、auto - 辅助函数:
repeat(n, size)、minmax(min, max)
- 支持单位:
grid-template-areas:通过字符串命名网格区域,可视化定义布局gap/row-gap/column-gap:设置网格间距
(2)隐式网格与排列
grid-auto-flow:自动排列方向,row(默认)/column/dense(稠密填充)grid-auto-columns/grid-auto-rows:隐式生成的轨道尺寸
(3)对齐控制
justify-items/align-items:单元格内内容的水平/垂直对齐place-items:以上两个属性的简写justify-content/align-content:整个网格在容器内的对齐
3. 项目属性(位置控制)
grid-column/grid-row:指定项目起止网格线,如grid-column: 1 / 3grid-area:指定项目所在的命名区域,或四个网格线的简写justify-self/align-self:单个项目在单元格内的对齐
4. 典型布局实现
- 圣杯布局(极简三行三列结构)
- 响应式栅格系统(配合
auto-fit+minmax) - 复杂仪表盘、表单网格
- 瀑布流布局(配合
grid-auto-flow: dense)
5. Flex 与 Grid 选型对比
| 维度 | Flex 布局 | Grid 布局 |
|---|---|---|
| 布局维度 | 一维(单行/单列) | 二维(行列同时控制) |
| 设计思想 | 内容优先,内容决定布局 | 布局优先,结构决定位置 |
| 适用场景 | 组件内布局、导航、卡片行 | 页面整体骨架、复杂二维排列 |
| 上手难度 | 简单 | 相对复杂 |
工程惯例:Grid 搭建页面整体骨架,Flex 实现组件内部细节,两者配合使用。
五、响应式布局
响应式布局的核心是同一套代码适配不同屏幕尺寸,根据视口大小动态调整布局结构与样式。
1. 核心设计原则
- 内容优先:断点由内容展示需求决定,而非设备型号
- 渐进增强:基础功能全设备可用,大屏增强体验
- 流式布局:元素尺寸随容器动态变化
2. 核心技术:媒体查询(Media Queries)
语法结构
@media 媒体类型 and (媒体特性) {
/* 满足条件时生效的样式 */
}
- 媒体类型:
screen(屏幕)、print(打印)、all(全部) - 常用媒体特性:
min-width、max-width、orientation(横竖屏)、resolution(分辨率)
3. 断点设计策略
通用断点参考(移动端优先):
≥ 768px:平板竖屏≥ 1024px:平板横屏 / 小屏桌面≥ 1200px:标准桌面≥ 1440px:大屏桌面
4. 核心组件响应式适配
- 布局流:桌面多列 → 平板两列 → 移动端单列
- 导航:桌面横向导航 → 移动端汉堡菜单
- 图片:使用
srcset/<picture>标签加载不同尺寸图片 - 文本:字号、行高随屏幕宽度阶梯式调整
5. 两种设计范式
| 范式 | 实现方式 | 优点 | 适用场景 |
|---|---|---|---|
| 移动优先 | 默认小屏样式,min-width 向上叠加 |
代码精简、移动端性能优 | C 端产品、流量以移动端为主 |
| 桌面优先 | 默认大屏样式,max-width 向下适配 |
符合传统 PC 开发习惯 | 后台系统、PC 为主的产品 |
六、移动端适配
移动端适配聚焦于不同尺寸、不同像素密度的手机屏幕,解决元素等比缩放、高清屏渲染、交互体验等问题。
1. 视口(Viewport)基础
三种视口概念
- 布局视口:CSS 布局的基准宽度,默认移动端约 980px
- 视觉视口:用户当前看到的屏幕区域
- 理想视口:布局视口 = 设备屏幕宽度
标准配置
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
作用:将布局视口设为设备宽度,禁止用户缩放,保证 1:1 渲染。
2. 长度单位体系与适配方案
| 单位 | 基准 | 特点与适用场景 |
|---|---|---|
px |
物理像素点 | 固定尺寸,适合边框、小图标 |
em |
父元素 font-size |
相对父元素,适合段落缩进、局部比例调整 |
rem |
根元素 <html> 的 font-size |
全局统一基准,配合 JS 动态设置实现等比缩放 |
vw/vh |
视口宽度/高度的 1% | 纯 CSS 方案,直接基于视口缩放,现代移动端首选 |
vmin/vmax |
视口最小/最大边的 1% | 保证横竖屏下元素比例一致 |
主流适配方案
- vw 方案:设计稿像素直接转换为 vw 单位,无需 JS,兼容性好(iOS8+、Android4.4+)
- rem 方案:通过 JS 动态计算 html 的 font-size(如 flexible.js),将 px 转为 rem
- 混合方案:布局用 vw,字体用 rem,边框用 px
3. 经典适配问题与解决方案
(1)1px 边框问题
- 原因:高清屏 DPR > 1,CSS 1px 对应多个物理像素,导致视觉偏粗
- 解决方案:
transform: scale(0.5)缩放、border-image、box-shadow模拟、viewport 整体缩放
(2)高清屏图片模糊
- 原因:1 个 CSS 像素对应多个物理像素,位图被拉伸
- 解决方案:使用 2x / 3x 倍图,配合
srcset自动适配不同 DPR
(3)移动端点击 300ms 延迟
- 原因:浏览器等待双击缩放判断
- 解决方案:设置
user-scalable=no、使用touch事件、引入 FastClick 库
4. 移动端交互体验优化
- 触摸热区:可点击元素最小尺寸建议 44×44px
- 点击高亮:
-webkit-tap-highlight-color: transparent去除默认蓝色高亮 - 滚动流畅:
-webkit-overflow-scrolling: touch开启惯性滚动 - 文本选中:按需使用
user-select: none禁止选中文本