tailwind-responsive-design by thebushidocollective/han
npx skills add https://github.com/thebushidocollective/han --skill tailwind-responsive-designTailwind CSS 提供了一个移动优先的响应式设计系统,使用断点前缀可以轻松构建自适应布局。
Tailwind 使用移动优先的断点系统。未加前缀的工具类适用于所有屏幕尺寸,而断点前缀则从该断点开始向上应用:
<!-- 移动端:全宽,平板+:半宽,桌面+:三分之一宽 -->
<div class="w-full md:w-1/2 lg:w-1/3">
响应式宽度
</div>
// tailwind.config.js 默认断点
{
sm: '640px', // 小型设备(横向手机)
md: '768px', // 中型设备(平板电脑)
lg: '1024px', // 大型设备(桌面电脑)
xl: '1280px', // 超大设备(大桌面电脑)
'2xl': '1536px' // 2倍超大设备(更大桌面电脑)
}
首先为移动端设计,然后为更大屏幕添加复杂性:
<!-- 良好:移动优先方法 -->
<div class="
flex flex-col
md:flex-row
gap-4
">
<div class="w-full md:w-1/2">列 1</div>
<div class="w-full md:w-1/2">列 2</div>
</div>
<!-- 不佳:桌面优先(需要更多覆盖) -->
<div class="
flex flex-row
sm:flex-col
">
在不同设备上适当缩放文本:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
<h1 class="
text-2xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl
font-bold
leading-tight
">
响应式标题
</h1>
<p class="
text-sm sm:text-base md:text-lg
leading-relaxed
">
可缩放的正文文本
</p>
为不同屏幕调整内边距和外边距:
<div class="
px-4 sm:px-6 md:px-8 lg:px-12
py-8 md:py-12 lg:py-16
">
<!-- 带响应式内边距的内容 -->
</div>
<section class="
space-y-4 md:space-y-6 lg:space-y-8
">
<!-- 子元素间的响应式间距 -->
</section>
创建适应屏幕尺寸的响应式网格:
<!-- 移动端1列,平板2列,桌面3列,大桌面4列 -->
<div class="
grid
grid-cols-1
sm:grid-cols-2
lg:grid-cols-3
xl:grid-cols-4
gap-4 md:gap-6
">
<div>项目 1</div>
<div>项目 2</div>
<div>项目 3</div>
<div>项目 4</div>
</div>
控制不同断点下的可见性:
<!-- 移动端菜单按钮:移动端可见,桌面端隐藏 -->
<button class="md:hidden">
<svg><!-- 菜单图标 --></svg>
</button>
<!-- 桌面导航:移动端隐藏,桌面端可见 -->
<nav class="hidden md:flex space-x-6">
<a href="#">首页</a>
<a href="#">关于</a>
<a href="#">联系</a>
</nav>
<!-- 仅在移动端显示 -->
<div class="block md:hidden">仅限移动端</div>
<!-- 仅在桌面端显示 -->
<div class="hidden lg:block">仅限桌面端</div>
<section class="
relative
min-h-screen md:min-h-[600px] lg:min-h-[800px]
px-4 sm:px-6 lg:px-8
py-12 md:py-16 lg:py-20
">
<div class="
max-w-7xl mx-auto
flex flex-col md:flex-row
items-center
gap-8 md:gap-12
">
<!-- 文本内容 -->
<div class="
w-full md:w-1/2
text-center md:text-left
">
<h1 class="
text-3xl sm:text-4xl md:text-5xl lg:text-6xl
font-bold
mb-4 md:mb-6
">
欢迎访问我们的网站
</h1>
<p class="
text-base sm:text-lg md:text-xl
text-gray-600
mb-6 md:mb-8
">
这是一个适应所有屏幕尺寸的响应式英雄区域。
</p>
<button class="
w-full sm:w-auto
px-6 md:px-8
py-3 md:py-4
bg-blue-500 hover:bg-blue-600
text-white
text-base md:text-lg
rounded-lg
">
开始使用
</button>
</div>
<!-- 图片 -->
<div class="
w-full md:w-1/2
order-first md:order-last
">
<img
src="/hero.jpg"
alt="英雄图片"
class="
w-full
rounded-lg md:rounded-xl
shadow-lg md:shadow-2xl
"
/>
</div>
</div>
</section>
<div class="
grid
grid-cols-1
sm:grid-cols-2
lg:grid-cols-3
xl:grid-cols-4
gap-4 sm:gap-6 lg:gap-8
px-4 sm:px-6 lg:px-8
">
{cards.map(card => (
<div class="
bg-white
rounded-lg md:rounded-xl
shadow-md hover:shadow-xl
overflow-hidden
transition-shadow
">
<img
src={card.image}
alt={card.title}
class="
w-full
h-48 sm:h-56 lg:h-64
object-cover
"
/>
<div class="
p-4 sm:p-5 lg:p-6
">
<h3 class="
text-lg sm:text-xl
font-semibold
mb-2
">
{card.title}
</h3>
<p class="
text-sm sm:text-base
text-gray-600
line-clamp-3
">
{card.description}
</p>
</div>
</div>
))}
</div>
<nav class="
bg-white
border-b border-gray-200
sticky top-0 z-50
">
<div class="
max-w-7xl mx-auto
px-4 sm:px-6 lg:px-8
">
<div class="
flex justify-between items-center
h-16 md:h-20
">
<!-- 标志 -->
<div class="flex-shrink-0">
<img
src="/logo.svg"
alt="标志"
class="h-8 md:h-10 w-auto"
/>
</div>
<!-- 桌面导航 -->
<div class="
hidden md:flex
space-x-8
">
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
首页
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
关于
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
服务
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
联系
</a>
</div>
<!-- 移动端菜单按钮 -->
<button class="
md:hidden
p-2
rounded-md
text-gray-700 hover:bg-gray-100
">
<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 class="md:hidden border-t border-gray-200">
<div class="px-2 pt-2 pb-3 space-y-1">
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
首页
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
关于
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
服务
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
联系
</a>
</div>
</div>
</nav>
使用容器查询实现组件级响应式:
// tailwind.config.js
module.exports = {
plugins: [
require('@tailwindcss/container-queries'),
],
}
<div class="@container">
<div class="
@sm:grid @sm:grid-cols-2
@lg:grid-cols-3
gap-4
">
<!-- 响应容器而非视口 -->
</div>
</div>
添加项目特定的断点:
// tailwind.config.js
module.exports = {
theme: {
screens: {
'xs': '475px',
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
'2xl': '1536px',
'3xl': '1920px',
// 最大宽度断点
'max-md': { 'max': '767px' },
// 高度断点
'tall': { 'raw': '(min-height: 800px)' },
},
},
}
<div class="
portrait:flex-col
landscape:flex-row
">
适应方向的内容
</div>
<div class="
text-base
print:text-xs
print:hidden
">
打印时隐藏此内容
</div>
<div class="hidden print:block">
仅在打印时显示
</div>
<img
src="/image.jpg"
alt="响应式图片"
class="
w-full
h-auto
max-w-xs sm:max-w-sm md:max-w-md lg:max-w-lg xl:max-w-xl
mx-auto
"
/>
<!-- 带宽高比 -->
<div class="
aspect-square sm:aspect-video
w-full
overflow-hidden
">
<img
src="/image.jpg"
class="w-full h-full object-cover"
/>
</div>
<div class="
flex
flex-col sm:flex-row
gap-4
items-center sm:items-start
justify-center sm:justify-between
">
<div>项目 1</div>
<div>项目 2</div>
<div>项目 3</div>
</div>
<div class="flex flex-col md:flex-row">
<div class="order-2 md:order-1">桌面端第一,移动端第二</div>
<div class="order-1 md:order-2">桌面端第二,移动端第一</div>
</div>
<!-- 不佳:过多的断点 -->
<div class="
text-xs
sm:text-sm
md:text-base
lg:text-lg
xl:text-xl
2xl:text-2xl
">
<!-- 良好:策略性断点 -->
<div class="
text-sm
md:text-base
lg:text-lg
">
<!-- 不佳:仅考虑桌面端 -->
<div class="grid grid-cols-4 gap-2">
<!-- 良好:移动优先 -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<!-- 不佳:太多自定义断点 -->
<div class="min-[823px]:flex min-[1043px]:grid">
<!-- 良好:使用标准断点 -->
<div class="md:flex lg:grid">
每周安装量
108
仓库
GitHub 星标数
121
首次出现
2026年1月22日
安全审计
安装于
opencode93
codex92
gemini-cli91
github-copilot82
cursor79
kimi-cli71
Tailwind CSS provides a mobile-first responsive design system using breakpoint prefixes that make it easy to build adaptive layouts.
Tailwind uses a mobile-first breakpoint system. Unprefixed utilities apply to all screen sizes, and breakpoint prefixes apply from that breakpoint and up:
<!-- Mobile: full width, Tablet+: half width, Desktop+: third width -->
<div class="w-full md:w-1/2 lg:w-1/3">
Responsive width
</div>
// tailwind.config.js default breakpoints
{
sm: '640px', // Small devices (landscape phones)
md: '768px', // Medium devices (tablets)
lg: '1024px', // Large devices (desktops)
xl: '1280px', // Extra large devices (large desktops)
'2xl': '1536px' // 2X large devices (larger desktops)
}
Design for mobile first, then add complexity for larger screens:
<!-- Good: Mobile-first approach -->
<div class="
flex flex-col
md:flex-row
gap-4
">
<div class="w-full md:w-1/2">Column 1</div>
<div class="w-full md:w-1/2">Column 2</div>
</div>
<!-- Bad: Desktop-first (requires more overrides) -->
<div class="
flex flex-row
sm:flex-col
">
Scale text appropriately across devices:
<h1 class="
text-2xl sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl
font-bold
leading-tight
">
Responsive Heading
</h1>
<p class="
text-sm sm:text-base md:text-lg
leading-relaxed
">
Body text that scales
</p>
Adjust padding and margins for different screens:
<div class="
px-4 sm:px-6 md:px-8 lg:px-12
py-8 md:py-12 lg:py-16
">
<!-- Content with responsive padding -->
</div>
<section class="
space-y-4 md:space-y-6 lg:space-y-8
">
<!-- Responsive spacing between children -->
</section>
Create responsive grids that adapt to screen size:
<!-- 1 column mobile, 2 tablet, 3 desktop, 4 large desktop -->
<div class="
grid
grid-cols-1
sm:grid-cols-2
lg:grid-cols-3
xl:grid-cols-4
gap-4 md:gap-6
">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
<div>Item 4</div>
</div>
Control visibility across breakpoints:
<!-- Mobile menu button: visible on mobile, hidden on desktop -->
<button class="md:hidden">
<svg><!-- Menu icon --></svg>
</button>
<!-- Desktop navigation: hidden on mobile, visible on desktop -->
<nav class="hidden md:flex space-x-6">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</nav>
<!-- Show only on mobile -->
<div class="block md:hidden">Mobile only</div>
<!-- Show only on desktop -->
<div class="hidden lg:block">Desktop only</div>
<section class="
relative
min-h-screen md:min-h-[600px] lg:min-h-[800px]
px-4 sm:px-6 lg:px-8
py-12 md:py-16 lg:py-20
">
<div class="
max-w-7xl mx-auto
flex flex-col md:flex-row
items-center
gap-8 md:gap-12
">
<!-- Text Content -->
<div class="
w-full md:w-1/2
text-center md:text-left
">
<h1 class="
text-3xl sm:text-4xl md:text-5xl lg:text-6xl
font-bold
mb-4 md:mb-6
">
Welcome to Our Site
</h1>
<p class="
text-base sm:text-lg md:text-xl
text-gray-600
mb-6 md:mb-8
">
This is a responsive hero section that adapts to all screen sizes.
</p>
<button class="
w-full sm:w-auto
px-6 md:px-8
py-3 md:py-4
bg-blue-500 hover:bg-blue-600
text-white
text-base md:text-lg
rounded-lg
">
Get Started
</button>
</div>
<!-- Image -->
<div class="
w-full md:w-1/2
order-first md:order-last
">
<img
src="/hero.jpg"
alt="Hero"
class="
w-full
rounded-lg md:rounded-xl
shadow-lg md:shadow-2xl
"
/>
</div>
</div>
</section>
<div class="
grid
grid-cols-1
sm:grid-cols-2
lg:grid-cols-3
xl:grid-cols-4
gap-4 sm:gap-6 lg:gap-8
px-4 sm:px-6 lg:px-8
">
{cards.map(card => (
<div class="
bg-white
rounded-lg md:rounded-xl
shadow-md hover:shadow-xl
overflow-hidden
transition-shadow
">
<img
src={card.image}
alt={card.title}
class="
w-full
h-48 sm:h-56 lg:h-64
object-cover
"
/>
<div class="
p-4 sm:p-5 lg:p-6
">
<h3 class="
text-lg sm:text-xl
font-semibold
mb-2
">
{card.title}
</h3>
<p class="
text-sm sm:text-base
text-gray-600
line-clamp-3
">
{card.description}
</p>
</div>
</div>
))}
</div>
<nav class="
bg-white
border-b border-gray-200
sticky top-0 z-50
">
<div class="
max-w-7xl mx-auto
px-4 sm:px-6 lg:px-8
">
<div class="
flex justify-between items-center
h-16 md:h-20
">
<!-- Logo -->
<div class="flex-shrink-0">
<img
src="/logo.svg"
alt="Logo"
class="h-8 md:h-10 w-auto"
/>
</div>
<!-- Desktop Navigation -->
<div class="
hidden md:flex
space-x-8
">
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
Home
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
About
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
Services
</a>
<a href="#" class="
text-gray-700 hover:text-blue-600
px-3 py-2
text-sm lg:text-base
font-medium
">
Contact
</a>
</div>
<!-- Mobile Menu Button -->
<button class="
md:hidden
p-2
rounded-md
text-gray-700 hover:bg-gray-100
">
<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>
<!-- Mobile Menu -->
<div class="md:hidden border-t border-gray-200">
<div class="px-2 pt-2 pb-3 space-y-1">
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
Home
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
About
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
Services
</a>
<a href="#" class="
block px-3 py-2
rounded-md
text-base font-medium
text-gray-700 hover:bg-gray-100
">
Contact
</a>
</div>
</div>
</nav>
Use container queries for component-level responsiveness:
// tailwind.config.js
module.exports = {
plugins: [
require('@tailwindcss/container-queries'),
],
}
<div class="@container">
<div class="
@sm:grid @sm:grid-cols-2
@lg:grid-cols-3
gap-4
">
<!-- Responsive to container, not viewport -->
</div>
</div>
Add project-specific breakpoints:
// tailwind.config.js
module.exports = {
theme: {
screens: {
'xs': '475px',
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
'2xl': '1536px',
'3xl': '1920px',
// Max-width breakpoints
'max-md': { 'max': '767px' },
// Height breakpoints
'tall': { 'raw': '(min-height: 800px)' },
},
},
}
<div class="
portrait:flex-col
landscape:flex-row
">
Content that adapts to orientation
</div>
<div class="
text-base
print:text-xs
print:hidden
">
This is hidden in print
</div>
<div class="hidden print:block">
This only appears in print
</div>
<img
src="/image.jpg"
alt="Responsive image"
class="
w-full
h-auto
max-w-xs sm:max-w-sm md:max-w-md lg:max-w-lg xl:max-w-xl
mx-auto
"
/>
<!-- With aspect ratio -->
<div class="
aspect-square sm:aspect-video
w-full
overflow-hidden
">
<img
src="/image.jpg"
class="w-full h-full object-cover"
/>
</div>
<div class="
flex
flex-col sm:flex-row
gap-4
items-center sm:items-start
justify-center sm:justify-between
">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<div class="flex flex-col md:flex-row">
<div class="order-2 md:order-1">First on desktop, second on mobile</div>
<div class="order-1 md:order-2">Second on desktop, first on mobile</div>
</div>
<!-- Bad: Excessive breakpoints -->
<div class="
text-xs
sm:text-sm
md:text-base
lg:text-lg
xl:text-xl
2xl:text-2xl
">
<!-- Good: Strategic breakpoints -->
<div class="
text-sm
md:text-base
lg:text-lg
">
<!-- Bad: Desktop-only thinking -->
<div class="grid grid-cols-4 gap-2">
<!-- Good: Mobile-first -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<!-- Bad: Too many custom breakpoints -->
<div class="min-[823px]:flex min-[1043px]:grid">
<!-- Good: Use standard breakpoints -->
<div class="md:flex lg:grid">
Weekly Installs
108
Repository
GitHub Stars
121
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode93
codex92
gemini-cli91
github-copilot82
cursor79
kimi-cli71
agentation - AI智能体可视化UI反馈工具,连接人眼与代码的桥梁
5,400 周安装
社交媒体内容策略指南:LinkedIn、Twitter、Instagram、TikTok、Facebook平台优化与模板
250 周安装
WhisperX 音频转文字工具 - 支持多语言、词级时间戳、字幕格式输出
254 周安装
Browserbase Fetch API:快速获取网页内容、头部和元数据,无需浏览器会话
257 周安装
Sentry Flutter SDK 完整设置指南:错误监控、性能剖析、会话回放
257 周安装
OpenClaw CLI 命令行工具:AI 网关与智能体管理完整指南
250 周安装
PEFT参数高效微调指南:LoRA/QLoRA方法,在消费级GPU上微调大语言模型
252 周安装