Tailwind CSS 响应式设计

使用 Tailwind CSS 的响应式工具类构建适配各种设备的界面。


1. 移动优先策略

1.1 什么是移动优先

移动优先(Mobile-First)是一种设计策略,先为移动设备设计,然后逐步增强以适应更大屏幕。

1.2 Tailwind CSS 的移动优先

Tailwind CSS 采用移动优先的方式:

  • 基础样式:针对移动设备(< 640px)
  • 断点前缀:针对更大屏幕的增强样式
<!-- 移动端:小字体,桌面端:大字体 -->
<h1 class="text-2xl md:text-4xl lg:text-6xl">
  响应式标题
</h1>

2. 断点系统

2.1 默认断点

断点最小宽度说明
sm640px小屏幕(平板竖屏)
md768px中等屏幕(平板横屏)
lg1024px大屏幕(桌面)
xl1280px超大屏幕
2xl1536px超超大屏幕

2.2 使用断点

在工具类前添加断点前缀:

<!-- 基础样式 + md 断点样式 -->
<div class="text-sm md:text-base">
  小屏幕小字体,中等屏幕及以上正常字体
</div>
 
<!-- 多个断点 -->
<div class="text-sm md:text-base lg:text-lg xl:text-xl">
  渐进增强的文字大小
</div>

3. 响应式布局

3.1 响应式 Grid

<!-- 移动端单列,桌面端多列 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
  <div>项目 1</div>
  <div>项目 2</div>
  <div>项目 3</div>
</div>

3.2 响应式 Flex

<!-- 移动端垂直,桌面端水平 -->
<div class="flex flex-col md:flex-row gap-4">
  <div>项目 1</div>
  <div>项目 2</div>
</div>

3.3 响应式间距

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

4. 显示与隐藏

4.1 响应式显示

<!-- 移动端隐藏,桌面端显示 -->
<div class="hidden md:block">
  仅中等屏幕及以上显示
</div>
 
<!-- 移动端显示,桌面端隐藏 -->
<div class="block md:hidden">
  仅小屏幕显示
</div>

4.2 条件显示

<!-- 仅在特定断点显示 -->
<div class="hidden lg:block">
  仅大屏幕显示
</div>
 
<div class="block lg:hidden">
  大屏幕以下显示
</div>

5. 响应式文字

5.1 字体大小

<!-- 响应式标题 -->
<h1 class="text-2xl md:text-4xl lg:text-6xl">
  响应式标题
</h1>
 
<!-- 响应式正文 -->
<p class="text-sm md:text-base lg:text-lg">
  响应式正文
</p>

5.2 字重

<!-- 移动端正常,桌面端粗体 -->
<p class="font-normal md:font-bold">
  响应式字重
</p>

5.3 对齐方式

<!-- 移动端左对齐,桌面端居中 -->
<p class="text-left md:text-center">
  响应式对齐
</p>

6. 响应式图片

6.1 响应式尺寸

<!-- 响应式宽度 -->
<img src="image.jpg" class="w-full md:w-1/2 lg:w-1/3" alt="图片">
 
<!-- 响应式高度 -->
<div class="h-48 md:h-64 lg:h-96">
  <img src="image.jpg" class="w-full h-full object-cover" alt="图片">
</div>

6.2 响应式显示

<!-- 移动端显示,桌面端隐藏 -->
<img src="mobile.jpg" class="block md:hidden" alt="移动端图片">
 
<!-- 移动端隐藏,桌面端显示 -->
<img src="desktop.jpg" class="hidden md:block" alt="桌面端图片">

7. 响应式表单

7.1 响应式输入框

<!-- 响应式宽度 -->
<input type="text" class="w-full md:w-64 lg:w-96">
 
<!-- 响应式布局 -->
<div class="flex flex-col md:flex-row gap-4">
  <input type="text" class="flex-1" placeholder="输入框 1">
  <input type="text" class="flex-1" placeholder="输入框 2">
</div>

7.2 响应式按钮

<!-- 响应式尺寸 -->
<button class="w-full md:w-auto px-4 py-2">
  响应式按钮
</button>

8. 响应式导航

8.1 移动端菜单

