Skip to content

响应式 Web 设计完全指南


一、响应式布局基础知识

知识点讲解

什么是响应式布局?

响应式布局(Responsive Web Design)是一种网页设计方法,使网站能自动适应不同设备和屏幕尺寸。

核心三要素:

  • 📐 流体网格(Flex/Grid 弹性布局)
  • 🖼️ 弹性图片(自适应缩放)
  • 📱 媒体查询(根据屏幕条件应用不同样式)

**关键理念:**同一套代码在不同设备上都能提供良好的用户体验


视口(Viewport)配置

必备 meta 标签

html
<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)—— ⭐ 推荐

css
/* 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)—— 传统方案

css
/* 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)

css
/* --- 基于 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⭐⭐

**💡 实战建议:**至少要关注 768px1200px 这两个核心断点


📝 要点测验

为什么 768px 是最重要的断点?

历史原因:

  • iPad 的竖屏宽度正好是 768px
  • iPad 发布后成为平板市场标准
  • 大量设备以此为参考设计

实际意义:

  • 768px 以下:典型的移动设备,单列布局为主
  • 768px 以上:可以使用多列布局、侧边栏等复杂结构

所以这个断点是"移动"和"桌面"的分界线,几乎所有 CSS 框架都会重点处理这个临界值。

断点越多越好吗?

不是!

问题:

  • 断点太多导致代码臃肿
  • 维护成本高
  • 测试复杂度增加

最佳实践:

  • **小项目:**只用 2-3 个断点(手机、平板、桌面)
  • **大项目:**最多 5-6 个断点
  • **优先策略:**用 Flexbox/Grid 的弹性布局减少对断点的依赖

**现代方案:**能用 clamp()minmax() 等 CSS 函数实现无级缩放的,就不要硬编码断点。


三、Flexbox vs Grid:响应式布局选择

知识点讲解

核心区别

特性FlexboxGrid
维度一维(行或列)二维(行和列)
类比穿糖葫芦画棋盘
控制力子元素决定自己大小父容器统一规划
适用场景导航栏、按钮组、标签整页布局、图片墙、仪表盘

Flexbox 响应式布局

示例:自适应卡片列表

css
.flex-container {
  display: flex;
  flex-wrap: wrap; /* ⭐ 关键:允许换行 */
  gap: 20px;
}

.flex-item {
  /* flex: 放大比例 缩小比例 基础宽度 */
  flex: 1 1 300px;
  /* 
    解读:
    - 1:有剩余空间时,按比例放大
    - 1:空间不足时,按比例缩小
    - 300px:基础宽度 300px
  */
  min-width: 250px; /* 防止过度压缩 */
}

效果:

  • 宽屏:每行多个卡片,自动填满
  • 窄屏:卡片自动换行
  • 极窄:单列显示

Grid 响应式布局

示例:一行代码实现响应式网格

css
.grid-container {
  display: grid;
  gap: 20px;
  /* 🔥 魔法公式 */
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}

语法拆解:

部分含义
repeat()重复模式
auto-fit自动填充,能塞几列就塞几列
minmax(250px, 1fr)最小 250px,最大平分剩余空间
效果屏幕宽自动增加列数,窄自动减少

实战对比示例

场景:实现响应式导航栏

Flexbox 方案(推荐)

css
.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 方案(适合复杂布局)

css
.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 有什么区别?
css
/* 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 简单方案

css
img {
  max-width: 100%; /* 永远不超过父容器 */
  height: auto;    /* 高度自动,保持比例 */
  display: block;  /* 去除图片下方空隙 */
}

**适用:**90% 的场景


方案二:srcset 性能优化

html
<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="响应式图片"
>

工作原理:

  1. 浏览器根据屏幕宽度和分辨率
  2. 自动选择最合适的图片
  3. 节省流量,提升加载速度

解读 sizes:

  • 屏幕 ≤ 600px:图片占据 100% 视口宽度
  • 屏幕 600-1200px:图片占据 50% 视口宽度
  • 屏幕 > 1200px:图片占据 33% 视口宽度

方案三:picture 艺术指导

html
<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 SE375px加载 2000px 大图(~500KB)加载 400px 小图(~50KB)
iPad768px加载 2000px 大图(~500KB)加载 1000px 中图(~200KB)
Desktop1920px加载 2000px 大图(~500KB)加载 2000px 大图(~500KB)

结果:

  • 移动端流量节省 90%
  • 页面加载速度提升 5-10倍
  • 用户体验显著改善

**额外好处:**高分辨率屏幕(Retina)会自动加载 2x 图片,保证清晰度。

object-fit 属性如何处理图片裁剪?
css
.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 的元素自动缩放

css
/* 基础字号:桌面 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() 动态缩放

最现代的响应式单位

css
.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

css
.column {
  /* (100% - 3个间距的20px) / 4 */
  width: calc((100% - 60px) / 4);
  margin-right: 20px;
}

.column:nth-child(4n) {
  margin-right: 0; /* 每行最后一个不要右边距 */
}

常见用法:

css
/* 固定头部,内容区域高度自适应 */
.content {
  height: calc(100vh - 60px); /* 视口高度 - 头部高度 */
}

/* 响应式间距 */
.section {
  padding: calc(2rem + 2vw); /* 基础值 + 动态值 */
}

📝 要点测验

rem 和 em 的区别是什么?何时使用?

em:相对于父元素的 font-size

css
.parent {
  font-size: 16px;
}
.child {
  font-size: 1.5em; /* 16px × 1.5 = 24px */
  padding: 1em;     /* 24px (相对于自己的 font-size) */
}

