Tailwind CSS 深色模式

1. 深色模式基础

Tailwind通过 dark: 前缀来实现深色模式:

<!-- 浅色模式:浅色背景深色文字,深色模式:深色背景浅色文字 -->
<div class="bg-white text-gray-900 dark:bg-gray-900 dark:text-white">
  深色模式示例
</div>

2. 配置深色模式

在 tailwind.config.js 中配置深色模式策略:

// tailwind.config.js
module.exports = {
  darkMode: 'class', // 或 'media'
  // ...其他配置
}
两种策略对比:
策略 描述 使用场景
'media' 基于系统偏好 自动跟随系统设置
'class' 基于CSS类名 用户可手动切换

3. 基于系统偏好的深色模式(media)

// tailwind.config.js
module.exports = {
  darkMode: 'media', // 自动检测系统偏好
}
<!-- 自动跟随系统深色模式设置 -->
<body class="bg-white dark:bg-gray-900">
  <div class="text-gray-900 dark:text-white">
    <h1 class="text-2xl font-bold">标题</h1>
    <p>内容会根据系统设置自动切换深浅色</p>
  </div>
</body>

4. 基于类名的深色模式(class)

// tailwind.config.js
module.exports = {
  darkMode: 'class', // 手动控制深色模式
}
<!-- 通过添加/移除dark类来控制 -->
<body class="bg-white dark:bg-gray-900">
  <div class="text-gray-900 dark:text-white">
    <button onclick="document.documentElement.classList.toggle('dark')">
      切换深色模式
    </button>
  </div>
</body>

5. 完整的深色模式切换实现

HTML结构
<!DOCTYPE html>
<html lang="zh-CN" class="light">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>深色模式示例</title>
  <script>
    // 页面加载时检查存储的设置
    if (localStorage.theme === 'dark' || 
        (!('theme' in localStorage) && 
         window.matchMedia('(prefers-color-scheme: dark)').matches)) {
      document.documentElement.classList.add('dark')
    } else {
      document.documentElement.classList.remove('dark')
    }
  </script>
</head>
<body class="bg-white dark:bg-gray-900 transition-colors duration-300">
  <!-- 页面内容 -->
</body>
</html>
JavaScript切换逻辑
// 切换深色模式的函数
function toggleDarkMode() {
  const html = document.documentElement
  
  if (html.classList.contains('dark')) {
    html.classList.remove('dark')
    localStorage.theme = 'light'
  } else {
    html.classList.add('dark')
    localStorage.theme = 'dark'
  }
}

// 初始化检查
function initDarkMode() {
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)')
  const storedTheme = localStorage.theme
  
  if (storedTheme === 'dark' || (!storedTheme && prefersDark.matches)) {
    document.documentElement.classList.add('dark')
  }
}

// 监听系统偏好变化
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
  if (!localStorage.theme) {
    if (e.matches) {
      document.documentElement.classList.add('dark')
    } else {
      document.documentElement.classList.remove('dark')
    }
  }
})

6. 深色模式UI组件示例

导航栏
<body class="bg-white dark:bg-gray-900 transition-colors duration-300">
<nav class="bg-white dark:bg-gray-800 shadow-lg transition-colors duration-300">
  <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
    <div class="flex justify-between h-16">
      <div class="flex items-center">
        <h1 class="text-xl font-bold text-gray-900 dark:text-white">
          我的网站
        </h1>
      </div>
      
      <div class="flex items-center space-x-4">
        <!-- 深色模式切换按钮 -->
        <button onclick="toggleDarkMode()" class="
          p-2 
          rounded-full 
          bg-gray-200 
          dark:bg-gray-700 
          text-gray-800 
          dark:text-gray-200
          hover:bg-gray-300 
          dark:hover:bg-gray-600
          transition-colors 
          duration-200
        ">
          <svg class="w-5 h-5 dark:hidden" fill="currentColor" viewBox="0 0 20 20">
            <path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"/>
          </svg>
          <svg class="w-5 h-5 hidden dark:block" fill="currentColor" viewBox="0 0 20 20">
            <path fill-rule="evenodd" d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" clip-rule="evenodd"/>
          </svg>
        </button>
      </div>
    </div>
  </div>
</nav>
</body>

卡片组件
<div class="max-w-md mx-auto mt-8">
  <div class="bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 transition-colors duration-300">
    <h2 class="text-xl font-semibold text-gray-900 dark:text-white mb-4">
      卡片标题
    </h2>
    <p class="text-gray-600 dark:text-gray-300 mb-4">
      这是一个支持深色模式的卡片组件。在深色模式下,背景和文字颜色会自动调整以确保可读性。
    </p>
    <div class="flex space-x-4">
      <button class="
        bg-blue-500 
        hover:bg-blue-600 
        dark:bg-blue-600 
        dark:hover:bg-blue-700 
        text-white 
        px-4 
        py-2 
        rounded 
        transition-colors 
        duration-200
      ">
        主要按钮
      </button>
      <button class="
        bg-gray-200 
        hover:bg-gray-300 
        dark:bg-gray-700 
        dark:hover:bg-gray-600 
        text-gray-800 
        dark:text-gray-200 
        px-4 
        py-2 
        rounded 
        transition-colors 
        duration-200
      ">
        次要按钮
      </button>
    </div>
  </div>
</div>
表单组件
<div class="max-w-md mx-auto mt-8 p-6">
  <form class="space-y-4">
    <div>
      <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
        用户名
      </label>
      <input type="text" class="
        w-full 
        px-3 
        py-2 
        border 
        border-gray-300 
        dark:border-gray-600 
        rounded 
        bg-white 
        dark:bg-gray-700 
        text-gray-900 
        dark:text-white
        placeholder-gray-500 
        dark:placeholder-gray-400
        focus:outline-none 
        focus:ring-2 
        focus:ring-blue-500 
        focus:border-transparent
      " placeholder="请输入用户名">
    </div>
    
    <div>
      <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
        密码
      </label>
      <input type="password" class="
        w-full 
        px-3 
        py-2 
        border 
        border-gray-300 
        dark:border-gray-600 
        rounded 
        bg-white 
        dark:bg-gray-700 
        text-gray-900 
        dark:text-white
        placeholder-gray-500 
        dark:placeholder-gray-400
        focus:outline-none 
        focus:ring-2 
        focus:ring-blue-500 
        focus:border-transparent
      " placeholder="请输入密码">
    </div>
  </form>
</div>

7. 深色模式颜色调色板

Tailwind提供了专门的深色模式颜色:

/* 文本颜色 */
dark:text-gray-100    /* 最浅 */
dark:text-gray-200
dark:text-gray-300
dark:text-gray-400    /* 默认正文 */
dark:text-gray-500    /* 次要文本 */

/* 背景颜色 */
dark:bg-gray-900      /* 最深背景 */
dark:bg-gray-800      /* 卡片背景 */
dark:bg-gray-700      /* 输入框背景 */
dark:bg-gray-600      /* 悬停状态 */

/* 边框颜色 */
dark:border-gray-700
dark:border-gray-600
dark:border-gray-500

8. 最佳实践

  1. 一致性:确保所有组件都支持深色模式
  2. 过渡动画:添加平滑的颜色过渡效果
  3. 可访问性:确保深色模式下的对比度足够
  4. 用户偏好:尊重用户的系统设置和手动选择
  5. 图标适配:为深浅模式提供不同的图标

9. 自定义深色模式样式

// tailwind.config.js
module.exports = {
  darkMode: 'class',
  theme: {
    extend: {
      colors: {
        // 自定义深色模式颜色
        dark: {
          primary: '#1a202c',
          secondary: '#2d3748',
          accent: '#4a5568'
        }
      }
    }
  }
}