<nav class="bg-white shadow-md">
  <div class="max-w-7xl mx-auto px-4">
    <div class="flex items-center justify-between h-16">
      <!-- Logo -->
      <div class="flex items-center">
        <h1 class="text-xl font-bold">Logo</h1>
      </div>
      
      <!-- 桌面端导航 -->
      <div class="hidden md:flex space-x-4">
        <a href="#" class="text-gray-600 hover:text-gray-900">首页</a>
        <a href="#" class="text-gray-600 hover:text-gray-900">关于</a>
        <a href="#" class="text-gray-600 hover:text-gray-900">联系</a>
      </div>
      
      <!-- 移动端菜单按钮 -->
      <button class="md:hidden">
        <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
          <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
        </svg>
      </button>
    </div>
    
    <!-- 移动端菜单(可切换显示) -->
    <div class="md:hidden">
      <a href="#" class="block py-2">首页</a>
      <a href="#" class="block py-2">关于</a>
      <a href="#" class="block py-2">联系</a>
    </div>
  </div>
</nav>

9. 响应式卡片

9.1 卡片网格

<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 p-6">
    <h3 class="text-xl font-bold mb-2">卡片标题</h3>
    <p class="text-gray-600">卡片内容</p>
  </div>
  <!-- 更多卡片 -->
</div>

9.2 卡片布局

<!-- 移动端垂直,桌面端水平 -->
<div class="flex flex-col md:flex-row gap-4">
  <div class="flex-1 bg-white rounded-lg shadow-md p-6">
    卡片 1
  </div>
  <div class="flex-1 bg-white rounded-lg shadow-md p-6">
    卡片 2
  </div>
</div>

10. 自定义断点

10.1 配置断点

tailwind.config.js 中自定义断点:

module.exports = {
  theme: {
    extend: {
      screens: {
        'xs': '475px',
        '3xl': '1920px',
      },
    },
  },
}

10.2 使用自定义断点

<div class="text-sm xs:text-base md:text-lg">
  使用自定义断点
</div>

11. 最佳实践

11.1 渐进增强

从移动端开始,逐步增强:

<!-- ✅ 好:移动优先 -->
<div class="text-sm md:text-base lg:text-lg">
 
<!-- ❌ 不好:桌面优先 -->
<div class="text-lg md:text-base sm:text-sm">

11.2 合理使用断点

不要过度使用断点:

<!-- ✅ 好:只在需要时使用 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
 
<!-- ❌ 不好:每个断点都设置 -->
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6">

11.3 测试不同设备

使用浏览器开发者工具测试不同断点:

  • Chrome DevTools 设备模拟器
  • Firefox 响应式设计模式
  • 实际设备测试

12. 实战案例

12.1 响应式页面布局

<div class="min-h-screen bg-gray-100">
  <!-- 导航栏 -->
  <nav class="bg-white shadow-md">
    <div class="max-w-7xl mx-auto px-4">
      <div class="flex items-center justify-between h-16">
        <h1 class="text-xl font-bold">Logo</h1>
        <div class="hidden md:flex space-x-4">
          <a href="#">首页</a>
          <a href="#">关于</a>
        </div>
      </div>
    </div>
  </nav>
  
  <!-- 主内容 -->
  <main class="max-w-7xl mx-auto px-4 py-8">
    <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
      <!-- 主内容区 -->
      <div class="lg:col-span-2">
        <h2 class="text-2xl md:text-3xl font-bold mb-4">主标题</h2>
        <p class="text-sm md:text-base text-gray-600">内容</p>
      </div>
      
      <!-- 侧边栏 -->
      <aside class="lg:col-span-1">
        <div class="bg-white rounded-lg shadow-md p-6">
          <h3 class="text-lg font-bold mb-4">侧边栏</h3>
          <p class="text-sm text-gray-600">侧边栏内容</p>
        </div>
      </aside>
    </div>
  </main>
</div>

13. 下一步

现在你已经掌握了 Tailwind CSS 的响应式设计,可以:

  1. 学习 暗色模式
  2. 查看 实战应用
  3. 实践构建响应式项目

相关链接

TailwindCSS 响应式设计 移动优先 断点