Tailwind CSS: Tailwind CSS 响应式设计:断点系统与Mobile-First策略
1. 断点系统
Tailwind 提供 5 个默认断点,使用响应式前缀可以针对不同屏幕尺寸应用样式。
| 前缀 | 最小宽度 | CSS 媒体查询 | 常见设备 |
|---|---|---|---|
sm: |
640px | @media (min-width: 640px) |
手机横屏 |
md: |
768px | @media (min-width: 768px) |
平板 |
lg: |
1024px | @media (min-width: 1024px) |
笔记本 |
xl: |
1280px | @media (min-width: 1280px) |
桌面显示器 |
2xl: |
1536px | @media (min-width: 1536px) |
大屏显示器 |
传统 CSS vs Tailwind 传统方式需要编写多个
@media查询并在不同文件中维护样式,而 Tailwind 使用sm:、md:等前缀直接在 HTML 中声明响应式样式。
2. Mobile-First 策略
Tailwind 采用 Mobile-First(移动优先)策略:无前缀的样式默认应用于最小屏幕,较大的断点前缀覆盖较小屏幕的样式。
▶ 示例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mobile-First 策略</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="min-h-screen bg-gray-100 p-4 md:p-8">
<div class="max-w-6xl mx-auto space-y-8">
<!-- 响应式文字 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">响应式文字大小</h3>
<p class="text-sm md:text-base lg:text-lg xl:text-xl">
默认小屏幕使用 text-sm,中等屏幕 text-base,大屏幕 text-lg,超大屏幕 text-xl
</p>
</div>
<!-- 响应式内边距 -->
<div class="bg-blue-100 rounded-lg p-2 sm:p-4 md:p-6 lg:p-8">
<p class="text-center text-blue-800">响应式内边距:p-2 → sm:p-4 → md:p-6 → lg:p-8</p>
</div>
<!-- 响应式显示隐藏 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">响应式显示隐藏</h3>
<div class="block md:hidden bg-red-100 p-4 rounded text-center text-red-700">
仅在小屏幕显示(block md:hidden)
</div>
<div class="hidden md:block bg-green-100 p-4 rounded text-center text-green-700">
中等屏幕及以上显示(hidden md:block)
</div>
</div>
</div>
</body>
</html>
text-sm md:text-lg 表示小屏幕 14px,中等屏幕及以上 18px。
3. 响应式前缀实战
响应式前缀可以与任意 Tailwind 类组合,实现不同屏幕尺寸下的布局变化。
▶ 示例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>响应式前缀实战</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="min-h-screen bg-gray-100 p-4 md:p-8">
<div class="max-w-6xl mx-auto space-y-8">
<!-- 响应式 Flex 布局 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">响应式 Flex 布局</h3>
<div class="flex flex-col sm:flex-row gap-4">
<div class="flex-1 bg-blue-100 p-4 rounded text-center">项目 1</div>
<div class="flex-1 bg-blue-200 p-4 rounded text-center">项目 2</div>
<div class="flex-1 bg-blue-300 p-4 rounded text-center">项目 3</div>
</div>
<p class="text-sm text-gray-500 mt-2">小屏幕纵向排列(flex-col),中等屏幕横向排列(sm:flex-row)</p>
</div>
<!-- 响应式 Grid 列数 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">响应式 Grid 列数</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
<div class="bg-green-100 p-4 rounded text-center">1</div>
<div class="bg-green-200 p-4 rounded text-center">2</div>
<div class="bg-green-300 p-4 rounded text-center">3</div>
<div class="bg-green-400 p-4 rounded text-center">4</div>
<div class="bg-green-500 p-4 rounded text-center text-white">5</div>
<div class="bg-green-600 p-4 rounded text-center text-white">6</div>
<div class="bg-green-700 p-4 rounded text-center text-white">7</div>
<div class="bg-green-800 p-4 rounded text-center text-white">8</div>
</div>
<p class="text-sm text-gray-500 mt-2">grid-cols-1 → sm:grid-cols-2 → lg:grid-cols-3 → xl:grid-cols-4</p>
</div>
<!-- 响应式间距 -->
<div class="bg-white rounded-lg shadow p-4 sm:p-6 md:p-8">
<h3 class="font-semibold mb-2 sm:mb-4 md:mb-6">响应式间距</h3>
<div class="space-y-2 sm:space-y-4 md:space-y-6">
<div class="bg-purple-100 p-4 rounded">项目 A</div>
<div class="bg-purple-200 p-4 rounded">项目 B</div>
<div class="bg-purple-300 p-4 rounded">项目 C</div>
</div>
</div>
</div>
</body>
</html>
传统 CSS vs Tailwind 传统方式需要编写
@media (min-width: 768px) { .grid { grid-template-columns: repeat(2, 1fr); } }等多段 CSS,而 Tailwind 使用grid-cols-1 md:grid-cols-2 lg:grid-cols-3一行完成。
4. 响应式图片
响应式图片确保图片在不同屏幕尺寸下正确显示,避免溢出或变形。
▶ 示例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>响应式图片</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="min-h-screen bg-gray-100 p-4 md:p-8">
<div class="max-w-6xl mx-auto space-y-8">
<!-- 响应式图片宽度 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">响应式图片宽度</h3>
<img src="https://picsum.photos/1200/400" alt="响应式图片"
class="w-full md:w-3/4 lg:w-1/2 mx-auto rounded-lg">
<p class="text-sm text-gray-500 mt-2 text-center">w-full → md:w-3/4 → lg:w-1/2</p>
</div>
<!-- 响应式图片网格 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">响应式图片网格</h3>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2 md:gap-4">
<img src="https://picsum.photos/300/300?random=1" alt="图片1" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=2" alt="图片2" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=3" alt="图片3" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=4" alt="图片4" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=5" alt="图片5" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=6" alt="图片6" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=7" alt="图片7" class="w-full aspect-square object-cover rounded-lg">
<img src="https://picsum.photos/300/300?random=8" alt="图片8" class="w-full aspect-square object-cover rounded-lg">
</div>
</div>
</div>
</body>
</html>
w-full 确保图片不溢出父容器,配合 object-cover 保持图片比例。
5. 响应式表格
响应式表格在小屏幕上可以横向滚动,避免内容挤压。
▶ 示例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>响应式表格</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="min-h-screen bg-gray-100 p-4 md:p-8">
<div class="max-w-6xl mx-auto">
<div class="bg-white rounded-lg shadow p-4 md:p-6">
<h3 class="font-semibold mb-4">响应式表格</h3>
<div class="overflow-x-auto">
<table class="w-full text-sm md:text-base">
<thead>
<tr class="bg-gray-100">
<th class="p-2 md:p-3 text-left">编号</th>
<th class="p-2 md:p-3 text-left">名称</th>
<th class="p-2 md:p-3 text-left hidden sm:table-cell">邮箱</th>
<th class="p-2 md:p-3 text-left hidden md:table-cell">电话</th>
<th class="p-2 md:p-3 text-left">状态</th>
</tr>
</thead>
<tbody>
<tr class="border-b">
<td class="p-2 md:p-3">001</td>
<td class="p-2 md:p-3">张三</td>
<td class="p-2 md:p-3 hidden sm:table-cell">zhangsan@example.com</td>
<td class="p-2 md:p-3 hidden md:table-cell">138-0000-0001</td>
<td class="p-2 md:p-3"><span class="bg-green-100 text-green-700 px-2 py-1 rounded text-xs">活跃</span></td>
</tr>
<tr class="border-b">
<td class="p-2 md:p-3">002</td>
<td class="p-2 md:p-3">李四</td>
<td class="p-2 md:p-3 hidden sm:table-cell">lisi@example.com</td>
<td class="p-2 md:p-3 hidden md:table-cell">138-0000-0002</td>
<td class="p-2 md:p-3"><span class="bg-yellow-100 text-yellow-700 px-2 py-1 rounded text-xs">待定</span></td>
</tr>
<tr class="border-b">
<td class="p-2 md:p-3">003</td>
<td class="p-2 md:p-3">王五</td>
<td class="p-2 md:p-3 hidden sm:table-cell">wangwu@example.com</td>
<td class="p-2 md:p-3 hidden md:table-cell">138-0000-0003</td>
<td class="p-2 md:p-3"><span class="bg-red-100 text-red-700 px-2 py-1 rounded text-xs">停用</span></td>
</tr>
</tbody>
</table>
</div>
<p class="text-sm text-gray-500 mt-4">小屏幕隐藏部分列,表格可横向滚动</p>
</div>
</div>
</body>
</html>
传统 CSS vs Tailwind 传统方式需要编写
@media查询来控制表格列的显示隐藏,而 Tailwind 使用hidden sm:table-cell等类名直接声明。
6. 容器查询(@container)
容器查询根据父容器尺寸而非视口尺寸来应用样式,是 Tailwind v4 支持的新特性。
▶ 示例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>容器查询</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="min-h-screen bg-gray-100 p-4 md:p-8">
<div class="max-w-6xl mx-auto space-y-8">
<!-- 容器查询基础 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">容器查询基础</h3>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<!-- 小容器 -->
<div class="@container bg-gray-50 rounded-lg p-4 border-2 border-dashed border-gray-300">
<div class="flex flex-col @md:flex-row gap-4">
<img src="https://picsum.photos/150/150" alt="头像" class="w-20 h-20 @md:w-24 @md:h-24 rounded-full object-cover">
<div>
<h4 class="font-semibold @md:text-lg">用户名称</h4>
<p class="text-gray-600 text-sm @md:text-base">这是一个容器查询示例,布局根据父容器宽度变化。</p>
</div>
</div>
<p class="text-xs text-gray-400 mt-2">小容器:纵向布局</p>
</div>
<!-- 大容器 -->
<div class="@container bg-gray-50 rounded-lg p-4 border-2 border-dashed border-gray-300">
<div class="flex flex-col @md:flex-row gap-4">
<img src="https://picsum.photos/150/150" alt="头像" class="w-20 h-20 @md:w-24 @md:h-24 rounded-full object-cover">
<div class="flex-1">
<h4 class="font-semibold @md:text-lg">用户名称</h4>
<p class="text-gray-600 text-sm @md:text-base">容器查询使用 @container 和 @md: 等前缀,根据父容器尺寸应用样式。</p>
<div class="hidden @lg:flex gap-2 mt-2">
<span class="bg-blue-100 text-blue-700 px-2 py-1 rounded text-xs">标签1</span>
<span class="bg-green-100 text-green-700 px-2 py-1 rounded text-xs">标签2</span>
</div>
</div>
</div>
<p class="text-xs text-gray-400 mt-2">大容器:横向布局,显示额外标签</p>
</div>
</div>
</div>
<!-- 容器查询卡片 -->
<div class="bg-white rounded-lg shadow p-6">
<h3 class="font-semibold mb-4">容器查询卡片</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="@container bg-gray-50 rounded-lg overflow-hidden border">
<img src="https://picsum.photos/400/200?random=10" alt="卡片图片" class="w-full h-32 @sm:h-48 object-cover">
<div class="p-4">
<h4 class="font-semibold @sm:text-lg">卡片标题</h4>
<p class="text-gray-600 text-sm @sm:text-base mt-2">容器查询让组件根据自身容器尺寸响应,而非视口尺寸。</p>
<button class="hidden @sm:block mt-4 bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">了解更多</button>
</div>
</div>
<div class="@container bg-gray-50 rounded-lg overflow-hidden border">
<img src="https://picsum.photos/400/200?random=11" alt="卡片图片" class="w-full h-32 @sm:h-48 object-cover">
<div class="p-4">
<h4 class="font-semibold @sm:text-lg">卡片标题</h4>
<p class="text-gray-600 text-sm @sm:text-base mt-2">这使得组件在不同布局中都能正确响应,更加灵活。</p>
<button class="hidden @sm:block mt-4 bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">了解更多</button>
</div>
</div>
<div class="@container bg-gray-50 rounded-lg overflow-hidden border">
<img src="https://picsum.photos/400/200?random=12" alt="卡片图片" class="w-full h-32 @sm:h-48 object-cover">
<div class="p-4">
<h4 class="font-semibold @sm:text-lg">卡片标题</h4>
<p class="text-gray-600 text-sm @sm:text-base mt-2">使用 @container 类标记容器,@sm:、@md: 等前缀应用样式。</p>
<button class="hidden @sm:block mt-4 bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">了解更多</button>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
传统 CSS vs Tailwind 传统容器查询需要编写
@container (min-width: 400px) { ... }媒体查询,而 Tailwind 使用@container类和@sm:、@md:等前缀直接声明。
@xs:(20rem)、@sm:(24rem)、@md:(28rem)、@lg:(32rem)、@xl:(36rem)、@2xl:(42rem)。
❓ 常见问题
text-sm md:text-base lg:text-lg,较大断点会覆盖较小断点的样式。hidden 和 block 组合。例如 hidden md:block 表示小屏幕隐藏、中等屏幕显示;block md:hidden 表示小屏幕显示、中等屏幕隐藏。sm:、md: 等)根据视口宽度响应;容器查询(@container、@sm: 等)根据父容器宽度响应。容器查询更适合可复用组件在不同布局中的响应式需求。@theme 指令自定义断点。例如 @theme { --breakpoint-tablet: 768px; } 然后使用 tablet: 前缀。📖 小节
- Tailwind 提供 5 个默认断点:
sm:(640px)、md:(768px)、lg:(1024px)、xl:(1280px)、2xl:(1536px) - 采用 Mobile-First 策略,无前缀样式为基础,断点前缀用于增强
sm:flex、md:grid-cols-2、lg:grid-cols-3等前缀可与任意类组合- 使用
overflow-x-auto实现响应式表格横向滚动 @container容器查询根据父容器尺寸响应,适合可复用组件hidden md:block和block md:hidden控制元素在不同屏幕的显示隐藏
📝 作业
-
⭐ 创建一个响应式导航栏:小屏幕使用汉堡菜单(
block md:hidden),中等屏幕显示完整导航(hidden md:flex) -
⭐⭐ 创建一个响应式产品卡片网格:小屏幕 1 列(
grid-cols-1),中等屏幕 2 列(md:grid-cols-2),大屏幕 4 列(lg:grid-cols-4),卡片在悬停时放大(hover:scale-105) -
⭐⭐⭐ 创建一个响应式仪表盘布局:使用容器查询实现侧边栏组件,在窄容器中折叠为图标(
@lg:显示文字),宽容器中展开显示完整菜单文字