<!-- 使用自定义深色模式颜色 -->
<div class="bg-white dark:bg-dark-primary">
  使用自定义深色模式颜色
</div>

Tailwind CSS的深色模式功能让创建支持深浅主题的现代Web应用变得非常简单,同时确保了良好的用户体验和可访问性。

Tailwind CSS 重用样式

1. 组件化方法(推荐)

使用 @apply 指令
/* 在CSS文件中定义可重用组件 */
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer components {
  .btn-primary {
    @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded transition-colors duration-200;
  }
  
  .btn-secondary {
    @apply bg-gray-500 hover:bg-gray-700 text-white font-bold py-2 px-4 rounded transition-colors duration-200;
  }
  
  .card {
    @apply bg-white rounded-lg shadow-md p-6 border border-gray-200;
  }
  
  .input-field {
    @apply w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent;
  }
}
HTML中使用
<button class="btn-primary">主要按钮</button>
<button class="btn-secondary">次要按钮</button>

<div class="card">
  <h3 class="text-lg font-semibold">卡片标题</h3>
  <p>卡片内容...</p>
</div>

<input type="text" class="input-field" placeholder="输入内容">

2. 使用JavaScript/模板字面量

在JavaScript中定义样式组
// styles.js
export const buttonStyles = {
  primary: 'bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded',
  secondary: 'bg-gray-500 hover:bg-gray-700 text-white font-bold py-2 px-4 rounded',
  small: 'py-1 px-2 text-sm',
  large: 'py-3 px-6 text-lg'
};

export const cardStyles = {
  base: 'bg-white rounded-lg shadow-md p-6',
  bordered: 'border border-gray-200',
  elevated: 'shadow-lg'
};

// 组合使用函数
export const getButtonClass = (variant = 'primary', size = 'base') => {
  const base = buttonStyles[variant] || buttonStyles.primary;
  const sizeClass = buttonStyles[size] || '';
  return `${base} ${sizeClass}`.trim();
};
在html中使用
<!DOCTYPE html>
<html lang="zh-CN"
    class="light">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0">
    <title>Tailwind CSS v4 示例</title>
    <link href="../../dist/output.css"
        rel="stylesheet">
</head>

<body class="bg-gray-200 dark:bg-gray-900 transition-colors duration-300 p-8">
    <h1 class="text-2xl font-bold mb-6">Tailwind CSS v4 样式示例</h1>

    <!-- 使用 styles.js 中定义的按钮样式 -->
    <div class="mb-6">
        <h2 class="text-xl font-semibold mb-4">按钮样式</h2>
        <div class="flex flex-wrap gap-4 mb-4">
            <button id="primary-btn">主要按钮</button>
            <button id="secondary-btn">次要按钮</button>
            <button id="small-btn">小按钮</button>
            <button id="large-btn">大按钮</button>
        </div>
    </div>

    <!-- 使用 styles.js 中定义的卡片样式 -->
    <div class="mb-6">
        <h2 class="text-xl font-semibold mb-4">卡片样式</h2>
        <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
            <div id="base-card">
                <h3 class="font-medium mb-2">基础卡片</h3>
                <p class="text-gray-600">这是一个基础卡片样式</p>
            </div>
            <div id="bordered-card">
                <h3 class="font-medium mb-2">边框卡片</h3>
                <p class="text-gray-600">这是一个带边框的卡片样式</p>
            </div>
            <div id="elevated-card">
                <h3 class="font-medium mb-2">阴影卡片</h3>
                <p class="text-gray-600">这是一个带阴影的卡片样式</p>
            </div>
        </div>
    </div>

    <!-- 输入框示例 -->
    <div class="mb-6">
        <h2 class="text-xl font-semibold mb-4">输入框示例</h2>
        <input type="text" id="input-field" placeholder="输入内容" class="w-full p-2 border rounded">
    </div>

    <script type="module">
        // 导入样式模块
        import { buttonStyles, cardStyles, getButtonClass } from '../styles.js';

        // 使用 styles.js 中定义的按钮样式
        document.getElementById('primary-btn').className = getButtonClass('primary');
        document.getElementById('secondary-btn').className = getButtonClass('secondary');
        document.getElementById('small-btn').className = getButtonClass('primary', 'small');
        document.getElementById('large-btn').className = getButtonClass('primary', 'large');

        // 使用 styles.js 中定义的卡片样式
        document.getElementById('base-card').className = cardStyles.base;
        document.getElementById('bordered-card').className = `${cardStyles.base} ${cardStyles.bordered}`;
        document.getElementById('elevated-card').className = `${cardStyles.base} ${cardStyles.elevated}`;

        // 为输入框添加样式
        document.getElementById('input-field').className += ' focus:outline-none focus:ring-2 focus:ring-blue-500';

        // 控制台输出样式信息
        console.log('按钮样式:', buttonStyles);
        console.log('卡片样式:', cardStyles);
    </script>
</body>

</html>

3. 使用CSS自定义属性(CSS变量)

定义CSS变量
:root {
  --primary-color: #3b82f6;
  --secondary-color: #6b7280;
  --border-radius: 0.375rem;
}

.btn-base {
  @apply font-bold py-2 px-4 rounded transition-colors duration-200;
}

.btn-primary {
  @apply btn-base;
  background-color: var(--primary-color);
  color: white;
}

.btn-primary:hover {
  background-color: #2563eb;
}

4. 实用工具类组合

创建实用的组合类
@layer utilities {
  .flex-center {
    @apply flex items-center justify-center;
  }
  
  .text-gradient {
    @apply bg-gradient-to-r from-blue-500 to-purple-600 bg-clip-text text-transparent;
  }
  
  .shadow-hover {
    @apply shadow-md hover:shadow-lg transition-shadow duration-300;
  }
  
  .border-gradient {
    @apply border-2 border-transparent bg-gradient-to-r from-blue-500 to-purple-500 bg-origin-border;
  }
}

5. 模板部分和片段

创建可重用的HTML片段
<!-- components/buttons.html -->
<button class="btn-primary {{ additionalClasses }}">
  {{ buttonText }}
</button>

<!-- components/cards.html -->
<div class="card {{ variant }}">
  <div class="card-header">
    <h3 class="card-title">{{ title }}</h3>
  </div>
  <div class="card-body">
    {{ content }}
  </div>
</div>

6. 配置Tailwind主题扩展

在tailwind.config.js中扩展
// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      // 添加自定义间距
      spacing: {
        '18': '4.5rem',
        '88': '22rem',
      },
      // 添加自定义颜色
      colors: {
        'brand': {
          50: '#f0f9ff',
          100: '#e0f2fe',
          500: '#0ea5e9',
          900: '#0c4a6e',
        }
      },
      // 添加自定义动画
      animation: {
        'bounce-slow': 'bounce 2s infinite',
        'pulse-fast': 'pulse 1s cubic-bezier(0.4, 0, 0.6, 1) infinite',
      }
    }
  }
}

7. 实际项目中的样式重用示例

