响应式 Web 设计完全指南
一、响应式布局基础知识
知识点讲解
什么是响应式布局?
响应式布局(Responsive Web Design)是一种网页设计方法,使网站能自动适应不同设备和屏幕尺寸。
核心三要素:
- 📐 流体网格(Flex/Grid 弹性布局)
- 🖼️ 弹性图片(自适应缩放)
- 📱 媒体查询(根据屏幕条件应用不同样式)
**关键理念:**同一套代码在不同设备上都能提供良好的用户体验
视口(Viewport)配置
必备 meta 标签
<meta name="viewport" content="width=device-width, initial-scale=1.0">参数解析:
| 参数 | 含义 | 说明 |
|---|---|---|
width=device-width | 宽度等于设备宽度 | 否则手机浏览器默认按 980px 渲染 |
initial-scale=1.0 | 初始缩放比例 1:1 | 不缩放 |
user-scalable=no | 禁止用户缩放 | ❌ 不推荐,影响无障碍访问 |
移动优先 vs 桌面优先
移动优先(Mobile First)—— ⭐ 推荐
/* 1. 先写手机端样式(默认) */
.element {
width: 100%;
font-size: 14px;
}
/* 2. 逐步增强到平板/桌面 */
@media (min-width: 768px) {
.element {
width: 50%;
font-size: 16px;
}
}
@media (min-width: 1200px) {
.element {
width: 33.33%;
font-size: 18px;
}
}原理:min-width = "最小宽度" = "当屏幕宽于此值时生效"
桌面优先(Desktop First)—— 传统方案
/* 1. 先写大屏样式 */
.element {
width: 33.33%;
font-size: 18px;
}
/* 2. 逐步降级到手机 */
@media (max-width: 1199px) {
.element {
width: 50%;
font-size: 16px;
}
}
@media (max-width: 767px) {
.element {
width: 100%;
font-size: 14px;
}
}原理:max-width = "最大宽度" = "当屏幕窄于此值时生效"
方案对比
| 对比项 | 移动优先 | 桌面优先 |
|---|---|---|
| 关键词 | 渐进增强(Progressive Enhancement) | 优雅降级(Graceful Degradation) |
| 代码量 | ✅ 更少(手机端不加载复杂样式) | 较多 |
| 性能 | ✅ 更好(移动设备资源有限) | 一般 |
| 开发思维 | 从简单到复杂 | 从复杂到简单 |
| 现代框架 | ✅ Bootstrap、Tailwind 默认 | 老版本框架 |
📝 要点测验
为什么移动优先比桌面优先性能更好?
核心原因:CSS 的层叠特性 + 浏览器解析机制
在移动优先中:
- 手机访问时,只解析基础样式 + 一个
min-width媒体查询(不满足条件,直接跳过) - 代码量少,解析快
在桌面优先中:
- 手机访问时,需要先解析复杂的桌面样式,然后再用
max-width覆盖 - 即使最终不显示,浏览器也要先加载和解析,浪费资源
**额外好处:**移动优先强制开发者优先考虑最小屏幕的体验,符合"内容为王"的设计理念。
如果不加 viewport meta 标签会怎样?
手机浏览器会认为你的网页是一个老式的桌面网站(宽度 980px),然后把整个页面缩小显示在屏幕上。
结果:
- 文字极小,需要用户双指放大才能阅读
- 完全失去响应式效果
- 用户体验极差
这就是为什么每个现代网页都必须有这个 meta 标签。
二、媒体查询与断点设置
知识点讲解
什么是断点(Breakpoint)?
断点是布局发生突变的临界值,比如从手机布局切换到平板布局的那个屏幕宽度值。
标准断点体系(基于 Bootstrap 5)
/* --- 基于 Bootstrap 5 的标准断点 --- */
/* 1. < 576px:手机竖屏 */
/* 默认样式,不写媒体查询 */
.container {
padding: 10px;
}
/* 2. ≥ 576px:手机横屏 / 小平板 */
@media (min-width: 576px) {
.container {
padding: 15px;
}
}
/* 3. ≥ 768px:iPad 竖屏 / 通用平板 —— 【⭐ 最重要断点】 */
@media (min-width: 768px) {
.container {
padding: 20px;
}
}
/* 4. ≥ 992px:小型笔记本 / iPad Pro 横屏 */
@media (min-width: 992px) {
.container {
padding: 25px;
}
}
/* 5. ≥ 1200px:标准桌面显示器 */
@media (min-width: 1200px) {
.container {
max-width: 1140px;
margin: 0 auto;
}
}
/* 6. ≥ 1400px:高清大屏 */
@media (min-width: 1400px) {
.container {
max-width: 1320px;
}
}断点对照表
| 断点 | 设备类型 | 典型分辨率 | 重要性 |
|---|---|---|---|
< 576px | 手机竖屏 | 375x667 (iPhone SE) | ⭐⭐⭐ |
≥ 576px | 手机横屏 | 667x375 | ⭐ |
≥ 768px | 平板竖屏 | 768x1024 (iPad Mini) | ⭐⭐⭐⭐⭐ |
≥ 992px | 小笔记本 | 1024x768 | ⭐⭐⭐ |
≥ 1200px | 桌面显示器 | 1920x1080 | ⭐⭐⭐⭐ |
≥ 1400px | 大屏显示器 | 2560x1440 | ⭐⭐ |
**💡 实战建议:**至少要关注 768px 和 1200px 这两个核心断点
📝 要点测验
为什么 768px 是最重要的断点?
历史原因:
- iPad 的竖屏宽度正好是 768px
- iPad 发布后成为平板市场标准
- 大量设备以此为参考设计
实际意义:
- 768px 以下:典型的移动设备,单列布局为主
- 768px 以上:可以使用多列布局、侧边栏等复杂结构
所以这个断点是"移动"和"桌面"的分界线,几乎所有 CSS 框架都会重点处理这个临界值。
断点越多越好吗?
❌ 不是!
问题:
- 断点太多导致代码臃肿
- 维护成本高
- 测试复杂度增加
最佳实践:
- **小项目:**只用 2-3 个断点(手机、平板、桌面)
- **大项目:**最多 5-6 个断点
- **优先策略:**用 Flexbox/Grid 的弹性布局减少对断点的依赖
**现代方案:**能用 clamp()、minmax() 等 CSS 函数实现无级缩放的,就不要硬编码断点。
三、Flexbox vs Grid:响应式布局选择
知识点讲解
核心区别
| 特性 | Flexbox | Grid |
|---|---|---|
| 维度 | 一维(行或列) | 二维(行和列) |
| 类比 | 穿糖葫芦 | 画棋盘 |
| 控制力 | 子元素决定自己大小 | 父容器统一规划 |
| 适用场景 | 导航栏、按钮组、标签 | 整页布局、图片墙、仪表盘 |
Flexbox 响应式布局
示例:自适应卡片列表
.flex-container {
display: flex;
flex-wrap: wrap; /* ⭐ 关键:允许换行 */
gap: 20px;
}
.flex-item {
/* flex: 放大比例 缩小比例 基础宽度 */
flex: 1 1 300px;
/*
解读:
- 1:有剩余空间时,按比例放大
- 1:空间不足时,按比例缩小
- 300px:基础宽度 300px
*/
min-width: 250px; /* 防止过度压缩 */
}效果:
- 宽屏:每行多个卡片,自动填满
- 窄屏:卡片自动换行
- 极窄:单列显示
Grid 响应式布局
示例:一行代码实现响应式网格
.grid-container {
display: grid;
gap: 20px;
/* 🔥 魔法公式 */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}语法拆解:
| 部分 | 含义 |
|---|---|
repeat() | 重复模式 |
auto-fit | 自动填充,能塞几列就塞几列 |
minmax(250px, 1fr) | 最小 250px,最大平分剩余空间 |
| 效果 | 屏幕宽自动增加列数,窄自动减少 |
实战对比示例
场景:实现响应式导航栏
Flexbox 方案(推荐)
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
}
.nav-links {
display: flex;
gap: 2rem;
}
@media (max-width: 768px) {
.navbar {
flex-direction: column;
}
.nav-links {
flex-direction: column;
width: 100%;
}
}Grid 方案(适合复杂布局)
.page-layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 250px 1fr;
gap: 20px;
}
@media (max-width: 768px) {
.page-layout {
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
grid-template-columns: 1fr;
}
}📝 要点测验
什么时候用 Flexbox,什么时候用 Grid?
用 Flexbox:
- 元素是一维排列(一行或一列)
- 元素大小不完全可预测(内容决定大小)
- **示例:**导航菜单、标签栏、按钮组、商品标签
用 Grid:
- 需要二维布局(同时控制行和列)
- 需要对齐不同大小的元素
- 整体骨架布局(Header + Sidebar + Main + Footer)
- **示例:**整页布局、相册网格、数据仪表盘、复杂表单
组合使用:
- Grid 做整体框架
- Flexbox 做局部组件(如 Grid 中的卡片内部用 Flex 排列)
auto-fit 和 auto-fill 有什么区别?
/* auto-fit: 拉伸填满 */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* auto-fill: 保持最小宽度 */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));区别:
- **auto-fit:**当列数少于容器可容纳的数量时,会拉伸每列填满整个宽度
- **auto-fill:**会保留空白轨道,元素保持最小宽度
选择:
- 大多数情况用 auto-fit(视觉更好)
- 需要固定大小时用 auto-fill
四、响应式图片处理方案
知识点讲解
三种实现方案
方案一:CSS 简单方案
img {
max-width: 100%; /* 永远不超过父容器 */
height: auto; /* 高度自动,保持比例 */
display: block; /* 去除图片下方空隙 */
}**适用:**90% 的场景
方案二:srcset 性能优化
<img
src="small.jpg"
srcset="
medium.jpg 1000w,
large.jpg 2000w,
xlarge.jpg 3000w
"
sizes="(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
33vw"
alt="响应式图片"
>工作原理:
- 浏览器根据屏幕宽度和分辨率
- 自动选择最合适的图片
- 节省流量,提升加载速度
解读 sizes:
- 屏幕 ≤ 600px:图片占据 100% 视口宽度
- 屏幕 600-1200px:图片占据 50% 视口宽度
- 屏幕 > 1200px:图片占据 33% 视口宽度
方案三:picture 艺术指导
<picture>
<!-- 桌面:使用横向宽图 -->
<source
media="(min-width: 800px)"
srcset="desktop-wide.jpg"
>
<!-- 平板:使用中等尺寸 -->
<source
media="(min-width: 500px)"
srcset="tablet-medium.jpg"
>
<!-- 手机:使用竖向窄图(默认) -->
<img src="mobile-tall.jpg" alt="响应式图片">
</picture>适用场景:
- 不同设备显示不同构图的图片
- 手机显示人像,桌面显示风景
- 移动端裁剪重点部分
📝 要点测验
为什么要用 srcset 而不是直接用大图?
性能对比:
| 设备 | 屏幕宽度 | 使用固定大图 | 使用 srcset |
|---|---|---|---|
| iPhone SE | 375px | 加载 2000px 大图(~500KB) | 加载 400px 小图(~50KB) |
| iPad | 768px | 加载 2000px 大图(~500KB) | 加载 1000px 中图(~200KB) |
| Desktop | 1920px | 加载 2000px 大图(~500KB) | 加载 2000px 大图(~500KB) |
结果:
- 移动端流量节省 90%
- 页面加载速度提升 5-10倍
- 用户体验显著改善
**额外好处:**高分辨率屏幕(Retina)会自动加载 2x 图片,保证清晰度。
object-fit 属性如何处理图片裁剪?
.image-container {
width: 300px;
height: 200px;
overflow: hidden;
}
.image-container img {
width: 100%;
height: 100%;
object-fit: cover; /* 核心属性 */
object-position: center;
}object-fit 取值:
cover:裁剪填满,保持比例(常用)contain:完整显示,可能有空白fill:拉伸变形填满(不推荐)none:保持原始大小scale-down:取 contain 和 none 中较小的
**实战应用:**商品列表中,不同比例的图片统一显示为正方形。
五、响应式单位系统
知识点讲解
常用单位对比
| 单位 | 相对于 | 响应性 | 适用场景 |
|---|---|---|---|
| px | 固定值 | ❌ | 边框、阴影、小图标 |
| em | 父元素字号 | ✅ | 组件内部间距 |
| rem | 根元素字号 | ✅✅ | ⭐ 全局间距、字号 |
| % | 父元素尺寸 | ✅ | 宽度、布局 |
| vw/vh | 视口尺寸 | ✅✅✅ | 全屏 Banner、大标题 |
rem 响应式方案
**原理:**只修改根元素字号,所有使用 rem 的元素自动缩放
/* 基础字号:桌面 16px */
html {
font-size: 16px;
}
/* 平板:14px */
@media (max-width: 992px) {
html {
font-size: 14px;
}
}
/* 手机:12px */
@media (max-width: 768px) {
html {
font-size: 12px;
}
}
/* 使用 rem 的元素会自动缩放 */
.button {
padding: 1rem 2rem; /* 会随着 html font-size 变化 */
font-size: 1rem;
margin-bottom: 2rem;
}clamp() 动态缩放
最现代的响应式单位
.title {
/* clamp(最小值, 首选值, 最大值) */
font-size: clamp(20px, 5vw, 48px);
/*
解读:
- 屏幕很窄:最小 20px
- 屏幕中等:根据视口宽度计算 (5vw)
- 屏幕很宽:最大 48px
*/
}
.container {
width: clamp(300px, 90%, 1200px);
padding: clamp(1rem, 3vw, 3rem);
}优势:
- 无需媒体查询
- 平滑过渡(无断点跳跃)
- 代码简洁
calc() 精确计算
场景:4 列布局,每列间距 20px
.column {
/* (100% - 3个间距的20px) / 4 */
width: calc((100% - 60px) / 4);
margin-right: 20px;
}
.column:nth-child(4n) {
margin-right: 0; /* 每行最后一个不要右边距 */
}常见用法:
/* 固定头部,内容区域高度自适应 */
.content {
height: calc(100vh - 60px); /* 视口高度 - 头部高度 */
}
/* 响应式间距 */
.section {
padding: calc(2rem + 2vw); /* 基础值 + 动态值 */
}📝 要点测验
rem 和 em 的区别是什么?何时使用?
em:相对于父元素的 font-size
.parent {
font-size: 16px;
}
.child {
font-size: 1.5em; /* 16px × 1.5 = 24px */
padding: 1em; /* 24px (相对于自己的 font-size) */
}**问题:**嵌套时会叠加计算,容易失控
rem:相对于根元素 (<html>) 的 font-size
html {
font-size: 16px;
}
.anywhere {
font-size: 1.5rem; /* 始终是 16px × 1.5 = 24px */
padding: 1rem; /* 始终是 16px */
}**优势:**全局统一,易于维护
使用建议:
- **rem:**页面级的间距、字号、组件大小(⭐ 首选)
- **em:**组件内部的相对关系(如图标跟随文字大小)
- **px:**边框、阴影、1px 线条
vw 单位会导致横向滚动条吗?
**会!**常见坑:
.bad {
width: 100vw; /* 包含滚动条宽度! */
}问题:
- Windows/Linux 浏览器的滚动条占据约 17px 宽度
100vw包含滚动条,导致实际宽度超出- 出现横向滚动条
解决方案:
/* 方案一:用百分比 */
.container {
width: 100%; /* 不包含滚动条 */
}
/* 方案二:CSS 变量(现代方案) */
.container {
width: 100dvw; /* dynamic viewport width */
}安全使用 vw 的场景:
- 字体大小:
font-size: 5vw; - 内边距:
padding: 2vw; - 不涉及容器宽度的属性
六、响应式实战案例
案例一:响应式导航栏
<nav class="navbar">
<div class="logo">Logo</div>
<button class="menu-toggle">☰</button>
<ul class="nav-links">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: #333;
color: white;
}
.nav-links {
display: flex;
gap: 2rem;
list-style: none;
}
.menu-toggle {
display: none; /* 桌面版隐藏汉堡按钮 */
}
/* 手机版:≤ 768px */
@media (max-width: 768px) {
.menu-toggle {
display: block;
font-size: 2rem;
background: none;
border: none;
color: white;
cursor: pointer;
}
.nav-links {
display: none; /* 默认隐藏菜单 */
flex-direction: column;
position: absolute;
top: 60px;
left: 0;
width: 100%;
background: #333;
padding: 1rem;
}
.nav-links.active {
display: flex; /* 点击按钮后显示 */
}
}JavaScript 交互:
const menuToggle = document.querySelector('.menu-toggle');
const navLinks = document.querySelector('.nav-links');
menuToggle.addEventListener('click', () => {
navLinks.classList.toggle('active');
});案例二:响应式卡片网格
HTML:
<div class="card-grid">
<div class="card">Card 1</div>
<div class="card">Card 2</div>
<div class="card">Card 3</div>
<div class="card">Card 4</div>
<div class="card">Card 5</div>
<div class="card">Card 6</div>
</div>CSS(零媒体查询方案):
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(250px, 100%), 1fr));
gap: 2rem;
padding: 2rem;
}
.card {
background: white;
border-radius: 8px;
padding: 2rem;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
/* 限制内容溢出 */
overflow: hidden;
word-wrap: break-word;
}
/* 图片响应式 */
.card img {
width: 100%;
height: 200px;
object-fit: cover;
border-radius: 4px;
}效果:
- 超大屏:5-6 列
- 桌面:3-4 列
- 平板:2 列
- 手机:1 列
- 无需任何媒体查询!
案例三:响应式表格
HTML:
<div class="table-container">
<table>
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Phone</th>
<th>Address</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Name">John Doe</td>
<td data-label="Email">john@example.com</td>
<td data-label="Phone">123-456-7890</td>
<td data-label="Address">123 Main St</td>
</tr>
</tbody>
</table>
</div>CSS:
/* 桌面版:正常表格 */
.table-container {
width: 100%;
overflow-x: auto; /* 防止溢出 */
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 1rem;
text-align: left;
border-bottom: 1px solid #ddd;
}
/* 手机版:卡片式表格 */
@media (max-width: 768px) {
table, thead, tbody, th, td, tr {
display: block;
}
thead tr {
display: none; /* 隐藏表头 */
}
tr {
margin-bottom: 1rem;
border: 1px solid #ddd;
border-radius: 8px;
padding: 1rem;
}
td {
text-align: right;
position: relative;
padding-left: 50%;
}
td::before {
content: attr(data-label); /* 使用 data-label 作为标签 */
position: absolute;
left: 1rem;
font-weight: bold;
text-align: left;
}
}效果:
- 桌面:传统表格
- 手机:每行变成一张卡片,竖向排列
七、响应式设计最佳实践
性能优化清单
| 优化项 | 具体做法 | 收益 |
|---|---|---|
| 图片优化 | 使用 srcset、WebP 格式、CDN 裁剪 | 节省 70-90% 流量 |
| 字体优化 | font-display: swap、子集化、使用系统字体 | 减少 FOIT/FOUT |
| CSS 优化 | 避免 display:none 仍下载资源 | 减少无效请求 |
| JavaScript | 移动端延迟加载非关键 JS | 提升首屏速度 |
| 媒体查询 | 用 CSS 变量集中管理断点 | 易于维护 |
用户体验要点
触摸友好设计
/* ❌ 错误:按钮太小 */
.button {
padding: 5px 10px;
font-size: 12px;
}
/* ✅ 正确:符合触摸标准 */
.button {
min-width: 44px; /* 苹果人机界面指南 */
min-height: 44px;
padding: 12px 24px;
font-size: 16px; /* 防止 iOS 自动缩放 */
}防止文本缩放跳转
/* iOS 表单输入框字号小于 16px 会自动放大页面 */
input, textarea {
font-size: 16px; /* ⭐ 最小 16px */
}横向滚动禁忌
/* ❌ 千万避免 */
body {
overflow-x: scroll; /* 用户最讨厌横向滚动 */
}
/* ✅ 正确做法 */
.content {
max-width: 100%;
overflow-wrap: break-word; /* 长单词自动换行 */
}测试与调试
Chrome DevTools 响应式模式
- 打开开发者工具(F12)
- 点击设备模拟图标(Ctrl/Cmd + Shift + M)
- 选择设备或自定义尺寸
- 拖动边界测试断点
真机调试
# Chrome 远程调试(Android)
chrome://inspect
# Safari 远程调试(iOS)
Safari -> 开发 -> [设备名称]响应式测试网站
📝 要点测验
如何处理图片在不同设备上的加载性能?
综合方案:
<picture>
<!-- 桌面:WebP 格式 -->
<source
media="(min-width: 1024px)"
srcset="desktop.webp"
type="image/webp"
>
<!-- 平板:中等尺寸 -->
<source
media="(min-width: 768px)"
srcset="tablet.jpg"
>
<!-- 手机:小尺寸 + 懒加载 -->
<img
src="mobile.jpg"
loading="lazy"
alt="响应式图片"
>
</picture>关键点:
- **格式选择:**WebP 比 JPEG 小 30%,但要提供回退
- **尺寸适配:**srcset 根据屏幕加载对应大小
- 懒加载:
loading="lazy"延迟加载屏幕外图片 - **CDN:**使用图片 CDN 自动优化(如 Cloudinary、imgix)
实测效果:
- 移动端首屏时间从 5s 降至 1.5s
- 页面大小从 3MB 降至 500KB
如何选择合适的布局方案?
决策树:
需要兼容 IE11?
├─ 是 → 使用 Flexbox + 媒体查询
└─ 否 → 继续判断
├─ 简单一维布局(导航、列表)?
│ └─ 使用 Flexbox
└─ 复杂二维布局(整页、网格)?
├─ 固定列数 → Grid + 媒体查询
└─ 自适应列数 → Grid + auto-fit/minmax现代最佳实践(2024):
- 首选 Grid + auto-fit,无需媒体查询
- 局部组件用 Flexbox
- 字体和间距用 clamp()
- 尽量减少硬编码断点
八、元素居中终极指南
方案一:Flexbox 居中 ⭐ 推荐
.container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
/* 或者使用简写 */
place-items: center; /* ⚠️ 注意:这是 Grid 的写法 */
}**适用:**99% 的居中场景
方案二:Grid 居中 🔥 最简洁
.container {
display: grid;
place-items: center; /* 一行搞定 */
}方案三:绝对定位 + Transform
.container {
position: relative;
}
.centered {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}**适用:**弹窗、悬浮元素
方案四:Margin Auto(仅限水平)
.centered {
display: block;
width: 500px;
margin-left: auto;
margin-right: auto;
/* 或简写 */
margin: 0 auto;
}**注意:**只能水平居中,不能垂直居中(除非在 Flex/Grid 容器中)
居中方案对比表
| 方案 | 水平 | 垂直 | 响应式 | 代码量 | 推荐度 |
|---|---|---|---|---|---|
| Flexbox | ✅ | ✅ | ✅ | 中 | ⭐⭐⭐⭐⭐ |
| Grid | ✅ | ✅ | ✅ | 少 | ⭐⭐⭐⭐⭐ |
| Transform | ✅ | ✅ | ✅ | 多 | ⭐⭐⭐ |
| Margin Auto | ✅ | ❌ | ⚠️ | 少 | ⭐⭐ |
总结:响应式设计速查表
| 技术 | 核心要点 | 使用场景 |
|---|---|---|
| 媒体查询 | min-width: 768px 是关键断点 | 布局突变 |
| Flexbox | 一维布局,flex-wrap: wrap | 导航、列表 |
| Grid | repeat(auto-fit, minmax(...)) | 网格、整页 |
| 单位 | rem 全局,vw 视觉,clamp() 动态 | 间距、字号 |
| 图片 | srcset + loading="lazy" | 性能优化 |
| 测试 | Chrome DevTools + 真机 | 质量保证 |
面试建议
- ⭐ 必背:移动优先 vs 桌面优先的区别
- ⭐ 核心:Grid 的
auto-fit + minmax语法- ⭐ 实战:能手写响应式导航和卡片网格
- ⭐ 优化:了解 srcset、懒加载、触摸友好设计
- ⭐ 原则:优先使用现代 CSS(Grid/Flex/clamp),减少媒体查询依赖