05. 响应式设计

1. 什么是响应式设计

响应式设计是指网页能够根据不同设备的屏幕尺寸,自动调整布局和样式,在手机、平板、电脑上都有良好的显示效果。

手机 (手机版)      平板 (平板版)      电脑 (桌面版)
┌────────┐        ┌──────────┐      ┌────────────────┐
│ 卡片1  │        │ 卡片1  │卡片2│   │ 卡片1 │卡片2 │卡片3 │
├────────┤        └──────────┘      │──────│──────│──────│
│ 卡片2  │                           │ 卡片4 │卡片5 │卡片6 │
├────────┤                           └────────────────┘
│ 卡片3  │
└────────┘

2. Tailwind 的响应式系统

2.1 断点系统

Tailwind 提供了 5 个默认断点,遵循移动优先原则:

断点 前缀 最小宽度 说明
手机 0 默认样式(所有设备)
平板 sm: 640px 小屏幕设备
平板 md: 768px 中等屏幕
电脑 lg: 1024px 大屏幕
电脑 xl: 1280px 超大屏幕
电脑 2xl: 1536px 2K 屏幕

2.2 移动优先原则

核心思想:先写手机版样式,再用断点前缀覆盖更大的屏幕。

<!-- 手机版:1列,平板版:2列,电脑版:4列 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4">
  ...
</div>

解读

  • grid-cols-1:所有设备都应用(手机)
  • md:grid-cols-2:宽度 ≥ 768px 时,覆盖为 2 列
  • lg:grid-cols-4:宽度 ≥ 1024px 时,覆盖为 4 列

3. 基础响应式用法

3.1 布局响应式

<!-- Flex 布局:手机竖排,电脑横排 -->
<div class="flex flex-col md:flex-row">
  <div class="p-4">内容1</div>
  <div class="p-4">内容2</div>
</div>

3.2 文字大小响应式

<!-- 手机小字,电脑大字 -->
<h1 class="text-xl md:text-3xl lg:text-5xl">
  响应式标题
</h1>

3.3 间距响应式

<!-- 手机小内边距,电脑大内边距 -->
<div class="p-4 md:p-6 lg:p-8">
  内容
</div>

3.4 显示/隐藏响应式

<!-- 手机隐藏,电脑显示 -->
<div class="hidden md:block">
  电脑版才显示
</div>

<!-- 手机显示,电脑隐藏 -->
<div class="block md:hidden">
  只有手机显示
</div>

4. 常用响应式模式

4.1 响应式网格(最常用)

<!-- 卡片网格:手机1列,平板2列,电脑3列,大屏4列 -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
  <div class="bg-white p-4 rounded shadow">卡片1</div>
  <div class="bg-white p-4 rounded shadow">卡片2</div>
  <div class="bg-white p-4 rounded shadow">卡片3</div>
  <div class="bg-white p-4 rounded shadow">卡片4</div>
</div>

4.2 响应式导航栏

<!-- 手机版:汉堡菜单(需要 JS),电脑版:横排菜单 -->
<nav class="bg-white shadow">
  <div class="container mx-auto px-4">
    <div class="flex justify-between items-center py-4">
      <!-- Logo -->
      <div class="text-xl font-bold">Logo</div>
      
      <!-- 手机版汉堡菜单按钮 -->
      <button class="block md:hidden">
        <svg>...</svg>
      </button>
      
      <!-- 电脑版菜单 -->
      <div class="hidden md:flex space-x-6">
        <a href="#" class="hover:text-blue-500">首页</a>
        <a href="#" class="hover:text-blue-500">关于</a>
        <a href="#" class="hover:text-blue-500">服务</a>
        <a href="#" class="hover:text-blue-500">联系</a>
      </div>
    </div>
  </div>
</nav>

4.3 响应式侧边栏

<!-- 手机版:隐藏侧边栏,电脑版:显示 -->
<div class="flex">
  <!-- 侧边栏 -->
  <aside class="w-64 bg-gray-800 text-white hidden md:block">
    侧边栏内容
  </aside>
  
  <!-- 主内容 -->
  <main class="flex-1 p-4">
    主内容区域
  </main>
</div>

4.4 响应式字体

<!-- 响应式字体大小 -->
<p class="text-sm md:text-base lg:text-lg">
  这段文字在手机上较小,平板上正常,电脑上稍大。
</p>

4.5 响应式间距

<!-- 响应式外边距 -->
<div class="m-2 md:m-4 lg:m-6">
  内边距响应式变化
</div>

5. 自定义断点

5.1 配置自定义断点

tailwind.config.js 中自定义:

module.exports = {
  theme: {
    extend: {
      screens: {
        'xs': '480px',      // 超小屏
        'sm': '640px',
        'md': '768px',
        'lg': '1024px',
        'xl': '1280px',
        '2xl': '1536px',
        '3xl': '1920px',    // 自定义
      },
    },
  },
}

5.2 使用自定义断点

<!-- 使用自定义断点 xs -->
<div class="grid grid-cols-1 xs:grid-cols-2">
  ...
</div>

6. 容器查询

6.1 什么是容器查询

容器查询(Container Queries)是根据父容器大小而不是视口大小来调整样式,适合组件化开发。

Tailwind v4 支持容器查询:

<!-- 定义容器 -->
<div class="container">
  <div class="grid grid-cols-1 @sm:grid-cols-2">
    <!-- 当容器宽度 >= 640px 时,变成2列 -->
  </div>
