Tailwind CSS 响应式设计 #
移动优先理念 #
Tailwind CSS 采用移动优先的设计理念,这意味着:
- 默认样式应用于最小屏幕
- 使用断点逐步添加更大屏幕的样式
html
<!-- 移动优先:默认小屏样式,逐步添加大屏样式 -->
<div class="text-sm md:text-base lg:text-lg">
响应式文字
</div>
断点系统 #
默认断点 #
| 断点 | 前缀 | 最小宽度 | CSS |
|---|---|---|---|
| 小屏 | 无 | 0px | 默认 |
sm |
sm: |
640px | @media (min-width: 640px) |
md |
md: |
768px | @media (min-width: 768px) |
lg |
lg: |
1024px | @media (min-width: 1024px) |
xl |
xl: |
1280px | @media (min-width: 1280px) |
2xl |
2xl: |
1536px | @media (min-width: 1536px) |
使用断点 #
html
<!-- 默认 1 列,sm 及以上 2 列,md 及以上 3 列 -->
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
<div>项目 1</div>
<div>项目 2</div>
<div>项目 3</div>
</div>
断点范围 #
html
<!-- 仅在 sm 到 md 之间显示 -->
<div class="sm:block md:hidden">
仅在 sm 断点显示
</div>
<!-- 仅在 md 到 lg 之间显示 -->
<div class="md:block lg:hidden">
仅在 md 断点显示
</div>
响应式实用类 #
布局响应式 #
html
<!-- 响应式显示/隐藏 -->
<div class="hidden md:block">桌面端显示</div>
<div class="block md:hidden">移动端显示</div>
<!-- 响应式 Flex 方向 -->
<div class="flex flex-col md:flex-row">
<div>项目 1</div>
<div>项目 2</div>
</div>
<!-- 响应式 Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<div>项目</div>
</div>
间距响应式 #
html
<!-- 响应式内边距 -->
<div class="p-4 md:p-6 lg:p-8">
响应式内边距
</div>
<!-- 响应式外边距 -->
<div class="mt-4 md:mt-8 lg:mt-12">
响应式外边距
</div>
字体响应式 #
html
<!-- 响应式字体大小 -->
<h1 class="text-2xl md:text-4xl lg:text-6xl">
响应式标题
</h1>
<!-- 响应式文本对齐 -->
<p class="text-center md:text-left">
响应式对齐
</p>
宽度响应式 #
html
<!-- 响应式宽度 -->
<div class="w-full md:w-1/2 lg:w-1/3">
响应式宽度
</div>
<!-- 响应式最大宽度 -->
<div class="max-w-sm md:max-w-md lg:max-w-lg">
响应式最大宽度
</div>
自定义断点 #
javascript
// tailwind.config.js
module.exports = {
theme: {
screens: {
'xs': '475px',
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
'2xl': '1536px',
},
},
}
html
<div class="xs:text-sm">
自定义断点
</div>
最大宽度断点 #
使用 max-* 前缀创建最大宽度断点:
javascript
// tailwind.config.js
module.exports = {
theme: {
screens: {
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
},
},
plugins: [
function({ matchUtilities, theme }) {
matchUtilities(
{
'max': (value) => ({
[`@media (max-width: ${value})`]: {},
}),
},
{ values: theme('screens') }
)
},
],
}
html
<!-- 最大宽度断点 -->
<div class="max-md:text-center">
仅在 md 以下居中
</div>
容器查询 #
Tailwind CSS 支持 CSS 容器查询:
配置 #
javascript
// tailwind.config.js
module.exports = {
theme: {
extend: {
containers: {
'xs': '320px',
'sm': '384px',
'md': '448px',
'lg': '512px',
'xl': '576px',
},
},
},
}
使用 #
html
<!-- 定义容器 -->
<div class="@container">
<!-- 基于容器宽度的响应式 -->
<div class="@sm:flex @lg:grid @lg:grid-cols-2">
容器查询布局
</div>
</div>
实战示例 #
响应式导航 #
html
<nav class="bg-white shadow">
<div class="container mx-auto px-4">
<div class="flex items-center justify-between h-16">
<!-- Logo -->
<div class="flex-shrink-0">
<span class="font-bold text-xl">Logo</span>
</div>
<!-- 桌面端菜单 -->
<div class="hidden md:flex space-x-8">
<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>
<!-- 移动端菜单按钮 -->
<button class="md:hidden p-2">
<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 pb-4">
<a href="#" class="block py-2 hover:text-blue-500">首页</a>
<a href="#" class="block py-2 hover:text-blue-500">关于</a>
<a href="#" class="block py-2 hover:text-blue-500">服务</a>
<a href="#" class="block py-2 hover:text-blue-500">联系</a>
</div>
</div>
</nav>
响应式卡片网格 #
html
<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 p-6">
<h3 class="font-semibold">卡片标题</h3>
<p class="text-gray-600 mt-2">卡片内容</p>
</div>
<!-- 更多卡片... -->
</div>
响应式侧边栏布局 #
html
<div class="flex flex-col lg:flex-row min-h-screen">
<!-- 侧边栏 -->
<aside class="w-full lg:w-64 bg-gray-100 p-4 lg:min-h-screen">
侧边栏内容
</aside>
<!-- 主内容 -->
<main class="flex-1 p-4">
主内容区域
</main>
</div>
响应式图片 #
html
<img class="w-full md:w-1/2 lg:w-1/3 mx-auto" src="image.jpg" alt="响应式图片">
响应式表单 #
html
<form class="space-y-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label class="block mb-1">名字</label>
<input class="w-full border rounded px-4 py-2">
</div>
<div>
<label class="block mb-1">姓氏</label>
<input class="w-full border rounded px-4 py-2">
</div>
</div>
<div>
<label class="block mb-1">邮箱</label>
<input type="email" class="w-full border rounded px-4 py-2">
</div>
</form>
响应式页脚 #
html
<footer class="bg-gray-100 py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<div>
<h4 class="font-semibold mb-4">关于我们</h4>
<p class="text-gray-600">公司介绍内容</p>
</div>
<div>
<h4 class="font-semibold mb-4">产品服务</h4>
<ul class="space-y-2 text-gray-600">
<li><a href="#">产品 1</a></li>
<li><a href="#">产品 2</a></li>
</ul>
</div>
<div>
<h4 class="font-semibold mb-4">联系我们</h4>
<ul class="space-y-2 text-gray-600">
<li>电话:123-456-7890</li>
<li>邮箱:info@example.com</li>
</ul>
</div>
<div>
<h4 class="font-semibold mb-4">关注我们</h4>
<div class="flex space-x-4">
<a href="#">微信</a>
<a href="#">微博</a>
</div>
</div>
</div>
</div>
</footer>
下一步 #
掌握响应式设计后,继续学习 交互状态 了解状态修饰符!
最后更新:2026-03-28