掌握 移动优先 (Mobile First) 的设计哲学,理解为何默认样式服务于小屏幕。
熟记 Tailwind CSS 的 5 个默认断点 (sm, md, lg, xl, 2xl) 及其对应的最小宽度像素值。
学会使用 断点前缀 ( 如 md:flex, lg:w-1/2) 在特定屏幕尺寸及以上应用样式。
理解 层叠覆盖机制,即大屏样式如何自动覆盖小屏样式,无需编写媒体查询。
能够实战演练从单列移动端布局平滑过渡到多列桌面端布局。
了解如何根据内容而非设备来决策断点,避免过度设计。
Tailwind CSS 的响应式系统建立在“移动优先”的理念之上。这意味着:
默认即手机: 不带任何前缀的类名(如 w-full, text-base)将应用于所有屏幕尺寸,但主要服务于最小的移动设备。
渐进增强: 随着屏幕变宽,通过添加前缀类名来逐步增加布局的复杂性或调整样式。
代码简洁: 避免了传统的“先写桌面样式,再用 max-width 媒体查询覆盖回手机”的冗余逻辑。
核心逻辑
小屏幕: 直接写类名 <div class="block"> (在所有屏幕包括手机上都是 block)。
大屏幕: 添加前缀 <div class="block md:flex"> (手机上 block,中等屏幕及以上变为 flex)。
最佳实践:始终先为手机设计布局和样式,确认无误后,再逐步添加 sm:, md: 等前缀来优化平板和桌面体验。
Tailwind 提供了一组基于 min-width 的默认断点。当屏幕宽度 大于或等于 指定值时,带该前缀的样式生效。
关键概念
Min-Width 策略: md:flex 意味着“当屏幕宽度 ≥ 768px 时,应用 flex 布局”。在小于 768px 时,该样式不生效,元素保持默认或之前定义的样式。
层叠性: 断点是累积的。如果在 md 设置了颜色,在 lg 没有重新设置,那么 lg 屏幕会继承 md 的样式。如果需要改变,只需在 lg 前缀下定义新值即可(如 md:bg-blue-500 lg:bg-red-500)。
从单列到多列的布局进化
这是响应式设计最常见的场景:移动端单列堆叠,桌面端多列并排。
代码示例
响应式卡片网格
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Tailwind Auto Cols 对比演示</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<div class="p-4 bg-gray-50 min-h-screen">
<h2 class="text-2xl font-bold text-center mb-8 text-gray-800">响应式卡片布局演示</h2>
<!--
布局逻辑解析:
1. flex-col: 默认(手机)垂直排列。
2. sm:flex-row: ≥640px 时,变为水平排列(一行显示)。
3. md:flex-wrap: ≥768px 时,允许换行(防止在大屏上被拉伸过长)。
4. gap-4: 所有屏幕间距为 1rem。
5. md:gap-6: ≥768px 时间距增大为 1.5rem。
-->
<div class="flex flex-col sm:flex-row md:flex-wrap gap-4 md:gap-6 justify-center">
<!-- 卡片 1 -->
<div
class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition-shadow duration-300">
<div
class="h-12 w-12 bg-blue-100 rounded-lg flex items-center justify-center text-blue-600 mb-4 mx-auto sm:mx-0">
<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="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
</svg>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-2 text-center sm:text-left">移动端适配</h3>
<p class="text-gray-600 text-sm text-center sm:text-left">
手机上占满整行 (w-full),小屏上一半宽度 (sm:w-1/2),中屏上三分之一 (md:w-1/3)。
</p>
</div>
<!-- 卡片 2 -->
<div
class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition-shadow duration-300">
<div
class="h-12 w-12 bg-green-100 rounded-lg flex items-center justify-center text-green-600 mb-4 mx-auto sm:mx-0">
<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="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-2 text-center sm:text-left">渐进增强</h3>
<p class="text-gray-600 text-sm text-center sm:text-left">
样式随屏幕变大而逐渐丰富,无需媒体查询,仅在 HTML 类名中控制。
</p>
</div>
<!-- 卡片 3 -->
<div
class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition-shadow duration-300">
<div
class="h-12 w-12 bg-purple-100 rounded-lg flex items-center justify-center text-purple-600 mb-4 mx-auto sm:mx-0">
<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="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-2 text-center sm:text-left">高性能</h3>
<p class="text-gray-600 text-sm text-center sm:text-left">
基于 min-width 的媒体查询由浏览器原生高效处理,无 JS 开销。
</p>
</div>
<!-- 卡片 4 -->
<div
class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition-shadow duration-300">
<div
class="h-12 w-12 bg-yellow-100 rounded-lg flex items-center justify-center text-yellow-600 mb-4 mx-auto sm:mx-0">
<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="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4">
</path>
</svg>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-2 text-center sm:text-left">灵活配置</h3>
<p class="text-gray-600 text-sm text-center sm:text-left">
可根据项目需求在 tailwind.config.js 中自定义断点像素值。
</p>
</div>
</div>
<!-- 调试提示 -->
<div class="mt-12 p-4 bg-blue-50 border border-blue-200 rounded-lg text-sm text-blue-800">
<p class="font-bold mb-2">👀 观察指南:</p>
<ul class="list-disc list-inside space-y-1">
<li><strong>宽度 < 640px:</strong> 卡片垂直堆叠,宽度 100%,标题居中。</li>
<li><strong>640px ≤ 宽度 < 768px:</strong> 卡片每行 2 个 (w-1/2),标题居左。</li>
<li><strong>768px ≤ 宽度 < 1024px:</strong> 卡片每行 3 个 (w-1/3),允许换行。</li>
<li><strong>宽度 ≥ 1024px:</strong> 卡片每行 4 个 (w-1/4),布局更加紧凑。</li>
</ul>
</div>
</div>
</body>
</html>响应式类名可以与其他状态类名(如 hover, focus)组合使用,实现更复杂的交互。
语法格式:断点:状态:属性
md:hover:bg-blue-700: 在中等屏幕及以上,悬停时背景变蓝。
lg:focus:ring-4: 在大屏及以上,聚焦时显示粗光环。
有时需要在大屏上“重置”某些样式。
示例: 手机上隐藏侧边栏 (hidden),大屏显示 (lg:block)。
代码: <div class="hidden lg:block">...</div>
响应式导航栏
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Tailwind Auto Cols 对比演示</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<nav class="bg-white shadow-lg">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<!-- Logo: 始终显示 -->
<div class="flex-shrink-0 flex items-center">
<span class="font-bold text-xl text-gray-800">MyBrand</span>
</div>
<!-- 桌面菜单: 手机隐藏 (hidden), 大屏显示 (lg:flex) -->
<div class="hidden lg:flex space-x-8 items-center">
<a href="#"
class="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium transition-colors">首页</a>
<a href="#" class="text-gray-900 px-3 py-2 rounded-md text-sm font-medium bg-gray-100">产品</a>
<a href="#"
class="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium transition-colors">关于我们</a>
<button
class="bg-blue-600 text-white px-4 py-2 rounded-md text-sm font-medium hover:bg-blue-700 active:scale-95 transition-all">
登录
</button>
</div>
<!-- 移动端汉堡按钮: 大屏隐藏 (lg:hidden) -->
<div class="flex items-center lg:hidden">
<button class="text-gray-500 hover:text-gray-700 focus:outline-none p-2">
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
</div>
</div>
<!-- 移动端下拉菜单 (模拟): 手机显示块级,大屏隐藏 -->
<div class="lg:hidden bg-gray-50 border-t border-gray-100 p-4 space-y-2">
<a href="#" class="block text-gray-700 hover:bg-gray-100 px-3 py-2 rounded-md text-base font-medium">首页</a>
<a href="#" class="block text-gray-700 hover:bg-gray-100 px-3 py-2 rounded-md text-base font-medium">产品</a>
<a href="#"
class="block text-gray-700 hover:bg-gray-100 px-3 py-2 rounded-md text-base font-medium">关于我们</a>
<button
class="w-full mt-2 bg-blue-600 text-white px-4 py-2 rounded-md text-base font-medium hover:bg-blue-700">
登录
</button>
</div>
</nav>
</body>
</html>