</div>

6.2 容器查询语法

前缀 说明
@sm: 容器宽度 ≥ 640px
@md: 容器宽度 ≥ 768px
@lg: 容器宽度 ≥ 1024px
@xl: 容器宽度 ≥ 1280px

7. 实战案例

7.1 产品展示页

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://cdn.tailwindcss.com"></script>
  <title>响应式产品展示</title>
</head>
<body class="bg-gray-100">

<div class="container mx-auto px-4 py-8">
  <!-- 标题 -->
  <h1 class="text-2xl md:text-3xl lg:text-4xl font-bold text-center mb-8">
    热门产品
  </h1>
  
  <!-- 产品网格 -->
  <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
    
    <!-- 产品卡片 -->
    <div class="bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow">
      <img src="https://picsum.photos/400/300" alt="产品" class="w-full h-48 object-cover">
      <div class="p-4">
        <h3 class="font-bold text-lg mb-2">产品名称</h3>
        <p class="text-gray-600 text-sm mb-3">这是一段简短的产品描述,介绍产品特点。</p>
        <div class="flex justify-between items-center">
          <span class="text-xl font-bold text-blue-600">¥299</span>
          <button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600 transition">
            购买
          </button>
        </div>
      </div>
    </div>
    
    <!-- 重复多个产品卡片... -->
    
  </div>
  
  <!-- 响应式布局示例:手机竖排,平板横排 -->
  <div class="mt-12 flex flex-col md:flex-row gap-6">
    <div class="flex-1 bg-white rounded-lg shadow p-6">
      <h2 class="text-xl font-bold mb-3">特色1</h2>
      <p class="text-gray-600">描述特色功能1</p>
    </div>
    <div class="flex-1 bg-white rounded-lg shadow p-6">
      <h2 class="text-xl font-bold mb-3">特色2</h2>
      <p class="text-gray-600">描述特色功能2</p>
    </div>
    <div class="flex-1 bg-white rounded-lg shadow p-6">
      <h2 class="text-xl font-bold mb-3">特色3</h2>
      <p class="text-gray-600">描述特色功能3</p>
    </div>
  </div>
</div>

</body>
</html>

7.2 响应式表格

<!-- 手机版卡片式,电脑版表格 -->
<div class="overflow-x-auto">
  <table class="min-w-full">
    <thead class="hidden md:table-header-group">
      <tr class="bg-gray-100">
        <th class="p-2 text-left">姓名</th>
        <th class="p-2 text-left">职位</th>
        <th class="p-2 text-left">部门</th>
      </tr>
    </thead>
    <tbody>
      <tr class="block md:table-row mb-4 md:mb-0 border md:border-none">
        <td class="block md:table-cell p-2">
          <span class="md:hidden font-bold">姓名:</span>张三
        </td>
        <td class="block md:table-cell p-2">
          <span class="md:hidden font-bold">职位:</span>工程师
        </td>
        <td class="block md:table-cell p-2">
          <span class="md:hidden font-bold">部门:</span>技术部
        </td>
      </tr>
    </tbody>
  </table>
</div>

8. 响应式设计技巧

8.1 移动优先开发流程

  1. 先设计手机版:确保在小屏幕上功能完整
  2. 逐步增加断点:用 sm:md:lg: 逐步增强
  3. 测试真实设备:在不同尺寸设备上测试

8.2 常见响应式模式

模式 手机 平板 电脑
单列 grid-cols-1 md:grid-cols-2 lg:grid-cols-4
侧边栏隐藏 hidden md:block md:block
字体增大 text-base md:text-lg lg:text-xl
间距增大 p-4 md:p-6 lg:p-8

8.3 测试工具

  • Chrome DevTools 设备模拟器
  • 浏览器窗口缩放
  • 真实手机/平板测试

9. 练习

练习 1:响应式博客布局

要求:

  • 手机版:单列,文章卡片上下排列
  • 平板版:2 列网格
  • 电脑版:3 列网格
  • 每张卡片包含:图片、标题、摘要

参考答案

<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
  <article class="bg-white rounded-lg shadow overflow-hidden">
    <img src="image.jpg" class="w-full h-48 object-cover">
    <div class="p-4">
      <h3 class="font-bold text-lg mb-2">文章标题</h3>
      <p class="text-gray-600">文章摘要...</p>
    </div>
  </article>
</div>

练习 2:响应式侧边栏

要求:

  • 手机版:侧边栏隐藏,主内容全宽
  • 电脑版:侧边栏显示,宽度 250px,主内容自适应

参考答案

<div class="flex flex-col md:flex-row">
  <aside class="w-full md:w-64 bg-gray-800 text-white p-4 hidden md:block">
    侧边栏
  </aside>
  <main class="flex-1 p-4">
    主内容
  </main>
</div>

10. 总结

概念 说明
移动优先 先写手机版,再用断点覆盖
断点前缀 sm:md:lg:xl:2xl:
常用模式 网格、导航栏、侧边栏、字体、间距
显示隐藏 hidden md:block / block md:hidden
自定义断点 tailwind.config.js 中配置

一句话总结

响应式设计就是先写手机版,然后用断点前缀告诉 Tailwind 在大屏幕上怎么变。


11. 下一步

掌握了响应式设计后,接下来学习暗色模式:

👉 下一节06. 暗色模式

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