**问题:**嵌套时会叠加计算,容易失控

rem:相对于根元素 (<html>) 的 font-size

css
html {
  font-size: 16px;
}
.anywhere {
  font-size: 1.5rem; /* 始终是 16px × 1.5 = 24px */
  padding: 1rem;     /* 始终是 16px */
}

**优势:**全局统一,易于维护

使用建议:

  • **rem:**页面级的间距、字号、组件大小(⭐ 首选)
  • **em:**组件内部的相对关系(如图标跟随文字大小)
  • **px:**边框、阴影、1px 线条
vw 单位会导致横向滚动条吗?

**会!**常见坑:

css
.bad {
  width: 100vw; /* 包含滚动条宽度! */
}

问题:

  • Windows/Linux 浏览器的滚动条占据约 17px 宽度
  • 100vw 包含滚动条,导致实际宽度超出
  • 出现横向滚动条

解决方案:

css
/* 方案一:用百分比 */
.container {
  width: 100%; /* 不包含滚动条 */
}

/* 方案二:CSS 变量(现代方案) */
.container {
  width: 100dvw; /* dynamic viewport width */
}

安全使用 vw 的场景:

  • 字体大小:font-size: 5vw;
  • 内边距:padding: 2vw;
  • 不涉及容器宽度的属性

六、响应式实战案例

案例一:响应式导航栏

html
<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>
css
.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 交互:

js
const menuToggle = document.querySelector('.menu-toggle');
const navLinks = document.querySelector('.nav-links');

menuToggle.addEventListener('click', () => {
  navLinks.classList.toggle('active');
});

案例二:响应式卡片网格

HTML:

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(零媒体查询方案):

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:

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:

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 变量集中管理断点易于维护

用户体验要点

触摸友好设计

css
/* ❌ 错误:按钮太小 */
.button {
  padding: 5px 10px;
  font-size: 12px;
}

/* ✅ 正确:符合触摸标准 */
.button {
  min-width: 44px;  /* 苹果人机界面指南 */
  min-height: 44px;
  padding: 12px 24px;
  font-size: 16px;   /* 防止 iOS 自动缩放 */
}

防止文本缩放跳转

css
/* iOS 表单输入框字号小于 16px 会自动放大页面 */
input, textarea {
  font-size: 16px; /* ⭐ 最小 16px */
}

横向滚动禁忌

css
/* ❌ 千万避免 */
body {
  overflow-x: scroll; /* 用户最讨厌横向滚动 */
}

/* ✅ 正确做法 */
.content {
  max-width: 100%;
  overflow-wrap: break-word; /* 长单词自动换行 */
}

测试与调试

Chrome DevTools 响应式模式

  1. 打开开发者工具(F12)
  2. 点击设备模拟图标(Ctrl/Cmd + Shift + M)
  3. 选择设备或自定义尺寸
  4. 拖动边界测试断点

真机调试

bash
# Chrome 远程调试(Android)
chrome://inspect

# Safari 远程调试(iOS)
Safari -> 开发 -> [设备名称]

响应式测试网站


📝 要点测验

如何处理图片在不同设备上的加载性能?

综合方案:

html
<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>

关键点:

  1. **格式选择:**WebP 比 JPEG 小 30%,但要提供回退
  2. **尺寸适配:**srcset 根据屏幕加载对应大小
  3. 懒加载:loading="lazy" 延迟加载屏幕外图片
  4. **CDN:**使用图片 CDN 自动优化(如 Cloudinary、imgix)

实测效果:

  • 移动端首屏时间从 5s 降至 1.5s
  • 页面大小从 3MB 降至 500KB
如何选择合适的布局方案?

决策树:

需要兼容 IE11?
├─ 是 → 使用 Flexbox + 媒体查询
└─ 否 → 继续判断
      ├─ 简单一维布局(导航、列表)?
      │   └─ 使用 Flexbox
      └─ 复杂二维布局(整页、网格)?
          ├─ 固定列数 → Grid + 媒体查询
          └─ 自适应列数 → Grid + auto-fit/minmax

现代最佳实践(2024):

  • 首选 Grid + auto-fit,无需媒体查询
  • 局部组件用 Flexbox
  • 字体和间距用 clamp()
  • 尽量减少硬编码断点

八、元素居中终极指南

方案一:Flexbox 居中 ⭐ 推荐

css
.container {
  display: flex;
  justify-content: center; /* 水平居中 */
  align-items: center;     /* 垂直居中 */
  
  /* 或者使用简写 */
  place-items: center; /* ⚠️ 注意:这是 Grid 的写法 */
}

**适用:**99% 的居中场景


方案二:Grid 居中 🔥 最简洁

css
.container {
  display: grid;
  place-items: center; /* 一行搞定 */
}

方案三:绝对定位 + Transform

css
.container {
  position: relative;
}

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

**适用:**弹窗、悬浮元素


方案四:Margin Auto(仅限水平)

css
.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导航、列表
Gridrepeat(auto-fit, minmax(...))网格、整页
单位rem 全局,vw 视觉,clamp() 动态间距、字号
图片srcset + loading="lazy"性能优化
测试Chrome DevTools + 真机质量保证

面试建议

  • ⭐ 必背:移动优先 vs 桌面优先的区别
  • ⭐ 核心:Grid 的 auto-fit + minmax 语法
  • ⭐ 实战:能手写响应式导航和卡片网格
  • ⭐ 优化:了解 srcset、懒加载、触摸友好设计
  • ⭐ 原则:优先使用现代 CSS(Grid/Flex/clamp),减少媒体查询依赖