跳到主内容

3

HTML / CSS / 现代布局

不被框架包装的视觉与结构层——从语义、布局、现代 CSS 到中文排版

必学13 分钟

这一章讲用户最先看到的那一层——HTML 结构、CSS 样式、布局、动画。 它在浏览器里直接生效,不需要任何框架包装。

第 2 章把"框架不会变的下层"讲清楚了。这一章往上挪一层:像素如何被 排上屏幕、文字如何换行、布局如何在小屏不崩——这些是 React、Vue、 Svelte 共同依赖的视觉地基。


一段必要的史前史:CSS 是怎么"长成这样"的

如果你觉得 CSS 哪里别扭——比如选择器优先级总要数权重、margin 会 神奇折叠、float 的清除要靠"伪元素 hack"——那不是你的问题, 是这门语言本来就是从一片乱里收敛出来的。知道它的来路,下面这章 的很多设计就不再"反直觉"。

90 年代初的 Web 没有"样式表"这个东西。HTML 自己兼任表现职责—— <font color><center><bgcolor> 这种表现型标签直接写 进结构里,加上 Netscape 和 IE 各自塞的私有属性,整个网页是 "结构 / 样式 / 行为"全部糊在一起的一团泥。

1996 年 W3C 发布 CSS Level 1,把"怎么 显示"从 HTML 里拆了出来。这是 Web 史上最重要的一次分层——从此 HTML 管"是什么",CSS 管"长什么样",JS 管"做什么"。这套分工是现在 所有前端框架的根基。

但 CSS 走得很慢:

年份节点留下了什么
1996CSS 1 发布选择器、字体、颜色、盒模型雏形
1998CSS 2 发布定位(position)、float、媒体类型——之后十年没大动
1999-2009IE6 时代浏览器实现互不一致,前端时间一半花在写 hack 上;jQuery 因此火了
2011Flexbox 草案终于有了"主轴 / 交叉轴"心智
2017Flex / Grid 在主流浏览器全支持现代布局元年——这是本章默认假设的浏览器基线
2020-2025State of CSS 历年报告容器查询、:has()、原生嵌套、@layer、子网格、color-mix()、View Transitions ⋯