完整的样式系统示例
/* styles/components.css */
@layer components {
  /* 按钮系统 */
  .btn {
    @apply inline-flex items-center justify-center font-medium rounded-md transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2;
  }
  
  .btn-primary {
    @apply btn bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500;
  }
  
  .btn-secondary {
    @apply btn bg-gray-100 text-gray-700 hover:bg-gray-200 focus:ring-gray-500;
  }
  
  .btn-sm {
    @apply px-3 py-1.5 text-sm;
  }
  
  .btn-md {
    @apply px-4 py-2 text-base;
  }
  
  .btn-lg {
    @apply px-6 py-3 text-lg;
  }

  /* 卡片系统 */
  .card {
    @apply bg-white rounded-lg shadow-sm border border-gray-200;
  }
  
  .card-header {
    @apply px-6 py-4 border-b border-gray-200;
  }
  
  .card-body {
    @apply px-6 py-4;
  }
  
  .card-footer {
    @apply px-6 py-4 border-t border-gray-200 bg-gray-50;
  }

  /* 表单系统 */
  .form-input {
    @apply block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500;
  }
  
  .form-label {
    @apply block text-sm font-medium text-gray-700 mb-1;
  }
  
  .form-error {
    @apply mt-1 text-sm text-red-600;
  }
}
在项目中使用
<!DOCTYPE html>
<html>
<head>
  <link href="/dist/styles.css" rel="stylesheet">
</head>
<body>
  <!-- 按钮使用 -->
  <button class="btn-primary btn-md">中等主要按钮</button>
  <button class="btn-secondary btn-sm">小号次要按钮</button>
  
  <!-- 卡片使用 -->
  <div class="card">
    <div class="card-header">
      <h3 class="text-lg font-semibold">卡片标题</h3>
    </div>
    <div class="card-body">
      <p>卡片内容...</p>
      <input type="text" class="form-input mt-3" placeholder="输入内容">
    </div>
    <div class="card-footer">
      <button class="btn-primary btn-sm">保存</button>
    </div>
  </div>
</body>
</html>

8. 高级重用技巧

使用CSS Grid模板
@layer components {
  .grid-cards {
    @apply grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6;
  }
  
  .grid-features {
    @apply grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8;
  }
}
响应式工具类组合
@layer utilities {
  .responsive-text {
    @apply text-base sm:text-lg md:text-xl lg:text-2xl;
  }
  
  .responsive-padding {
    @apply p-4 sm:p-6 md:p-8 lg:p-12;
  }
  
  .responsive-grid {
    @apply grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4;
  }
}

9. 最佳实践建议

  1. 保持一致性:在整个项目中保持相同的命名约定
  2. 适度抽象:不要过度抽象,保持一定的灵活性
  3. 文档化:为可重用的样式组件编写文档
  4. 性能考虑:避免创建过多不必要的CSS类
  5. 维护性:定期审查和重构样式系统

Tailwind CSS 自定义样式

1. 配置文件自定义(tailwind.config.js)

这是最核心的自定义方式,通过修改配置文件来扩展Tailwind的功能。

基础配置文件结构
// tailwind.config.js
module.exports = {
  content: ['./src/**/*.{html,js}'],
  theme: {
    extend: {
      // 在这里添加自定义配置
    },
  },
  plugins: [],
}

2. 颜色自定义

扩展颜色系统
// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        // 自定义品牌色
        'brand': {
          50: '#f0f9ff',
          100: '#e0f2fe',
          200: '#bae6fd',
          300: '#7dd3fc',
          400: '#38bdf8',
          500: '#0ea5e9',
          600: '#0284c7',
          700: '#0369a1',
          800: '#075985',
          900: '#0c4a6e',
        },
        // 单一颜色
        'primary': '#3b82f6',
        'secondary': '#6b7280',
        // 使用CSS变量
        'theme': {
          primary: 'var(--color-primary)',
          secondary: 'var(--color-secondary)',
        }
      }
    }
  }
}
使用自定义颜色
<div class="bg-brand-500 text-white p-4">
  品牌颜色示例
</div>

<button class="bg-primary hover:bg-primary-600 text-white">
  主要按钮
</button>

3. 字体和文本自定义

字体家族扩展
theme: {
  extend: {
    fontFamily: {
      // 添加自定义字体
      'custom': ['Custom Font', 'sans-serif'],
      'display': ['Oswald', 'sans-serif'],
      'body': ['Open Sans', 'sans-serif'],
    },
    // 字体大小扩展
    fontSize: {
      '2xs': '0.625rem',    // 10px
      '3xl': '1.75rem',     // 28px
      '4xl': '2.25rem',     // 36px
      '5xl': '3rem',        // 48px
    },
    // 行高扩展
    lineHeight: {
      'tight': '1.2',
      'relaxed': '1.75',
    }
  }
}
字体使用示例
<h1 class="font-display text-4xl leading-tight">
  自定义字体标题
</h1>

<p class="font-body text-lg leading-relaxed">
  使用自定义字体和行高的段落文本。
</p>

4. 间距和尺寸自定义

间距扩展
theme: {
  extend: {
    spacing: {
      // 自定义间距
      '13': '3.25rem',      // 52px
      '18': '4.5rem',       // 72px
      '88': '22rem',        // 352px
      '128': '32rem',       // 512px
      // 百分比
      '1/10': '10%',
      '9/10': '90%',
    },
    // 尺寸扩展
    maxWidth: {
      '8xl': '88rem',
      '9xl': '96rem',
    },
    height: {
      'screen-90': '90vh',
      'screen-80': '80vh',
    }
  }
}
间距使用示例
<div class="p-18 m-1/10 w-88 h-screen-90">
  自定义间距和尺寸
</div>

5. 断点自定义

自定义响应式断点
theme: {
  screens: {
    'sm': '640px',
    'md': '768px',
    'lg': '1024px',
    'xl': '1280px',
    '2xl': '1536px',
    // 自定义断点
    '3xl': '1920px',
    'mobile': {'max': '767px'},
    'tablet': {'min': '768px', 'max': '1023px'},
    'desktop': {'min': '1024px'},
  }
}
自定义断点使用
<div class="
  bg-red-500 
  mobile:bg-blue-500 
  tablet:bg-green-500 
  desktop:bg-purple-500
">
  响应式背景色
</div>

6. 动画和过渡自定义

自定义动画
theme: {
  extend: {
    animation: {
      // 自定义动画
      'bounce-slow': 'bounce 2s infinite',
      'spin-slow': 'spin 3s linear infinite',
      'pulse-fast': 'pulse 0.5s cubic-bezier(0.4, 0, 0.6, 1) infinite',
      'fade-in': 'fadeIn 0.5s ease-in-out',
      'slide-in': 'slideIn 0.3s ease-out',
    },
    keyframes: {
      fadeIn: {
        '0%': { opacity: '0' },
        '100%': { opacity: '1' },
      },
      slideIn: {
        '0%': { transform: 'translateX(-100%)' },
        '100%': { transform: 'translateX(0)' },
      }
    },
    // 过渡时间扩展
    transitionDuration: {
      '2000': '2000ms',
      '3000': '3000ms',
    }
  }
}
动画使用示例
<div class="animate-fade-in hover:animate-bounce-slow">
  自定义动画效果
</div>

<button class="transition-all duration-2000 hover:scale-110">
  缓慢过渡效果
</button>

7. 阴影和边框自定义

阴影扩展
theme: {
  extend: {
    boxShadow: {
      // 自定义阴影
      'soft': '0 2px 15px -3px rgba(0, 0, 0, 0.07), 0 10px 20px -2px rgba(0, 0, 0, 0.04)',
      'hard': '0 0 0 3px rgba(66, 153, 225, 0.5)',
      'glow': '0 0 20px rgba(59, 130, 246, 0.5)',
    },
    // 边框扩展
    borderWidth: {
      '3': '3px',
      '6': '6px',
    },
    borderRadius: {
      '4xl': '2rem',
      '5xl': '2.5rem',
    }
  }
}
阴影使用示例
<div class="shadow-soft border-3 border-blue-500 rounded-4xl">
  自定义阴影和边框
</div>

<button class="shadow-glow hover:shadow-hard">
  发光效果按钮
</button>

8. 插件系统自定义

