1. Tailwind CSS 是什么

1.1 从写 CSS 到写类名

传统 CSS 开发中,你需要:

  1. 想一个类名(如 .card.btn-primary

  2. 在 CSS 文件里写样式

  3. 在 HTML 里引用这个类名

Tailwind 换了一种思路:不写 CSS,直接在 HTML 里用现成的工具类名

<!-- 传统 CSS -->
<div class="card">...</div>
<style>.card { background: white; padding: 1rem; border-radius: 0.5rem; }</style>

<!-- Tailwind 方式 -->
<div class="bg-white p-4 rounded-lg">...</div>

你不再需要给每个组件起名字,也不需要离开 HTML 去写样式。所有样式都是通过组合预定义的类名完成的

1.2 传统 CSS 的痛点

痛点 说明
命名困难 给一个普通盒子起名 .wrapper.container.box-inner……
样式冲突 不同组件用了相同类名,相互覆盖
文件膨胀 项目一大,CSS 文件几千行,不敢删(怕删错)
上下文切换 写 HTML 和 CSS 之间来回切,打断思路
复用困难 复制粘贴样式,或者用 @extend,都容易出问题

Tailwind 的方案:用原子类直接写在 HTML 上,无需命名,作用域天然隔离

1.3 什么是原子类 CSS 

原子类 CSS(Atomic CSS)是一种只做一件事的、单一职责的类。

/* 传统 CSS 的一个类做了很多事 */
.card {
  background: white;
  padding: 1rem;
  border-radius: 0.5rem;
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}

/* 原子类:每个类只做一件事 */
.bg-white { background: white; }
.p-4 { padding: 1rem; }
.rounded-lg { border-radius: 0.5rem; }
.shadow { box-shadow: 0 1px 3px rgba(0,0,0,0.1); }

组合原子类得到你需要的样式:

<div class="bg-white p-4 rounded-lg shadow">...</div>

Tailwind 提供了数千个这样的原子类,覆盖了几乎所有的 CSS 属性。

1.4 Tailwind vs Bootstrap vs 传统 CSS

对比 传统 CSS Bootstrap Tailwind CSS
设计理念 手写样式 预制组件 原子类
HTML 代码量 少(直接用组件) 多(类名较长)
CSS 文件大小 可能很大 固定大小 按需生成(很小)
定制难度 容易 难(需要覆盖) 容易(配置主题)
学习曲线 已会 CSS 需学组件名 需学类名规则
适用场景 对样式有绝对掌控 快速原型 高度定制化设计

Bootstrap:给你预制好的组件(按钮、卡片、导航栏),套用后像换皮肤。
Tailwind:给你乐高积木(原子类),自己拼装成组件。

什么时候用 Tailwind?

  1. 需要独特的设计系统(不是 Bootstrap 默认样式)
  2. 想提升 CSS 开发效率
  3. 希望最终 CSS 体积最小

2. 快速上手

2.1 通过 CDN 尝鲜(不推荐生产)

最快体验 Tailwind 的方式是用 CDN,但仅用于学习/原型

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
  <h1 class="text-3xl font-bold underline text-center mt-10">
    Hello Tailwind!
  </h1>
</body>
</html>

保存为 .html 文件,用浏览器打开即可看到效果。

注意:CDN 版本包含所有类,体积很大,且无法自定义主题,不适用于生产。

2.2 Vite 项目中安装

创建 Vite 项目(以 vanilla 为例):

npm create vite@latest my-tailwind-app -- --template vanilla
cd my-tailwind-app

安装 Tailwind 及相关依赖:

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

这条命令会生成两个文件:

  1. tailwind.config.js —— Tailwind 配置文件
  2. postcss.config.js —— PostCSS 配置(Tailwind 通过它工作)

2.3 配置文件初识

tailwind.config.js

// tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
  // 告诉 Tailwind 扫描哪些文件中的类名
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
  • content:告诉 Tailwind 哪些文件包含类名,构建时会扫描这些文件,只生成用到的类。
  • theme:主题配置,可以扩展或覆盖默认的颜色、字体、断点等。
  • plugins:插件(如 @tailwindcss/forms)。

接下来,在 src/style.css 中添加 Tailwind 指令:

@tailwind base;
@tailwind components;
@tailwind utilities;

2.4 第一个 Tailwind 页面

修改 index.html

<!doctype html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Tailwind 示例</title>
  <link rel="stylesheet" href="/src/style.css" />
</head>
<body>
  <div class="min-h-screen bg-gray-100 flex items-center justify-center">
    <div class="bg-white p-8 rounded-lg shadow-md text-center">
      <h1 class="text-2xl font-bold text-blue-600 mb-4">
        欢迎使用 Tailwind CSS
      </h1>
      <p class="text-gray-600 mb-4">
        这是一个用原子类拼出来的卡片
      </p>
      <button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
        按钮
      </button>
    </div>
  </div>
</body>
</html>

启动开发服务器:

npm run dev

打开浏览器,你应该能看到一个居中显示的卡片,包含标题、文字和按钮。

每个类的作用

类名 作用
min-h-screen 最小高度占满整个视口
bg-gray-100 背景色浅灰
flex items-center justify-center 弹性布局,水平垂直居中
bg-white p-8 rounded-lg shadow-md 白背景、内边距、圆角、阴影
text-2xl font-bold text-blue-600 大号字、加粗、蓝色
hover:bg-blue-700 鼠标悬停时背景变深

3. 实用类(核心)

3.1 布局

flex、grid、容器尺寸

1. Flex 布局

类名 作用
flex 开启 Flex 布局
inline-flex 行内 Flex
flex-row 水平方向(默认)
flex-col 垂直方向
justify-start/center/end/between/around/evenly 主轴对齐
items-start/center/end/stretch 交叉轴对齐
flex-wrap 允许换行
gap-4 子元素间距
<div class="flex justify-between items-center gap-4">
  <div>左</div>
  <div>右</div>
</div>

2. Grid 布局

类名 作用
grid 开启 Grid
grid-cols-2 2 列
grid-cols-3 3 列
grid-cols-4 4 列
gap-4 行列间距
<div class="grid grid-cols-3 gap-4">
  <div>1</div>
  <div>2</div>
  <div>3</div>
</div>

3. 容器尺寸

类名 作用
container 响应式容器,居中且最大宽度随断点变化
max-w-screen-xl 限制最大宽度
w-full 宽度 100%
h-32 固定高度

3.2 间距

padding、margin(p-4、m-2)

Tailwind 使用 {property}-{size} 格式,尺寸按 0.25rem 递增。

<!-- padding -->
<div class="p-4">  四周内边距 1rem</div>
<div class="px-4"> 左右内边距</div>
<div class="py-2"> 上下内边距</div>
<div class="pt-4"> 上内边距</div>

<!-- margin -->
<div class="m-4">  四周外边距</div>
<div class="mx-auto"> 水平居中</div>
<div class="mt-2">  上外边距</div>

常用尺寸:01(0.25rem)、2(0.5rem)、4(1rem)、8(2rem)……

3.3 文字

类名 作用 示例值
text-xs/sm/base/lg/xl/2xl/... 字体大小 text-lg
font-light/normal/medium/semibold/bold 字体粗细 font-bold
text-gray-500/red-600/... 文字颜色 text-blue-600
text-left/center/right/justify 文字对齐 text-center
uppercase/lowercase/capitalize 大小写转换 uppercase
leading-5/6/7/8/9 行高 leading-relaxed
<h1 class="text-3xl font-bold text-center text-blue-600">标题</h1>
<p class="text-base text-gray-600 leading-relaxed">一段描述文字</p>

3.4 背景与边框

背景

类名 作用
bg-gray-100/200/... 背景色
bg-white 白色背景
bg-gradient-to-r from-blue-500 to-purple-500 渐变
bg-cover 背景覆盖

边框

类名 作用
border 添加边框(默认灰色)
border-gray-200 边框颜色
border-t/b/l/r 单边边框
rounded-sm/md/lg/xl/full 圆角
border-2 边框粗细
<div class="bg-white border border-gray-200 rounded-lg shadow-md">
  卡片内容
</div>

3.5 宽高与尺寸

类名 作用
w-1/2w-1/3w-2/3w-1/4w-3/4 百分比宽度
w-full 100% 宽度
w-screen 视口宽度
w-32 固定宽度(8rem)
h-32 固定高度
min-h-screen 最小高度占满视口
<div class="w-1/2 lg:w-1/3">响应式宽度</div>

3.6 组合示例——按钮

<button class="
  bg-blue-600 
  hover:bg-blue-700 
  text-white 
  font-medium 
  py-2 px-4 
  rounded-lg 
  shadow 
  transition 
  duration-200
">
  点击按钮
</button>
作用
bg-blue-600 蓝色背景
hover:bg-blue-700 鼠标悬停变深
text-white 白色文字
font-medium 中等粗细
py-2 px-4 垂直 0.5rem,水平 1rem 内边距
rounded-lg 大圆角
shadow 轻微阴影
transition duration-200 200ms 过渡动画

4. 响应式设计

4.1 断点前缀

(sm、md、lg、xl、2xl)

Tailwind 使用移动优先的断点系统。

前缀 最小宽度 适用设备
无前缀 0 手机(默认)
sm: 640px 大手机
md: 768px 平板
lg: 1024px 小笔记本
xl: 1280px 桌面
2xl: 1536px 大桌面
<!-- 手机:文字小;平板以上:文字大 -->
<p class="text-sm md:text-lg">响应式文字</p>

4.2 移动优先设计原则

先写手机版样式,再用断点前缀覆盖大屏幕。

<div class="
  grid grid-cols-1 gap-4
  sm:grid-cols-2
  lg:grid-cols-3
  xl:grid-cols-4
">
  <div>卡片1</div>
  <div>卡片2</div>
  <div>卡片3</div>
  <div>卡片4</div>
</div>

手机:1 列;平板:2 列;笔记本:3 列;桌面:4 列

4.3 常见响应式模式

1. 响应式导航栏

<nav class="flex flex-col md:flex-row justify-between items-center p-4 bg-white shadow">
  <div class="text-xl font-bold">Logo</div>
  <ul class="flex flex-col md:flex-row gap-2 md:gap-6 mt-2 md:mt-0">
    <li><a href="#" class="hover:text-blue-600">首页</a></li>
    <li><a href="#" class="hover:text-blue-600">产品</a></li>
    <li><a href="#" class="hover:text-blue-600">关于</a></li>
  </ul>
</nav>
  • 手机:垂直布局,Logo 在上,菜单在下
  • 平板以上:水平布局,Logo 左,菜单右

2. 响应式网格

<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
  <div class="border rounded-lg p-4">商品卡片</div>
  <div class="border rounded-lg p-4">商品卡片</div>
  <div class="border rounded-lg p-4">商品卡片</div>
  <!-- 更多卡片 -->
</div>

4.4 实战:一个响应式卡片组件

<div class="max-w-sm md:max-w-md lg:max-w-lg mx-auto bg-white rounded-xl shadow-md overflow-hidden">
  <div class="md:flex">
    <div class="md:flex-shrink-0">
      <img class="h-48 w-full object-cover md:w-48" src="/placeholder.jpg" alt="图片">
    </div>
    <div class="p-6">
      <div class="uppercase tracking-wide text-sm text-blue-600 font-semibold">精选文章</div>
      <h2 class="text-xl font-bold mt-2">响应式卡片标题</h2>
      <p class="text-gray-500 mt-2">
        这是一段描述文字。在手机上图片在上方,在平板上图片在左侧。
      </p>
      <button class="mt-4 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
        阅读更多
      </button>
    </div>
  </div>
</div>

5. 暗色模式

5.1 配置暗色模式策略

Tailwind 支持两种暗色模式策略:

策略 说明 适用场景
media 跟随系统主题(prefers-color-scheme 自动适配,用户无法手动切换
class 通过父元素的 .dark 类手动控制 需要用户手动切换主题

在 tailwind.config.js 中配置:

// tailwind.config.js
export default {
  darkMode: 'class', // 或 'media'
  // ...
}

5.2 使用 dark: 前缀

配置好后,用 dark: 前缀写暗色模式下的样式。

<div class="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
  <h1 class="text-2xl">自动适配暗色模式</h1>
</div>
亮色模式 暗色模式
bg-white dark:bg-gray-900 白色背景 深灰背景
text-gray-900 dark:text-gray-100 深色文字 浅色文字

5.3 手动切换暗色模式

当 darkMode: 'class' 时,在根元素(通常是 <html>)上添加 .dark 类。

<!-- 亮色模式 -->
<html>...</html>

<!-- 暗色模式 -->
<html class="dark">...</html>

手动切换示例:

// 切换暗色模式
function toggleDarkMode() {
  const html = document.documentElement
  if (html.classList.contains('dark')) {
    html.classList.remove('dark')
    localStorage.setItem('theme', 'light')
  } else {
    html.classList.add('dark')
    localStorage.setItem('theme', 'dark')
  }
}

// 初始化时读取用户偏好
const savedTheme = localStorage.getItem('theme')
if (savedTheme === 'dark' || (!savedTheme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
  document.documentElement.classList.add('dark')
}

5.4 示例:暗色导航栏

<nav class="bg-white dark:bg-gray-800 shadow-md px-6 py-3">
  <div class="flex justify-between items-center">
    <div class="text-xl font-bold text-gray-800 dark:text-white">Logo</div>
    
    <ul class="flex gap-6">
      <li><a href="#" class="text-gray-600 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400">首页</a></li>
      <li><a href="#" class="text-gray-600 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400">产品</a></li>
      <li><a href="#" class="text-gray-600 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400">关于</a></li>
    </ul>
    
    <button id="themeToggle" class="p-2 rounded-lg bg-gray-100 dark:bg-gray-700">
      🌙
    </button>
  </div>
</nav>

<script>
  document.getElementById('themeToggle').addEventListener('click', toggleDarkMode)
</script>

6. 交互与状态

6.1 悬停(hover:)

鼠标悬停时应用样式。

<button class="bg-blue-500 hover:bg-blue-700 text-white py-2 px-4 rounded">
  悬停变深
</button>

6.2 焦点(focus:)

元素获得焦点时(如 input 被点击、Tab 键选中)。

<input class="border rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" />

6.3 活动(active:)

元素被激活时(如按钮按下瞬间)。

<button class="bg-blue-500 active:bg-blue-800 transition">
  点击瞬间变深
</button>

6.4 禁用(disabled:)

表单元素被禁用时的样式。

<button disabled class="bg-gray-300 disabled:opacity-50 disabled:cursor-not-allowed">
  禁用按钮
</button>

6.5 组合状态

可以组合多个状态前缀。

<button class="bg-blue-500 hover:bg-blue-700 focus:ring-2 focus:ring-blue-300 active:bg-blue-800 disabled:opacity-50">
  多种状态
</button>

6.6 示例:悬停按钮组

<div class="flex gap-3 p-4">
  <button class="px-4 py-2 bg-green-500 hover:bg-green-600 text-white rounded-lg shadow transition">
    保存
  </button>
  <button class="px-4 py-2 bg-red-500 hover:bg-red-600 text-white rounded-lg shadow transition">
    删除
  </button>
  <button class="px-4 py-2 bg-gray-300 dark:bg-gray-700 hover:bg-gray-400 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-200 rounded-lg transition">
    取消
  </button>
</div>

7. 自定义配置

7.1 主题定制

颜色、字体、间距

在 tailwind.config.js 中自定义主题。

// tailwind.config.js
export default {
  theme: {
    colors: {
      primary: '#1d4ed8',
      secondary: '#6b7280',
    },
    fontFamily: {
      sans: ['Inter', 'system-ui', 'sans-serif'],
    },
    spacing: {
      '72': '18rem',
      '84': '21rem',
    },
  },
}

使用自定义的值:

<div class="bg-primary text-white p-4">自定义主题色</div>

7.2 扩展 vs 覆盖

方式 说明 写法
覆盖 完全替换默认值 colors: { ... }
扩展 保留默认值,增加新值 extend: { colors: { ... } }

推荐使用扩展

export default {
  theme: {
    extend: {
      colors: {
        primary: '#1d4ed8',
      },
      fontSize: {
        'xxs': '0.625rem',
      },
    },
  },
}

7.3 添加自定义工具类

@layer utilities

/* 在 CSS 文件中 */
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer utilities {
  .text-shadow {
    text-shadow: 0 2px 4px rgba(0,0,0,0.1);
  }
  .rotate-y-180 {
    transform: rotateY(180deg);
  }
}

使用:

<div class="text-shadow">带阴影的文字</div>

7.4 添加自定义组件

@layer components

@layer components {
  .btn-primary {
    @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded;
  }
  .card {
    @apply bg-white rounded-lg shadow-md p-6;
  }
}

使用:

<button class="btn-primary">按钮</button>
<div class="card">卡片内容</div>

注意官方建议尽量用原子类,@apply 仅在抽取重复组合时使用。

7.5 插件入门

// tailwind.config.js
import plugin from 'tailwindcss/plugin'

export default {
  plugins: [
    plugin(function({ addUtilities, addComponents, theme }) {
      addUtilities({
        '.skew-10deg': {
          transform: 'skewY(-10deg)',
        },
      })
      addComponents({
        '.btn': {
          padding: '.5rem 1rem',
          borderRadius: '.25rem',
          fontWeight: '600',
        },
      })
    }),
  ],
}

第8章:优化与集成

8.1 生产优化(自动删除未使用的 CSS)

Tailwind 通过扫描 content 中指定的文件,自动删除未使用的类。

// tailwind.config.js
export default {
  content: [
    './index.html',
    './src/**/*.{js,ts,jsx,tsx,vue}',
  ],
}

构建时:

npm run build

最终 CSS 体积通常只有几 KB。

8.2 集成 React

npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

配置 tailwind.config.js 的 content

content: [
  "./index.html",
  "./src/**/*.{js,ts,jsx,tsx}",
],

在 src/index.css 中引入:

@tailwind base;
@tailwind components;
@tailwind utilities;

8.3 集成 Vue

npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

配置 tailwind.config.js

content: [
  "./index.html",
  "./src/**/*.{vue,js,ts}",
],

在 src/style.css 中引入:

@tailwind base;
@tailwind components;
@tailwind utilities;

8.4 @apply 的用法与时机

@layer components {
  .card {
    @apply bg-white rounded-lg shadow-md p-6;
  }
}

不建议:把整个页面都用 @apply 写成传统 CSS。
建议:仅在频繁复用的组件(如按钮、卡片)上使用。

8.5 VS Code 插件推荐

插件 作用
Tailwind CSS IntelliSense 智能提示、自动补全、悬停预览
Headwind 自动排序类名(按推荐顺序)

安装后,在 HTML 或 JSX 中输入 bg- 即可看到所有背景色选项。

9. 附录

9.1 常用类名速查表

分类 类名示例 作用
布局 flexgridgrid-cols-3gap-4 弹性/网格布局
间距 p-4m-2px-6mt-4 内外边距
尺寸 w-fullh-32min-h-screen 宽高
文字 text-lgfont-boldtext-centertext-gray-600 文字样式
背景 bg-whitebg-gray-100bg-blue-500 背景色
边框 borderborder-gray-200rounded-lg 边框与圆角
效果 shadowopacity-50 阴影、透明度
响应式 sm:text-centermd:flexlg:w-1/2 断点前缀
状态 hover:bg-blue-700focus:ringactive:scale-95 交互状态
暗色 dark:bg-gray-800dark:text-white 暗色模式

9.2 断点速查

断点 最小宽度 常用设备
sm 640px 大手机
md 768px 平板竖屏
lg 1024px 平板横屏/小笔记本
xl 1280px 桌面显示器
2xl 1536px 大屏显示器

9.3 推荐学习资源

资源 链接
官方文档 https://tailwindcss.com/docs
中文文档 https://www.tailwindcss.cn/docs
Tailwind 实验室 https://play.tailwindcss.com
常用类名速查 https://nerdcave.com/tailwind-cheat-sheet

明天还有一篇实战内容!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