08响应式设计
一套代码,适配手机、平板、电脑:媒体查询监听屏幕宽度, 不同宽度套用不同样式。移动优先是现代前端的默认姿势—— 这也是学习路线的最后一章,毕业快乐。
一、为什么需要响应式
2010 年以前,网页只需要伺候一种屏幕:电脑显示器。之后 iPhone 掀翻桌面—— 如今六成以上的流量来自手机。摆在面前的选择只有两条路:
| 方案 | 做法 | 代价 |
|---|---|---|
| 分开做(老办法) | www.x.com 给电脑,m.x.com 给手机 | 两套代码两倍维护,链接容易跳丢 |
| 响应式(现标准) | 一套代码 + 媒体查询按宽度换样式 | 需要学习本章——仅此而已 |
响应式的三块基石,本章各占一节:viewport 视口(第二节)、 @media 媒体查询(第三~五节)、弹性单位与布局(第六节)。 显隐控制和新兴的容器查询收尾。
二、viewport:一切的起点
每个响应式页面 head 里必须有这一行。没有它,手机会把页面当成 980px 宽的老式桌面页整体缩小塞进屏幕—— 用户看到的就是一张密密麻麻的缩略图,得靠双指放大才能读字。
min-height: 500px 感受区别user-scalable=no 禁止用户缩放——无障碍大忌,
视障用户依赖缩放读你的页面。视口标签只管「初始尺寸」,不管「剥夺自由」。三、@media:媒体查询的完整语法
媒体查询 = 「如果条件成立,就应用花括号里的样式」。 条件由媒体类型和媒体特性组成,用逻辑词连接:
最核心的用法——按宽度切换网格列数:
窄屏 1 列 → 拉宽变 2 列 → 再宽变 4 列
min-width(从窄到宽逐步增强);
反过来写 max-width 是「桌面优先」,老思路,不推荐——原因见第五节。四、断点:在哪换挡
宽度条件里的那个数字叫断点(breakpoint)——布局在此「换挡」。 业界惯例基本收敛在这几档:
| 档位 | 宽度区间 | 典型设备 | 布局策略 |
|---|---|---|---|
| 手机 | < 768px | iPhone、安卓机 | 单列、大按钮、抽屉菜单 |
| 平板 | 768 ~ 1023px | iPad 竖屏 | 两列、紧凑导航 |
| 电脑 | ≥ 1024px | 笔记本、显示器 | 多列、完整侧边栏 |
| 大屏 | ≥ 1440px | 外接显示器 | 限制内容最大宽度 |
五、移动优先:从最小的开始写
移动优先:基础样式写给手机(最受限的环境,逼你写最核心的样式),
再用 min-width 逐级增强到平板、电脑。
反过来(桌面优先)则要在小屏上一路做减法、覆盖——越写越乱。
基础样式 = 手机版;媒体查询 = 给大屏的「加餐」
六、免媒体查询三板斧:让布局自己适应
很多时候根本不用写断点——弹性工具自己会适应。 优先级:能用弹性方案就不写 @media,断点越少维护越轻松。
| 板斧 | 自适应性 | 例子 |
|---|---|---|
| ① 百分比 + max-width | 跟随父容器伸缩,永不溢出 | img { max-width: 100% } |
② clamp() | 在上下限之间弹性变化 | font-size: clamp(18px, 5vw, 40px) |
③ auto-fill + minmax | Grid 自动增减列数 | repeat(auto-fill, minmax(110px, 1fr)) |
(附)flex-wrap: wrap | 放不下自动换行 | 标签流、卡片行 |
标题字号:clamp(18px, 5vw, 40px)
窗口很窄时锁在 18px,很宽时锁在 40px,中间按视口宽度的 5% 流动
minmax 第二个值改成 auto 观察列宽差异)一行没有一句 @media —— 「按内容换挡」的自动化版本
图片是响应式的重头戏——省流量和不变形两手抓:
picture 让小屏只下载小图——
响应式不只是「看起来对」,还要「加载得省」。七、按断点显示隐藏,与容器查询
有些元素只在特定设备有意义(手机上的汉堡按钮、电脑上的侧边栏),
用 display 按断点切换。注意切换的是
display(彻底移出布局),不是 visibility(还占着位):
同一时刻只有一个在场 —— display: none 连布局位置都不留
媒体查询的年轻亲戚容器查询 @container:不问「屏幕多宽」, 问「容器自己多宽」——组件不再依赖页面环境,放哪儿都能自适应:
看的是「框的宽度」不是「屏幕的宽度」——组件级响应式的开端
八、本章小结
响应式工具箱总表(按出场顺序):
| 工具 | 一句话 | 关键写法 |
|---|---|---|
| viewport 标签 | 让手机按真实宽度排版 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| @media | 条件成立才应用的样式块 | @media (min-width: 768px) { } |
| 断点 | 布局换挡的宽度数字 | 768 / 1024(由内容决定) |
| 移动优先 | 基础样式给手机,min-width 增强 | @media (min-width: 768px) |
| 百分比 / max-width | 跟随父容器伸缩 | img { max-width: 100% } |
| clamp() | 带上下限的弹性值 | clamp(18px, 5vw, 40px) |
| auto-fill + minmax | Grid 自动换列数 | repeat(auto-fill, minmax(110px, 1fr)) |
| picture | 按屏幕加载不同图片 | <source media="(min-width: 768px)"> |
| display 显隐 | 按断点切换元素在场 | display: none / inline-block |
| @container | 按容器宽度响应(组件级) | container-type: inline-size |
- 响应式 = 一套代码服务所有屏幕,基石是 viewport + @media + 弹性布局
- 没有 viewport 标签,手机把页面当 980px 缩略——第一行检查它
- 移动优先用 min-width 逐级增强;断点由内容决定,不由机型决定
- 三板斧(百分比、clamp、auto-fill+minmax)能解决的就别写断点——断点越少越好维护
- 显隐切换
display而非visibility;组件级响应式交给@container
auto,观察列宽差异;
④把容器查询演示的阈值 420px 改成 320px,找到「一列直接变三列」的临界点。九、路线终点:写在学习路线的最后
恭喜!HTML → CSS → 布局 → CSS3, 27 章的前端三件套学习路线到这里全部走完。从「标签是什么」到「容器查询怎么用」, 你已经具备了把一张设计稿变成真实页面的全部基础知识。接下来推荐三件事:
- 实战:用本路线的知识仿写 2~3 个你喜欢的页面(个人主页、作品集、产品落地页)——临摹是最好的练习,卡住的地方就是下一轮学习的地图
- JavaScript:让页面「动起来、响应用户」的编程语言,前四章的 HTML/CSS 正是它的舞台
- 框架预习:Vue / React——先打好原生基础再上框架,你会感谢现在稳扎稳打的自己