创建自定义插件
// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addUtilities, addComponents, e, prefix, config }) {
      // 添加自定义工具类
      const newUtilities = {
        '.text-shadow': {
          textShadow: '2px 2px 4px rgba(0, 0, 0, 0.5)',
        },
        '.text-shadow-lg': {
          textShadow: '4px 4px 8px rgba(0, 0, 0, 0.5)',
        },
        '.backdrop-blur-xs': {
          backdropFilter: 'blur(2px)',
        }
      }
      
      addUtilities(newUtilities, ['responsive', 'hover'])
      
      // 添加自定义组件
      const buttons = {
        '.btn-custom': {
          padding: '.5rem 1rem',
          borderRadius: '.25rem',
          fontWeight: '600',
        },
        '.btn-custom-blue': {
          backgroundColor: '#3490dc',
          color: '#fff',
          '&:hover': {
            backgroundColor: '#2779bd'
          },
        },
      }
      
      addComponents(buttons)
    })
  ]
}
插件使用示例
<h1 class="text-shadow-lg">自定义文字阴影</h1>
<div class="backdrop-blur-xs bg-white/50">毛玻璃效果</div>
<button class="btn-custom btn-custom-blue">自定义按钮</button>

9. CSS变量集成

使用CSS变量实现主题切换
/* 在CSS文件中定义变量 */
:root {
  --primary-color: #3b82f6;
  --secondary-color: #6b7280;
  --border-radius: 0.375rem;
  --spacing-unit: 1rem;
}

/* 在Tailwind配置中使用 */
theme: {
  extend: {
    colors: {
      primary: 'var(--primary-color)',
      secondary: 'var(--secondary-color)',
    },
    borderRadius: {
      DEFAULT: 'var(--border-radius)',
    },
    spacing: {
      unit: 'var(--spacing-unit)',
    }
  }
}

10. 实际完整示例

完整的自定义配置示例
// tailwind.config.js
module.exports = {
  content: ['./src/**/*.{html,js}'],
  theme: {
    extend: {
      // 颜色系统
      colors: {
        brand: {
          50: '#f0f9ff',
          500: '#0ea5e9',
          900: '#0c4a6e',
        }
      },
      // 字体系统
      fontFamily: {
        sans: ['Inter', 'system-ui', 'sans-serif'],
        mono: ['Fira Code', 'monospace'],
      },
      // 间距系统
      spacing: {
        '18': '4.5rem',
        '72': '18rem',
        '84': '21rem',
        '96': '24rem',
      },
      // 动画系统
      animation: {
        'fade-in-up': 'fadeInUp 0.5s ease-out',
      },
      keyframes: {
        fadeInUp: {
          '0%': { opacity: '0', transform: 'translateY(30px)' },
          '100%': { opacity: '1', transform: 'translateY(0)' },
        }
      }
    },
  },
  plugins: [
    require('@tailwindcss/forms'),
    require('@tailwindcss/typography'),
  ],
}
使用自定义样式的HTML示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>自定义样式示例</title>
  <style>
    @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
  </style>
</head>
<body class="font-sans bg-gray-50">
  <div class="max-w-4xl mx-auto p-6">
    <!-- 使用自定义动画 -->
    <div class="animate-fade-in-up bg-brand-500 text-white p-8 rounded-lg shadow-lg">
      <h1 class="text-3xl font-bold mb-4">自定义样式演示</h1>
      <p class="text-lg opacity-90">使用自定义颜色、字体和动画效果。</p>
    </div>
    
    <!-- 使用自定义间距 -->
    <div class="mt-18 p-6 bg-white rounded-lg">
      <h2 class="text-2xl font-semibold mb-4">自定义间距</h2>
      <div class="space-y-4">
        <div class="p-4 bg-gray-100 rounded">内容块1</div>
        <div class="p-4 bg-gray-100 rounded">内容块2</div>
      </div>
    </div>
  </div>
</body>
</html>

11. 最佳实践建议

  1. 渐进式扩展:优先使用 extend 而不是覆盖默认配置
  2. 语义化命名:使用有意义的名称,如 brand-500 而不是 blue-500
  3. 保持一致性:建立设计系统,确保自定义样式的一致性
  4. 文档化:为自定义配置添加注释说明
  5. 性能考虑:避免创建过多不必要的自定义类

Tailwind CSS 指令与函数

1. @tailwind 指令(基础指令)

这是Tailwind最核心的指令,用于引入基础样式、组件和工具类。

/* 在CSS文件开头使用 */
@tailwind base;        /* 引入基础样式 */
@tailwind components;  /* 引入组件样式 */
@tailwind utilities;   /* 引入工具类样式 */
完整示例
/* input.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

/* 自定义样式 */
.my-custom-class {
  @apply bg-blue-500 text-white;
}

2. @apply 指令(样式组合)

@apply 是使用最频繁的指令,用于将多个Tailwind类组合成一个自定义类。

基础用法
.btn {
  @apply px-4 py-2 rounded font-semibold;
}

复杂组合示例
.card {
  @apply bg-white rounded-lg shadow-md p-6 border border-gray-200;
  @apply transition-all duration-300 ease-in-out;
  @apply hover:shadow-lg hover:scale-105;
}

.form-input {
  @apply w-full px-3 py-2 border border-gray-300 rounded-md;
  @apply focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500;
  @apply disabled:bg-gray-100 disabled:cursor-not-allowed;
}
响应式@apply
.responsive-card {
  @apply w-full;
  @apply sm:w-1/2 md:w-1/3 lg:w-1/4;
  @apply p-4 sm:p-6 md:p-8;
}

3. @layer 指令(层级管理)

@layer 指令用于将样式组织到不同的层级中,控制CSS的加载顺序。

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

@layer base {
  /* 基础样式 - 最先加载 */
  html {
    @apply scroll-smooth;
  }
  
  body {
    @apply font-sans antialiased;
  }
  
  h1, h2, h3, h4, h5, h6 {
    @apply font-bold text-gray-900;
  }
}

@layer components {
  /* 组件样式 - 中间加载 */
  .btn {
    @apply px-4 py-2 rounded font-medium transition-colors;
  }
  
  .card {
    @apply bg-white rounded-lg shadow p-6;
  }
}

@layer utilities {
  /* 工具类样式 - 最后加载 */
  .text-shadow {
    text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
  }
  
  .backdrop-blur-xs {
    backdrop-filter: blur(2px);
  }
}

4. @variants 指令(变体生成)

@variants 用于为自定义类生成响应式、状态等变体。

@layer components {
  /* 为.btn生成hover、focus、active变体 */
  @variants hover, focus, active {
    .btn-primary {
      @apply bg-blue-500 text-white;
    }
  }
  
  /* 为自定义工具类生成响应式变体 */
  @variants responsive {
    .text-shadow {
      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
    }
  }
}

5. theme() 函数(配置访问)

theme() 函数用于访问Tailwind配置中的值。

基础用法
.custom-element {
  /* 访问配置中的颜色 */
  color: theme('colors.blue.500');
  background-color: theme('colors.gray.100');
  
  /* 访问配置中的间距 */
  padding: theme('spacing.4');
  margin: theme('spacing.2');
  
  /* 访问配置中的断点 */
  @media (min-width: theme('screens.lg')) {
    width: 50%;
  }
}
实际应用示例
:root {
  /* 使用theme()函数定义CSS变量 */
  --primary-color: theme('colors.blue.500');
  --spacing-unit: theme('spacing.4');
  --border-radius: theme('borderRadius.DEFAULT');
}

.themed-component {
  background-color: var(--primary-color);
  padding: calc(var(--spacing-unit) * 2);
  border-radius: var(--border-radius);
}

