1.1 什么是 Tailwind CSS?
1.1.1 定义与特点
Tailwind CSS 是一个实用优先(utility-first)的 CSS 框架,它提供了大量的原子化类名来快速构建用户界面。与传统的 CSS 框架(如 Bootstrap)不同,Tailwind CSS 不提供预设计的组件,而是提供低级别的实用工具类。
核心特点:
- 原子化设计:每个类名对应一个或几个 CSS 属性
- 高度可定制:通过配置文件完全控制设计系统
- 响应式优先:内置响应式断点系统
- 性能优化:自动移除未使用的 CSS
- 开发体验:优秀的 IDE 支持和开发工具
1.1.2 设计哲学
<!-- 传统 CSS 方式 -->
<div class="card">
<h2 class="card-title">标题</h2>
<p class="card-content">内容</p>
</div>
<style>
.card {
background: white;
border-radius: 8px;
padding: 24px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.card-title {
font-size: 24px;
font-weight: bold;
margin-bottom: 16px;
}
.card-content {
color: #666;
line-height: 1.6;
}
</style>
<!-- Tailwind CSS 方式 -->
<div class="bg-white rounded-lg p-6 shadow-md">
<h2 class="text-2xl font-bold mb-4">标题</h2>
<p class="text-gray-600 leading-relaxed">内容</p>
</div>
1.1.3 优势与劣势
优势: - 快速开发:无需编写自定义 CSS - 一致性:统一的设计系统 - 可维护性:样式与 HTML 结构紧密结合 - 性能:自动优化,移除未使用的样式 - 灵活性:完全的设计自由度
劣势: - 学习曲线:需要记忆大量类名 - HTML 冗长:类名较多可能导致 HTML 复杂 - 初始文件大小:完整框架较大(但可通过 PurgeCSS 优化)
1.2 安装与配置
1.2.1 通过 npm 安装(推荐)
# 创建新项目
mkdir my-tailwind-project
cd my-tailwind-project
# 初始化 npm 项目
npm init -y
# 安装 Tailwind CSS
npm install -D tailwindcss
# 生成配置文件
npx tailwindcss init
1.2.2 配置 tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/**/*.{html,js}",
"./public/**/*.html",
"./*.html"
],
theme: {
extend: {},
},
plugins: [],
}
1.2.3 创建 CSS 入口文件
创建 src/input.css
文件:
@tailwind base;
@tailwind components;
@tailwind utilities;
1.2.4 构建 CSS
# 构建 CSS 文件
npx tailwindcss -i ./src/input.css -o ./dist/output.css --watch
1.2.5 在 HTML 中使用
创建 index.html
文件:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>我的第一个 Tailwind 项目</title>
<link href="./dist/output.css" rel="stylesheet">
</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 max-w-md w-full">
<h1 class="text-3xl font-bold text-gray-800 mb-4">欢迎使用 Tailwind CSS</h1>
<p class="text-gray-600 mb-6">这是你的第一个 Tailwind CSS 项目!</p>
<button class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded transition duration-200">
开始探索
</button>
</div>
</div>
</body>
</html>
1.3 其他安装方式
1.3.1 通过 CDN(快速开始)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tailwind CSS CDN</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body>
<h1 class="text-3xl font-bold underline">
Hello Tailwind!
</h1>
</body>
</html>
注意: CDN 方式仅适用于开发和原型制作,生产环境建议使用构建工具。
1.3.2 使用 Tailwind CLI
# 安装 Tailwind CLI
npm install -g @tailwindcss/cli
# 初始化项目
tailwindcss init
# 构建 CSS
tailwindcss -i input.css -o output.css --watch
1.3.3 与构建工具集成
Vite 集成
# 安装依赖
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
vite.config.js
:
import { defineConfig } from 'vite'
export default defineConfig({
css: {
postcss: {
plugins: [
require('tailwindcss'),
require('autoprefixer'),
],
},
},
})
Webpack 集成
npm install -D tailwindcss postcss postcss-loader autoprefixer
webpack.config.js
:
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
require('tailwindcss'),
require('autoprefixer'),
],
},
},
},
],
},
],
},
}
1.4 开发环境搭建
1.4.1 VS Code 扩展
安装推荐的 VS Code 扩展:
Tailwind CSS IntelliSense
- 自动补全类名
- 悬停预览样式
- 语法高亮
PostCSS Language Support
- PostCSS 语法支持
Headwind
- 自动排序 Tailwind 类名
1.4.2 配置 IntelliSense
在 VS Code 设置中添加:
{
"tailwindCSS.includeLanguages": {
"html": "html",
"javascript": "javascript",
"css": "css"
},
"tailwindCSS.emmetCompletions": true,
"editor.quickSuggestions": {
"strings": true
}
}
1.4.3 Prettier 配置
安装 Prettier 插件:
npm install -D prettier prettier-plugin-tailwindcss
.prettierrc
:
{
"plugins": ["prettier-plugin-tailwindcss"]
}
1.5 第一个完整项目
让我们创建一个简单的登录页面来实践所学内容:
1.5.1 项目结构
my-tailwind-project/
├── src/
│ ├── input.css
│ └── images/
├── dist/
│ └── output.css
├── index.html
├── package.json
└── tailwind.config.js
1.5.2 登录页面实现
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录 - Tailwind CSS 示例</title>
<link href="./dist/output.css" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-blue-50 to-indigo-100 min-h-screen">
<div class="min-h-screen flex items-center justify-center py-12 px-4 sm:px-6 lg:px-8">
<div class="max-w-md w-full space-y-8">
<!-- 头部 -->
<div class="text-center">
<h2 class="mt-6 text-3xl font-extrabold text-gray-900">
登录您的账户
</h2>
<p class="mt-2 text-sm text-gray-600">
或者
<a href="#" class="font-medium text-indigo-600 hover:text-indigo-500 transition duration-200">
注册新账户
</a>
</p>
</div>
<!-- 表单 -->
<form class="mt-8 space-y-6" action="#" method="POST">
<div class="bg-white p-8 rounded-xl shadow-lg">
<div class="space-y-4">
<!-- 邮箱输入 -->
<div>
<label for="email" class="block text-sm font-medium text-gray-700 mb-2">
邮箱地址
</label>
<input
id="email"
name="email"
type="email"
required
class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 transition duration-200"
placeholder="请输入邮箱地址"
>
</div>
<!-- 密码输入 -->
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-2">
密码
</label>
<input
id="password"
name="password"
type="password"
required
class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 transition duration-200"
placeholder="请输入密码"
>
</div>
</div>
<!-- 记住我和忘记密码 -->
<div class="flex items-center justify-between mt-6">
<div class="flex items-center">
<input
id="remember-me"
name="remember-me"
type="checkbox"
class="h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded"
>
<label for="remember-me" class="ml-2 block text-sm text-gray-700">
记住我
</label>
</div>
<div class="text-sm">
<a href="#" class="font-medium text-indigo-600 hover:text-indigo-500 transition duration-200">
忘记密码?
</a>
</div>
</div>
<!-- 登录按钮 -->
<div class="mt-6">
<button
type="submit"
class="w-full flex justify-center py-3 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition duration-200 transform hover:scale-105"
>
登录
</button>
</div>
<!-- 社交登录 -->
<div class="mt-6">
<div class="relative">
<div class="absolute inset-0 flex items-center">
<div class="w-full border-t border-gray-300"></div>
</div>
<div class="relative flex justify-center text-sm">
<span class="px-2 bg-white text-gray-500">或者使用</span>
</div>
</div>
<div class="mt-6 grid grid-cols-2 gap-3">
<button
type="button"
class="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 transition duration-200"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" fill="#4285F4"/>
<path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/>
<path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/>
<path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/>
</svg>
<span class="ml-2">Google</span>
</button>
<button
type="button"
class="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 transition duration-200"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" fill="#1877F2"/>
</svg>
<span class="ml-2">Facebook</span>
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
1.6 常见问题与解决方案
1.6.1 样式不生效
问题: Tailwind 类名不生效
解决方案:
1. 检查 content
配置是否正确
2. 确认 CSS 文件已正确引入
3. 检查类名拼写是否正确
4. 重新构建 CSS 文件
1.6.2 文件过大
问题: 生成的 CSS 文件过大
解决方案: 1. 配置 PurgeCSS 移除未使用的样式 2. 使用生产环境构建 3. 启用压缩
# 生产环境构建
NODE_ENV=production npx tailwindcss -i ./src/input.css -o ./dist/output.css --minify
1.6.3 IDE 支持问题
问题: IDE 没有自动补全
解决方案:
1. 安装 Tailwind CSS IntelliSense 扩展
2. 配置 tailwind.config.js
路径
3. 重启 IDE
1.7 本章总结
在本章中,我们学习了:
- Tailwind CSS 的核心概念:原子化 CSS 框架的设计理念
- 安装和配置:多种安装方式和基本配置
- 开发环境搭建:IDE 扩展和工具配置
- 第一个项目:完整的登录页面实现
核心要点
- Tailwind CSS 是实用优先的 CSS 框架
- 通过原子化类名快速构建界面
- 高度可定制和可配置
- 优秀的开发体验和工具支持
下一步
在下一章中,我们将深入了解 Tailwind CSS 的核心概念和设计哲学,学习如何更好地运用原子化 CSS 的思维方式。
1.8 练习题
- 基础练习:使用 Tailwind CSS 创建一个简单的名片组件
- 进阶练习:实现一个响应式的导航栏
- 挑战练习:创建一个完整的注册页面,包含表单验证样式
练习提示
- 多使用 Flexbox 和 Grid 布局
- 注意响应式设计
- 合理使用颜色和间距系统
- 添加适当的交互效果