史料一手来源:W3C 各版规范是最权威的时间锚点;浏览器实际支持情况 看 Can I Use(按特性查"什么时候哪个浏览器 支持的");社区使用率看 State of CSS 历年问卷。想深入读 CSS 演进史可参考 Eric Meyer 的 CSS: The Definitive Guide (O'Reilly,每版都更新)。

两个结论值得记住

  1. 2017 年是分水岭——之前的"前端写 CSS 经验"很大一部分是在 对抗浏览器差异;之后才真正回到"用 CSS 表达设计"。如果你在网上 看到 2017 年之前的 CSS 教程,先确认它讲的是不是现代写法
  2. CSS 不是"简单",是"被简化呈现"——下表里的每一个机制都能写 一篇长文。它们不是冷知识,是你"为什么这个 div 不居中"的真正 答案
中文术语英文全称(缩写)一手参考
选择器优先级specificityMDN
层叠cascadeMDN
继承inheritanceMDN
包含块containing blockMDN
堆叠上下文stacking contextMDN
外边距折叠margin collapsingMDN
块级格式化上下文BFC = Block Formatting ContextMDN

这一章和"我学过的 HTML / CSS"有什么不同

很多人以为 HTML / CSS 是"入门内容",学过基础就够了。这是 2026 年 最容易踩的认知坑:CSS 在 2020-2025 年经历了一次结构性升级—— 上面表格里 2020 后那一行的每一项都改写了既往的"最佳实践"。

但这一章不会只讲新语法——那样和 MDN / web.dev 没区别。本章的目标 是带你看穿三件事:

  1. 现代写法的"前世":每一个新特性(容器查询、auto-fit、 subgrid、:has())都在替换某个 2010 年代的 hack。讲清楚替换了 什么、为什么旧方案失败,你才会真正记住新方案
  2. "看似简单"下藏着的复杂面:margin 折叠、BFC、堆叠上下文、 包含块——业务里"为什么我的弹窗 z-index 9999 还是被盖住" "为什么父元素塌陷"全靠这些。本章会逐节点破,不藏
  3. AI 协作的边界:CSS 是 AI 输出最容易"看起来对实际错"的领域 之一。哪些任务直接交、哪些必须自己 review,每节都会标

写给已经写过几年前端的读者:如果你最近一次系统过 CSS 是 2020 年之前,这一章你需要重读。不是因为旧知识错了,是因为很多以前 必须靠 JS / 预处理器 / hack 解决的问题,现在 CSS 原生就能做—— 还在用旧办法的代码就是技术债。

写给新入行的读者:你是赶上了好时候。这一章里讲的几乎全部都是 "现代写法"——浮动布局、清除浮动、IE 兼容、CSS Hack、@import 嵌套技巧那一套完全不必学。 你直接学到现在还会用 5 年的写法。但不要因此轻视 CSS—— 上面史前史里那些"复杂面"(cascade / 堆叠上下文 / margin 折叠等) 是真正的实战障碍,本章会反复点回来。


3.1 本章六节速览

先看:这一章不必一次读完。下面六节加起来内容不少, 但真正每天写代码用得上的集中在每节前 1/3。这里先给两条路径:

路径包含大概时间
核心路径§3.1 §1-2 + §3.5 选型一张表 + §3.6 transition 三件套30-45 分钟
完整路径全六节 + 复杂面 + DevTools 实战5-8 小时(分多次读)

新人 / 转行者建议先走核心路径,写两个项目后再回来读完整版; 经验开发者可直接跳到自己卡的子节(如响应式、设计令牌)。本章 每节开头都标了"核心 / 进阶 / 按需"——不要被"必学"标签压垮, 判断什么时候读哪段才是手册的核心价值

#一句话定位谁最该读
3.1现代布局Flex / Grid / 容器查询 / 子网格——99% 的页面布局靠这套所有人
3.2语义化 HTML 与可访问性<button> 不是 <div onclick>——让屏幕阅读器和搜索引擎都能读懂所有人
3.3现代 CSS 特性@layer / :has() / 嵌套 / 变量 / color-mix()所有人
3.4响应式与中文 Web移动优先、CJK 排版、暗色模式——三件常被忽略的设计基础所有人
3.5样式方案选型与样式系统Tailwind / CSS Modules / CSS-in-JS / 无头组件 / shadcn / 设计令牌——选什么、配什么、为什么所有人
3.6动画与 View Transitions浏览器原生路由切换 / 状态切换动画所有人,资深尤其

标「所有人」不等于"一次读完"——上面的核心路径已经覆盖业务里最高频 的 80%。§3.5 样式方案选型是从"能写出像样的页面"到"能在团队 / 真实项目里写下去"的关键一跳——选错样式方案的代价上线半年才显现。

「待写」 的章节会按推荐顺序逐节上线。本章六节全部已上线: §3.1 现代布局、§3.2 语义化 HTML 与可访问性、§3.3 现代 CSS 特性、 §3.4 响应式与中文 Web、§3.5 样式方案选型与样式系统、§3.6 动画与 View Transitions。前两节是布局判断 + 语义判断的代码地基,§3.3 把 语言层补到 2024 基线,§3.4 补全多视口 + 多语言 + 多偏好的现代响应式 全貌,§3.5 给出从"能写"到"能在团队 / 真实项目里写下去"的判断地图, §3.6 把状态切换的连续性表达讲清——六节合起来基本能扛住业务里 95% 的 HTML / CSS 任务。

主流样式方案在本章哪里出现

CSS 一旦写到真实项目就绕不开"用什么方案组织样式"。本章不另设 "方案对比"专章,而是在几个不同节里从不同视角点破——读完整章 你会有一张完整的判断地图:

方案 / 工具类型主要出现节
原生 CSS / CSS Modules写法层§3.3 现代 CSS 特性(嵌套、@layer、变量)
Tailwind CSS原子化样式§3.5 样式方案选型(含 AI 协作适配性)
CSS-in-JS(styled-components / Emotion)运行时样式§3.5 选型 + 第 5 章 React 集成
Sass / Less预处理器§3.2 三档归位(标"可委托")+ §3.5 何时还有用
无头组件(Radix UI / Headless UI)行为 + a11y§3.2 a11y + §3.5 选型
shadcn/ui复制粘贴范式§3.5 选型(重点:为什么不算传统组件库)
完整组件库(Ant Design / Element Plus)设计系统打包§3.5 选型(中后台高频选择)
设计令牌(design tokens)跨方案的根§3.5 整节核心 + §3.4 暗色模式

第 5 章会从 React 视角再讲一遍——服务端组件 / 客户端组件对 CSS-in-JS 的影响、Tailwind 在 RSC 里的优势、shadcn 在 Next.js 里 的标准接法。本章 §3.5 讲语言层取舍,第 5 章讲框架层集成—— 两边视角不同,不重复。

实战复杂面:贯穿全章的"翻车之王"

下面这些机制不是某一节的主题,而是业务里出错频率最高的那批 CSS 概念——会在多节反复出现,本章每次提到时都会回链回来。 缩写都给出英文全称 + MDN 一手链接,遇到就点进去查:

机制一句话含义你最常在哪里栽主要展开节点
层叠 + 优先级(cascade + specificity多条规则冲突时谁赢"为什么我加了样式没生效"§3.3 现代 CSS
包含块(containing block)一个元素的尺寸 / 定位以谁为参照position: absolute 跑飞了§3.1 + §3.3
堆叠上下文(stacking context)z 轴上的"独立宇宙""z-index 9999 还是被盖"§3.6 动画与层级
外边距折叠(margin collapsing)相邻块级元素 margin 会合并父子之间多了 / 少了空白§3.1
BFC(Block Formatting Context,块级格式化上下文)一种"自成一体"的布局区域父元素塌陷、清除浮动§3.1
盒模型(box model / box-sizing)width 包不包含 padding / border元素总比预期"宽一点"§3.1
继承(inheritance)哪些属性会从父元素自动继承字体 / 颜色为啥变了§3.3

对新人的建议:先把 §3.1 / §3.3 顺读下来,遇到上表词条卡壳就 停下查;等你能说出"这是堆叠上下文的问题",CSS 才算真正入门。


3.2 本章三档归位

知识点归位理由
Flexbox 主轴 / 交叉轴心智必学90% 的"水平 / 垂直居中""平均分布"靠这个
Grid 显式 / 隐式轨道、grid-template-areas必学整页布局、卡片网格的现代答案
容器查询(container queries)必学组件按"自身宽度"响应——比媒体查询贴近组件化时代
子网格(subgrid)仍需理解复杂表格 / 卡片对齐时是利器;不会每天用
媒体查询 + 移动优先必学响应式的入门项,必须会写
语义化 HTML(<header> / <nav> 等)必学a11y 和 SEO 的地基——AI 写出来的 <div> 套娃要你 review
ARIA 属性仍需理解知道何时该用 role / aria-label;具体 attribute 让 AI 写 + review
:has() / :is() / :where()必学写组件库 / 状态切换时大幅减少 JS
@layer 与样式分层必学团队项目防 specificity 大战的现代答案
CSS 嵌套(原生)仍需理解知道语法 + 知道与 SCSS 的差异;具体写法 AI 写得熟
color-mix() / oklch() / 相对颜色仍需理解暗色模式 / 设计令牌生成会用;记住存在即可
Tailwind CSS 心智 + 配置必学2024 后业界最广用的样式方案;AI 协作的事实标准
CSS Modules 与原生 CSS 组件化必学Next.js / Vite 默认开箱方案;不用 Tailwind 的项目里几乎全在用
CSS-in-JS(styled-components / Emotion)仍需理解仍存在但份额下滑;服务端组件场景受限——选型时要知道为什么
无头组件(Radix UI / Headless UI / Ark)必学提供行为 + a11y 不带样式;和 Tailwind / shadcn 的天然搭档
shadcn/ui 范式必学"复制粘贴而非依赖"——AI 时代最适配的组件分发方式
完整组件库(Ant Design / Element Plus / Material UI)仍需理解中后台高频选择;知道何时用、何时被无头组件替代
设计令牌(design tokens)必学跨方案的根;命名 / 分层 / 主题切换全靠它
动画三件套:transition / animation / @keyframes必学微交互的基础
View Transitions API仍需理解跨页面动画是 2025 后路由动效的现代答案
CSS 预处理器(Sass / Less)详尽语法可委托现代项目用原生嵌套 + 变量已够;遗留项目让 AI 写
浮动布局 / 清除浮动 / IE Hack不学已被 Flex / Grid 全面替代;见 §3.1 简史

三档 vs 四 Tier 视角差:上表是知识档(必学 / 仍需理解 / 可委托),第 1 章 §1.4 的 Tier 1-4 是任务档——同一个知识点写不同任务可能落在不同 Tier。 例:「Grid」是必学知识,但"写一段 Grid 居中"是 Tier 1 任务、 "重构整个页面布局"是 Tier 3 任务。


3.3 怎么读这一章

别脱离实时预览读

CSS 与第 2 章的"协议 / 渲染 / 安全"不同——它改一行代码就能立刻在 屏幕上看到结果。所以这一章的读法是:

  1. 打开 CodePen / CSS Playground 或本地任何 HTML 文件
  2. 一边读一边把例子敲进去
  3. 改一两个值看看变化(gap: 1rem 改成 2remgrid-template-columns 改列数)

只读不写——基本等于没读。

AI 的位置

你想做AI 帮得上吗
写一段 Flex / Grid 居中✅ 现代 AI 写得熟
把"圣杯布局" / "三栏自适应"翻译成 Grid✅ 直接给
选 Flex 还是 Grid⚠️ 心智模型必须在你脑子里,AI 给的是默认答案
写 a11y 属性(ARIA)✅ 但你必须读懂——错配的 ARIA 比没有更糟
设计响应式断点❌ 业务上下文 AI 拿不到,让它列方案、你拍板
设计设计令牌(颜色 / 字号 / 间距体系)❌ 这是产品 / 视觉决策,不是技术决策

3.4 设计判断暗线

本章贯穿几条核心设计判断,会在以下位置点破:

  • §3.1 现代布局:声明式(declarative)vs 命令式(imperative)—— display: grid 是"我要什么",旧式 JS 算坐标是"怎么做";声明式让浏览器 做调度,AI 也写得更稳
  • §3.3 @layer:分层控制(layered specificity)——@layer reset, base, components, utilities 把样式优先级从"谁的选择器更长"改成"谁在哪一层", 消除大型项目里"不停叠 !important"的恶性循环
  • §3.5 样式方案选型:信息隐藏(information hiding)+ 抽象代价—— 设计令牌把"#3b82f6"藏到 --color-primary 后面、Tailwind 把"flex items-center"压成一组共享词汇、shadcn 把"组件代码"放回项目内而非 锁进依赖。每一层抽象都在某些细节、暴露某些接口;选错抽 象层就是后续技术债的根
  • §3.6 View Transitions:声明式动画(declarative animation)—— 浏览器接管"前后状态差异 → 平滑过渡"的调度,告别旧式手写 FLIP 计算

3.5 读完本章你应该能

  • 看到一个布局需求,能口头说出该用 Flex 还是 Grid,理由是什么
  • 写出一段 Grid 自适应卡片网格(列数随容器宽度变化),不查文档
  • 看到 :has(.error) 知道这是"父选子"
  • 区分媒体查询(按视口)和容器查询(按容器自身宽度),知道何时 用哪个
  • 看到一段 <div onclick> 能识别这是 a11y 反例
  • 知道 @layer 的作用,能讲出"为什么不用就会陷入 !important 互砍"
  • 看到设计令牌定义(--color-primary 等)能解释为什么这样组织
  • 能说出 Tailwind 和 CSS Modules 各自适合什么项目,理由不止"我习惯用"
  • 知道无头组件(Radix / Headless UI)和完整组件库(Ant Design) 的边界,新项目能选对
  • 能讲出 shadcn/ui 为什么不算"传统组件库"——以及为什么 AI 时代 它特别合适
  • 知道 View Transitions 是什么,能在合适场景提议用它

复杂面专项(卡过这几关,CSS 才算真正会写):

  • 听到"margin 折叠"能说出在什么场景出现 + 怎么避免
  • 听到"堆叠上下文"能解释为什么 z-index: 9999 也可能被盖住
  • 看到 position: absolute 跑到屏幕角落,知道去找"包含块"
  • 区分 box-sizing: content-boxborder-box,能说出现代项目 默认用哪个

延伸阅读

访问性说明:MDN 中文版 + State of CSS 中文版可直接访问; CSS-Tricks / web.dev 英文站偶有访问波动,但绝大多数 ISP 可达。


下一节:§3.1 现代布局 —— Flex、Grid、容器查询、子网格。