.responsive-theme {
  /* 响应式theme()使用 */
  font-size: theme('fontSize.sm');
  
  @media (min-width: theme('screens.md')) {
    font-size: theme('fontSize.lg');
  }
}

6. screen() 函数(媒体查询)

screen() 函数是 theme('screens.xxx') 的快捷方式,用于创建媒体查询。

/* 使用screen()函数创建响应式样式 */
@media screen(sm) {
  .responsive-element {
    @apply text-lg;
  }
}

@media screen(md) {
  .responsive-element {
    @apply text-xl;
  }
}

/* 等价于 */
@media (min-width: theme('screens.sm')) {
  .responsive-element {
    font-size: theme('fontSize.lg');
  }
}

7. 配置函数(tailwind.config.js)

在配置文件中使用的各种函数。

配置颜色函数
// tailwind.config.js
const colors = require('tailwindcss/colors')

module.exports = {
  theme: {
    extend: {
      colors: {
        // 使用Tailwind颜色函数
        primary: colors.blue,
        secondary: colors.gray,
        // 自定义颜色函数
        brand: ({ opacityValue }) => {
          if (opacityValue !== undefined) {
            return `rgba(14, 165, 233, ${opacityValue})`
          }
          return 'rgb(14, 165, 233)'
        }
      }
    }
  }
}

8. 最佳实践

  1. 合理使用@layer:保持样式组织有序
  2. 避免过度使用@apply:只在确实需要重用时使用
  3. 利用theme()函数:保持与配置的一致性
  4. 使用@variants:为自定义类生成必要的变体
  5. 性能优化:避免创建过多的小型自定义类

Tailwind CSS 布局类

1. 容器类 (Container)

容器类用于创建响应式的居中容器。

<!-- 基础容器 -->
<div class="container mx-auto">
  <!-- 内容会自动在较大屏幕上居中 -->
</div>

<!-- 带内边距的容器 -->
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
  <!-- 响应式内边距 -->
</div>

<!-- 完整示例 -->
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-8">
  <h1>页面标题</h1>
  <p>页面内容...</p>
</div>

2. 盒模型类 (Box Sizing)

<!-- 默认:border-box (推荐) -->
<div class="box-border">
  <!-- 边框和内边距包含在宽度内 -->
</div>

<!-- 传统盒模型 -->
<div class="box-content">
  <!-- 边框和内边距在宽度外 -->
</div>

3. 显示类 (Display)

控制元素的显示方式。

<!-- 块级元素 -->
<div class="block">块级显示</div>

<!-- 内联元素 -->
<span class="inline">内联显示</span>

<!-- 内联块级元素 -->
<div class="inline-block">内联块级</div>

<!-- Flex布局 -->
<div class="flex">Flex容器</div>

<!-- Grid布局 -->
<div class="grid">Grid容器</div>

<!-- 隐藏元素 -->
<div class="hidden">隐藏元素</div>

<!-- 响应式显示控制 -->
<div class="block md:hidden lg:block">
  <!-- 移动端显示,平板隐藏,桌面显示 -->
</div>

4. 浮动类 (Float)

<!-- 左浮动 -->
<div class="float-left">左浮动</div>

<!-- 右浮动 -->
<div class="float-right">右浮动</div>

<!-- 清除浮动 -->
<div class="clear-left">清除左浮动</div>
<div class="clear-right">清除右浮动</div>
<div class="clear-both">清除两侧浮动</div>

5. 清除浮动类 (Clear)

<div class="float-left">左浮动元素</div>
<div class="float-right">右浮动元素</div>
<div class="clear-both"><!-- 清除浮动 --></div>

6. 对象适配类 (Object Fit)

控制替换元素(如图片)的适配方式。

<!-- 容器 -->
<div class="w-48 h-48">
  <!-- 填充整个容器,可能变形 -->
  <img src="image.jpg" class="w-full h-full object-fill" alt="填充">
  
  <!-- 保持比例,填充容器,可能裁剪 -->
  <img src="image.jpg" class="w-full h-full object-cover" alt="覆盖">
  
  <!-- 保持比例,完整显示在容器内 -->
  <img src="image.jpg" class="w-full h-full object-contain" alt="包含">
  
  <!-- 无缩放 -->
  <img src="image.jpg" class="w-full h-full object-none" alt="无缩放">
  
  <!-- 向下缩放 -->
  <img src="image.jpg" class="w-full h-full object-scale-down" alt="向下缩放">
</div>

7. 对象位置类 (Object Position)

控制替换元素在容器中的位置。

<div class="w-48 h-48">
  <img src="image.jpg" class="w-full h-full object-cover object-center" alt="居中">
  <img src="image.jpg" class="w-full h-full object-cover object-top" alt="顶部">
  <img src="image.jpg" class="w-full h-full object-cover object-bottom" alt="底部">
  <img src="image.jpg" class="w-full h-full object-cover object-left" alt="左侧">
  <img src="image.jpg" class="w-full h-full object-cover object-right" alt="右侧">
</div>

8. 溢出类 (Overflow)

控制内容溢出的处理方式。

<!-- 自动滚动 -->
<div class="overflow-auto h-32">
  <!-- 内容过长时显示滚动条 -->
</div>

<!-- 隐藏溢出 -->
<div class="overflow-hidden h-32">
  <!-- 隐藏超出内容 -->
</div>

<!-- 显示滚动条 -->
<div class="overflow-scroll h-32">
  <!-- 始终显示滚动条 -->
</div>

<!-- 可见溢出 -->
<div class="overflow-visible h-32">
  <!-- 内容可以溢出容器 -->
</div>

<!-- 分别控制水平和垂直方向 -->
<div class="overflow-x-auto overflow-y-hidden">
  <!-- 水平滚动,垂直隐藏 -->
</div>

9. 定位类 (Position)

控制元素的定位方式。

<!-- 静态定位(默认) -->
<div class="static">静态定位</div>

<!-- 相对定位 -->
<div class="relative">相对定位</div>

<!-- 绝对定位 -->
<div class="absolute">绝对定位</div>

<!-- 固定定位 -->
<div class="fixed">固定定位</div>

<!-- 粘性定位 -->
<div class="sticky top-0">粘性定位</div>

10. 顶部/右侧/底部/左侧类 (Top/Right/Bottom/Left)

控制定位元素的位置。

<!-- 相对定位示例 -->
<div class="relative h-32 bg-gray-200">
  <div class="absolute top-0 left-0 bg-red-500 p-2">左上角</div>
  <div class="absolute top-0 right-0 bg-blue-500 p-2">右上角</div>
  <div class="absolute bottom-0 left-0 bg-green-500 p-2">左下角</div>
  <div class="absolute bottom-0 right-0 bg-yellow-500 p-2">右下角</div>
  <div class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-purple-500 p-2">居中</div>
</div>

<!-- 固定定位导航栏 -->
<nav class="fixed top-0 left-0 right-0 bg-white shadow-lg z-50">
  <!-- 固定在顶部的导航栏 -->
</nav>

<!-- 粘性定位侧边栏 -->
<aside class="sticky top-4 h-screen">
  <!-- 滚动时保持可见的侧边栏 -->
</aside>

11. 可见性类 (Visibility)

<!-- 可见 -->
<div class="visible">可见元素</div>

<!-- 不可见(仍占空间) -->
<div class="invisible">不可见元素</div>

<!-- 响应式可见性 -->
<div class="invisible md:visible">
  <!-- 移动端隐藏,桌面端可见 -->
</div>

12. Z-index类

控制元素的堆叠顺序。

    <style>
        .stack-demo {
            position: absolute;
            width: 200px;
            height: 100px;
            padding: 10px;
            color: white;
            font-weight: bold;
        }
    </style>


<body class="min-h-screen">
    <!-- 基础z-index -->
    <div class="stack-demo z-0 bg-blue-500"
        style="left: 20px; top: 20px;">z-0 底层</div>
    <div class="stack-demo z-10 bg-green-500"
        style="left: 40px; top: 40px;">z-10 中层</div>
    <div class="stack-demo z-20 bg-yellow-500"
        style="left: 60px; top: 60px;">z-20 上层</div>
    <div class="stack-demo z-30 bg-red-500"
        style="left: 80px; top: 80px;">z-30 顶层</div>
    <div class="stack-demo z-40 bg-purple-500"
        style="left: 100px; top: 100px;">z-40 最顶层</div>
    <div class="stack-demo z-50 bg-indigo-500 "
        style="left: 120px; top: 120px;">z-50 模态层</div>

    <!-- 自动z-index -->
    <div class="stack-demo z-auto bg-gray-800"
        style="left: 140px; top: 140px;">z-auto 自动堆叠</div>

</body>

13. 实际布局示例

完整的页面布局结构
<!DOCTYPE html>
<html lang="zh-CN" class="h-full">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>布局类示例</title>
</head>
<body class="h-full bg-gray-100">
  <!-- 固定导航栏 -->
  <nav class="fixed top-0 left-0 right-0 bg-white shadow-lg z-50">
    <div class="container mx-auto px-4">
      <div class="flex justify-between items-center h-16">
        <div class="text-xl font-bold">我的网站</div>
        <div class="hidden md:flex space-x-4">
          <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">菜单</button>
      </div>
    </div>
  </nav>

  <!-- 主要内容区域 -->
  <main class="pt-16 min-h-screen">
    <div class="container mx-auto px-4 py-8">
      <!-- 网格布局 -->
      <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
        <!-- 主内容区 -->
        <div class="md:col-span-2">
          <div class="bg-white rounded-lg shadow p-6">
            <h1 class="text-3xl font-bold mb-4">主标题</h1>
            
            <!-- Flex布局示例 -->
            <div class="flex flex-wrap gap-4 mb-6">
              <div class="flex-1 min-w-[200px] bg-gray-100 p-4 rounded">Flex项目1</div>
              <div class="flex-1 min-w-[200px] bg-gray-100 p-4 rounded">Flex项目2</div>
              <div class="flex-1 min-w-[200px] bg-gray-100 p-4 rounded">Flex项目3</div>
            </div>
            
            <!-- 溢出处理示例 -->
            <div class="overflow-hidden h-32 bg-gray-50 p-4 rounded mb-6">
              <p>这是一个溢出处理示例。当内容超过容器高度时,可以使用overflow类来控制显示方式。</p>
              <p>更多内容...</p>
              <p>更多内容...</p>
              <p>更多内容...</p>
            </div>
          </div>
        </div>
        
        <!-- 侧边栏 -->
        <div class="md:col-span-1">
          <!-- 粘性定位侧边栏 -->
          <div class="sticky top-24">
            <div class="bg-white rounded-lg shadow p-6 mb-6">
              <h3 class="text-lg font-semibold mb-4">侧边栏标题</h3>
              <ul class="space-y-2">
                <li><a href="#" class="text-blue-500 hover:underline">链接1</a></li>
                <li><a href="#" class="text-blue-500 hover:underline">链接2</a></li>
                <li><a href="#" class="text-blue-500 hover:underline">链接3</a></li>
              </ul>
            </div>
            
            <!-- 图片适配示例 -->
            <div class="bg-white rounded-lg shadow overflow-hidden">
              <div class="h-48 w-full">
                <img src="image.jpg" 
                     class="w-full h-full object-cover" 
                     alt="示例图片">
              </div>
              <div class="p-4">
                <p>图片适配示例</p>
              </div>
            </div>
          </div>
        </div>
      </div>
      
      <!-- 浮动布局示例 -->
      <div class="mt-8 bg-white rounded-lg shadow p-6">
        <h3 class="text-xl font-semibold mb-4">浮动布局</h3>
        <div class="relative h-40 bg-gray-100 p-4">
          <div class="float-left w-20 h-20 bg-blue-500 rounded-lg flex items-center justify-center text-white">
            左浮动
          </div>
          <div class="float-right w-20 h-20 bg-green-500 rounded-lg flex items-center justify-center text-white">
            右浮动
          </div>
          <div class="clear-both"></div>
          <p class="mt-2">浮动元素周围的文本内容...</p>
        </div>
      </div>
    </div>
  </main>

  <!-- 固定底部 -->
  <footer class="bg-gray-800 text-white py-8">
    <div class="container mx-auto px-4 text-center">
      <p>&copy; 2024 我的网站. 版权所有.</p>
    </div>
  </footer>
</body>
</html>

14. 响应式布局示例

响应式网格布局
<!-- 响应式网格 -->
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6 gap-4">
  <div class="bg-blue-100 p-4 rounded">项目1</div>
  <div class="bg-blue-200 p-4 rounded">项目2</div>
  <div class="bg-blue-300 p-4 rounded">项目3</div>
  <div class="bg-blue-400 p-4 rounded">项目4</div>
  <div class="bg-blue-500 p-4 rounded">项目5</div>
  <div class="bg-blue-600 p-4 rounded">项目6</div>
</div>

<!-- 响应式Flex布局 -->
<div class="flex flex-col md:flex-row gap-4">
  <div class="flex-1 bg-gray-100 p-4 rounded">左侧内容</div>
  <div class="flex-1 bg-gray-200 p-4 rounded">右侧内容</div>
</div>

<!-- 响应式显示控制 -->
<div class="block md:hidden lg:block xl:hidden">
  复杂的响应式显示逻辑
</div>

15. 布局最佳实践

  1. 移动优先:从移动端布局开始设计
  2. 语义化结构:使用有意义的HTML标签
  3. 渐进增强:逐步添加复杂布局
  4. 性能考虑:避免过度复杂的嵌套
  5. 可访问性:确保布局对辅助设备友好

Tailwind CSS 与 Flexbox 和 Grid 布局

1. Flexbox 布局类

1.1 Flex容器类
<!-- 基础Flex容器 -->
<div class="flex">
  <div>Flex项目1</div>
  <div>Flex项目2</div>
</div>

<!-- Flex方向 -->
<div class="flex flex-row">水平排列(默认)</div>
<div class="flex flex-col">垂直排列</div>
<div class="flex flex-row-reverse">水平反向排列</div>
<div class="flex flex-col-reverse">垂直反向排列</div>

<!-- 响应式Flex方向 -->
<div class="flex flex-col md:flex-row">
  <!-- 移动端垂直,桌面端水平 -->
</div>

1.2 Flex项目对齐
<!-- 主轴对齐 -->
<div class="flex justify-start">左对齐</div>
<div class="flex justify-center">居中对齐</div>
<div class="flex justify-end">右对齐</div>
<div class="flex justify-between">两端对齐</div>
<div class="flex justify-around">均匀分布</div>
<div class="flex justify-evenly">完全均匀分布</div>

<!-- 交叉轴对齐 -->
<div class="flex items-start">顶部对齐</div>
<div class="flex items-center">垂直居中</div>
<div class="flex items-end">底部对齐</div>
<div class="flex items-stretch">拉伸填充</div>
<div class="flex items-baseline">基线对齐</div>

<!-- 多行对齐 -->
<div class="flex flex-wrap content-start">多行顶部对齐</div>
<div class="flex flex-wrap content-center">多行居中</div>
<div class="flex flex-wrap content-end">多行底部对齐</div>
<div class="flex flex-wrap content-between">多行两端对齐</div>
<div class="flex flex-wrap content-around">多行均匀分布</div>

1.3 Flex项目属性
<!-- 项目排序 -->
<div class="flex">
  <div class="order-1">第二项</div>
  <div class="order-2">第三项</div>
  <div class="order-first">第一项</div>
  <div class="order-last">最后一项</div>
</div>

<!-- 项目伸缩 -->
<div class="flex">
  <div class="flex-1">可伸缩项目</div>
  <div class="flex-none">固定宽度项目</div>
  <div class="flex-auto">自动伸缩项目</div>
  <div class="flex-initial">初始大小</div>
</div>

<!-- 特定伸缩比例 -->
<div class="flex">
  <div class="flex-1">1份</div>
  <div class="flex-2">2份</div>
  <div class="flex-3">3份</div>
</div>

2. Grid 布局类

2.1 Grid容器类
<!-- 基础Grid容器 -->
<div class="grid grid-cols-3 gap-4">
  <div>列1</div>
  <div>列2</div>
  <div>列3</div>
</div>

<!-- 响应式Grid -->
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
  <div>响应式列</div>
  <div>响应式列</div>
  <div>响应式列</div>
  <div>响应式列</div>
</div>

<!-- 自动列宽 -->
<div class="grid grid-cols-auto gap-4">
  <div>自动宽度</div>
  <div>较长的内容自动调整</div>
  <div>短</div>
</div>

<!-- 固定和自动混合 -->
<div class="grid grid-cols-[200px,1fr,300px] gap-4">
  <div>固定200px</div>
  <div>自动填充</div>
  <div>固定300px</div>
</div>

2.2 Grid行和列控制
<!-- 行控制 -->
<div class="grid grid-rows-3 gap-4 h-64">
  <div>行1</div>
  <div>行2</div>
  <div>行3</div>
</div>

<!-- 行列混合 -->
<div class="grid grid-cols-3 grid-rows-2 gap-4 h-64">
  <div>单元格1</div>
  <div>单元格2</div>
  <div>单元格3</div>
  <div>单元格4</div>
  <div>单元格5</div>
  <div>单元格6</div>
</div>

2.3 Grid项目定位
<!-- 列跨度 -->
<div class="grid grid-cols-3 gap-4">
  <div class="col-span-1">跨1列</div>
  <div class="col-span-2">跨2列</div>
  <div class="col-span-3">跨3列</div>
  <div class="col-span-full">跨所有列</div>
</div>

<!-- 行跨度 -->
<div class="grid grid-rows-3 gap-4 h-96">
  <div class="row-span-1">跨1行</div>
  <div class="row-span-2">跨2行</div>
  <div class="row-span-3">跨3行</div>
  <div class="row-span-full">跨所有行</div>
</div>

<!-- 起始位置 -->
<div class="grid grid-cols-3 gap-4">
  <div class="col-start-2">从第2列开始</div>
  <div class="col-end-4">到第4列结束</div>
  <div class="col-start-1 col-end-3">从1到3列</div>
</div>

3. 实际布局示例

3.1 完整的页面布局
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Flexbox与Grid布局示例</title>
</head>
<body class="bg-gray-100 min-h-screen">
  <!-- 导航栏 - Flexbox -->
  <nav class="bg-white shadow-lg">
    <div class="container mx-auto px-4">
      <div class="flex items-center justify-between h-16">
        <!-- Logo区域 -->
        <div class="flex items-center">
          <div class="w-8 h-8 bg-blue-500 rounded"></div>
          <span class="ml-2 text-xl font-bold">我的网站</span>
        </div>
        
        <!-- 导航菜单 - 桌面端Flex -->
        <div class="hidden md:flex items-center space-x-6">
          <a href="#" class="text-gray-700 hover:text-blue-500 transition-colors">首页</a>
          <a href="#" class="text-gray-700 hover:text-blue-500 transition-colors">产品</a>
          <a href="#" class="text-gray-700 hover:text-blue-500 transition-colors">服务</a>
          <a href="#" class="text-gray-700 hover:text-blue-500 transition-colors">关于</a>
        </div>
        
        <!-- 行动按钮 -->
        <div class="flex items-center space-x-4">
          <button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600 transition-colors">
            登录
          </button>
          <button class="md:hidden">菜单</button>
        </div>
      </div>
    </div>
  </nav>

  <!-- 主要内容区域 - Grid -->
  <main class="container mx-auto px-4 py-8">
    <!-- 英雄区域 - Grid -->
    <section class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-12">
      <div class="flex flex-col justify-center">
        <h1 class="text-4xl font-bold mb-4">欢迎使用我们的服务</h1>
        <p class="text-lg text-gray-600 mb-6">提供最优质的产品和解决方案</p>
        <div class="flex space-x-4">
          <button class="bg-blue-500 text-white px-6 py-3 rounded-lg hover:bg-blue-600 transition-colors">
            开始使用
          </button>
          <button class="border border-blue-500 text-blue-500 px-6 py-3 rounded-lg hover:bg-blue-50 transition-colors">
            了解更多
          </button>
        </div>
      </div>
      <div class="flex items-center justify-center">
        <div class="w-full h-64 bg-gradient-to-r from-blue-400 to-purple-500 rounded-lg flex items-center justify-center text-white text-2xl">
          特色图片
        </div>
      </div>
    </section>

    <!-- 特性卡片 - Grid -->
    <section class="mb-12">
      <h2 class="text-3xl font-bold text-center mb-8">我们的特性</h2>
      <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
        <!-- 卡片1 -->
        <div class="bg-white rounded-lg shadow-md p-6 flex flex-col">
          <div class="w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center mb-4">
            <span class="text-blue-500 text-xl">⚡</span>
          </div>
          <h3 class="text-xl font-semibold mb-2">快速高效</h3>
          <p class="text-gray-600 flex-1">提供快速响应的服务体验,确保用户满意度。</p>
          <button class="mt-4 text-blue-500 hover:text-blue-600 self-start">了解更多 →</button>
        </div>
        
        <!-- 卡片2 -->
        <div class="bg-white rounded-lg shadow-md p-6 flex flex-col">
          <div class="w-12 h-12 bg-green-100 rounded-lg flex items-center justify-center mb-4">
            <span class="text-green-500 text-xl">🔒</span>
          </div>
          <h3 class="text-xl font-semibold mb-2">安全可靠</h3>
          <p class="text-gray-600 flex-1">采用最先进的安全技术,保护用户数据安全。</p>
          <button class="mt-4 text-blue-500 hover:text-blue-600 self-start">了解更多 →</button>
        </div>
        
        <!-- 卡片3 -->
        <div class="bg-white rounded-lg shadow-md p-6 flex flex-col">
          <div class="w-12 h-12 bg-purple-100 rounded-lg flex items-center justify-center mb-4">
            <span class="text-purple-500 text-xl">🛠️</span>
          </div>
          <h3 class="text-xl font-semibold mb-2">易于使用</h3>
          <p class="text-gray-600 flex-1">简洁直观的界面设计,降低用户学习成本。</p>
          <button class="mt-4 text-blue-500 hover:text-blue-600 self-start">了解更多 →</button>
        </div>
      </div>
    </section>

    <!-- 价格表 - Grid复杂布局 -->
    <section class="mb-12">
      <h2 class="text-3xl font-bold text-center mb-8">价格方案</h2>
      <div class="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-4xl mx-auto">
        <!-- 基础版 -->
        <div class="bg-white rounded-lg shadow-lg border-2 border-gray-200 p-6 flex flex-col">
          <div class="text-center mb-6">
            <h3 class="text-xl font-semibold mb-2">基础版</h3>
            <div class="text-3xl font-bold text-gray-800">¥99<span class="text-sm font-normal text-gray-600">/月</span></div>
          </div>
          <ul class="space-y-3 mb-6 flex-1">
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>基础功能</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>5GB存储空间</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>基础支持</span>
            </li>
          </ul>
          <button class="w-full bg-gray-500 text-white py-3 rounded-lg hover:bg-gray-600 transition-colors">
            选择基础版
          </button>
        </div>
        
        <!-- 专业版(突出显示) -->
        <div class="bg-white rounded-lg shadow-xl border-2 border-blue-500 p-6 flex flex-col relative">
          <div class="absolute top-0 right-0 bg-blue-500 text-white px-3 py-1 rounded-bl-lg text-sm">
            推荐
          </div>
          <div class="text-center mb-6">
            <h3 class="text-xl font-semibold mb-2">专业版</h3>
            <div class="text-3xl font-bold text-blue-600">¥199<span class="text-sm font-normal text-gray-600">/月</span></div>
          </div>
          <ul class="space-y-3 mb-6 flex-1">
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>所有基础功能</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>50GB存储空间</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>优先支持</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>高级功能</span>
            </li>
          </ul>
          <button class="w-full bg-blue-500 text-white py-3 rounded-lg hover:bg-blue-600 transition-colors">
            选择专业版
          </button>
        </div>
        
        <!-- 企业版 -->
        <div class="bg-white rounded-lg shadow-lg border-2 border-gray-200 p-6 flex flex-col">
          <div class="text-center mb-6">
            <h3 class="text-xl font-semibold mb-2">企业版</h3>
            <div class="text-3xl font-bold text-gray-800">¥499<span class="text-sm font-normal text-gray-600">/月</span></div>
          </div>
          <ul class="space-y-3 mb-6 flex-1">
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>所有专业功能</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>无限存储空间</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>24/7专属支持</span>
            </li>
            <li class="flex items-center">
              <span class="text-green-500 mr-2">✓</span>
              <span>定制化服务</span>
            </li>
          </ul>
          <button class="w-full bg-gray-500 text-white py-3 rounded-lg hover:bg-gray-600 transition-colors">
            选择企业版
          </button>
        </div>
      </div>
    </section>

    <!-- 团队展示 - Grid复杂定位 -->
    <section>
      <h2 class="text-3xl font-bold text-center mb-8">我们的团队</h2>
      <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
        <div class="bg-white rounded-lg shadow-md overflow-hidden">
          <div class="h-48 bg-gradient-to-br from-blue-400 to-purple-500"></div>
          <div class="p-4 text-center">
            <h3 class="text-lg font-semibold">张三</h3>
            <p class="text-gray-600">CEO</p>
          </div>
        </div>
        <div class="bg-white rounded-lg shadow-md overflow-hidden">
          <div class="h-48 bg-gradient-to-br from-green-400 to-blue-500"></div>
          <div class="p-4 text-center">
            <h3 class="text-lg font-semibold">李四</h3>
            <p class="text-gray-600">CTO</p>
          </div>
        </div>
        <div class="bg-white rounded-lg shadow-md overflow-hidden">
          <div class="h-48 bg-gradient-to-br from-purple-400 to-pink-500"></div>
          <div class="p-4 text-center">
            <h3 class="text-lg font-semibold">王五</h3>
            <p class="text-gray-600">设计师</p>
          </div>
        </div>
        <div class="bg-white rounded-lg shadow-md overflow-hidden">
          <div class="h-48 bg-gradient-to-br from-yellow-400 to-red-500"></div>
          <div class="p-4 text-center">
            <h3 class="text-lg font-semibold">赵六</h3>
            <p class="text-gray-600">开发工程师</p>
          </div>
        </div>
      </div>
    </section>
  </main>

  <!-- 页脚 - Flexbox -->
  <footer class="bg-gray-800 text-white py-12">
    <div class="container mx-auto px-4">
      <div class="grid grid-cols-1 md:grid-cols-4 gap-8">
        <div class="md:col-span-2">
          <h3 class="text-xl font-bold mb-4">关于我们</h3>
          <p class="text-gray-300">我们致力于为客户提供最优质的产品和服务,推动行业创新发展。</p>
        </div>
        <div>
          <h3 class="text-xl font-bold mb-4">快速链接</h3>
          <ul class="space-y-2">
            <li><a href="#" class="text-gray-300 hover:text-white transition-colors">首页</a></li>
            <li><a href="#" class="text-gray-300 hover:text-white transition-colors">产品</a></li>
            <li><a href="#" class="text-gray-300 hover:text-white transition-colors">服务</a></li>
          </ul>
        </div>
        <div>
          <h3 class="text-xl font-bold mb-4">联系我们</h3>
          <ul class="space-y-2 text-gray-300">
            <li>邮箱: contact@example.com</li>
            <li>电话: 400-123-4567</li>
            <li>地址: 北京市朝阳区</li>
          </ul>
        </div>
      </div>
      <div class="border-t border-gray-700 mt-8 pt-8 text-center text-gray-400">
        <p>&copy; 2024 我的公司. 版权所有.</p>
      </div>
    </div>
  </footer>
</body>
</html>

4. 高级布局技巧

4.1 复杂Grid布局
<!-- 杂志式布局 -->
<div class="grid grid-cols-4 grid-rows-3 gap-4 h-96">
  <div class="col-span-2 row-span-2 bg-blue-500 rounded-lg">主图区域</div>
  <div class="col-span-2 row-span-1 bg-green-500 rounded-lg">标题区域</div>
  <div class="col-span-1 row-span-1 bg-yellow-500 rounded-lg">侧边1</div>
  <div class="col-span-1 row-span-1 bg-red-500 rounded-lg">侧边2</div>
  <div class="col-span-2 row-span-1 bg-purple-500 rounded-lg">底部区域</div>
</div>

<!-- 响应式图片墙 -->
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2">
  <div class="aspect-square bg-gray-300"></div>
  <div class="aspect-square bg-gray-400"></div>
  <div class="aspect-square bg-gray-500"></div>
  <div class="aspect-square bg-gray-600"></div>
  <div class="aspect-square bg-gray-300"></div>
  <div class="aspect-square bg-gray-400"></div>
  <div class="aspect-square bg-gray-500"></div>
  <div class="aspect-square bg-gray-600"></div>
</div>

4.2 Flex与Grid混合布局
<!-- 卡片组内的Flex布局 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
  <div class="flex flex-col bg-white rounded-lg shadow-md p-6">
    <div class="flex items-center mb-4">
      <div class="w-10 h-10 bg-blue-500 rounded-full flex items-center justify-center text-white mr-3">
        A
      </div>
      <div class="flex-1">
        <h3 class="font-semibold">标题</h3>
        <p class="text-sm text-gray-600">副标题</p>
      </div>
      <button class="text-blue-500 hover:text-blue-600">操作</button>
    </div>
    <p class="text-gray-700 flex-1">卡片内容描述...</p>
    <div class="flex justify-between items-center mt-4">
      <span class="text-sm text-gray-500">标签</span>
      <div class="flex space-x-2">
        <button class="text-gray-500 hover:text-gray-700">分享</button>
        <button class="text-gray-500 hover:text-gray-700">收藏</button>
      </div>
    </div>
  </div>
</div>

5. 布局最佳实践

  1. 移动优先:从移动端布局开始,逐步增强
  2. 语义化选择:根据内容结构选择合适的布局方式
  3. 性能优化:避免过度复杂的嵌套和定位
  4. 可访问性:确保布局对屏幕阅读器友好
  5. 渐进增强:为不支持Grid的浏览器提供Fallback

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