4 тега

Tailwind CSS - Полное руководство для современной веб-разработки

Глубокое погружение в Tailwind CSS — как эта utility-first CSS-библиотека меняет подход к стилизации веб-приложений. Руководство с подробными примерами, объяснениями концепций и практическими советами по интеграции.

Comprehensive guide to Tailwind CSS development
Главная Блог Tailwind CSS - Полное руководство для современной веб-разработки

Введение в Tailwind CSS: революция в CSS-фреймворках

(Могут быть недочеты потому что я только недавно интегрировал TailwindCss в MarkDown систему)

Tailwind CSS — это революционный utility-first CSS фреймворк, который принципиально меняет способ стилизации веб-приложений. В отличие от традиционных фреймворков, Tailwind не предоставляет готовых компонентов, а вместо этого даёт набор низкоуровневых утилитарных классов, которые можно комбинировать для создания уникального дизайна.

Tailwind CSS

Современный utility-first CSS фреймворк, ориентированный на продуктивность и гибкость.

  • Низкоуровневые утилиты
  • Just-In-Time компиляция
  • Минимальный итоговый CSS
Пример Tailwind

Почему Tailwind так популярен среди разработчиков?

Tailwind CSS приобрёл огромную популярность среди разработчиков по нескольким веским причинам:

  1. Скорость разработки — Tailwind позволяет стилизовать компоненты непосредственно в HTML, не переключаясь между файлами и не придумывая имена классов.
  2. Согласованность дизайна — Предопределённая система дизайна с шкалами размеров, цветов и отступов обеспечивает визуальную согласованность интерфейса.
  3. Легко настраивается — Tailwind полностью настраивается под потребности проекта через конфигурационный файл.
  4. Оптимизированный размер — Благодаря JIT-компиляции, финальный CSS содержит только используемые классы и имеет минимальный размер.
  5. Отзывчивый дизайн — Встроенные модификаторы для брейкпоинтов делают адаптивную верстку интуитивно понятной.
Традиционный CSS
/* CSS */
.button {
  background-color: #3b82f6;
  color: white;
  font-weight: bold;
  padding: 0.5rem 1rem;
  border-radius: 0.25rem;
}
.button:hover {
  background-color: #1d4ed8;
}

/* HTML */ <button class="button"> Кнопка </button>

Подход Tailwind CSS
/* Нет отдельного CSS файла */

/* HTML с классами Tailwind */ <button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"> Кнопка </button>

Фундаментальные концепции Tailwind CSS

Принцип Utility-First

Центральная идея Tailwind CSS — это подход "utility-first" (приоритет утилит). Вместо создания собственных абстрактных CSS-классов, Tailwind предлагает использовать маленькие утилитарные классы для построения компонентов непосредственно в HTML.

HTML
<!-- Вместо создания класса "card" -->
<div class="max-w-sm rounded overflow-hidden shadow-lg bg-white">
  <img class="w-full" src="/img/card-image.jpg" alt="Изображение">
  <div class="px-6 py-4">
    <div class="font-bold text-xl mb-2">Заголовок карточки</div>
    <p class="text-gray-700 text-base">
      Здесь описание карточки, которое может занимать несколько строк.
    </p>
  </div>
</div>

Преимущества этого подхода:

  • Не нужно придумывать имена классов — вам не нужно изобретать абстрактные именования вроде .card-title или .content-wrapper
  • CSS не разрастается — вы используете только те классы, которые нужны, и не создаете новые
  • Вносить изменения безопасно — вы меняете стили конкретного элемента, не боясь побочных эффектов на других страницах
  • Удобный рефакторинг — вы видите все стили прямо в HTML, без необходимости искать определения в CSS-файлах

Обратите внимание

Да, HTML может выглядеть "загруженным" из-за множества классов, но современные инструменты (VS Code + расширение Tailwind CSS IntelliSense) делают работу с ними удобной благодаря автодополнению и подсказкам.

Just-In-Time (JIT) компилятор

С версии 3.0 Tailwind CSS использует Just-In-Time компилятор, который радикально меняет процесс генерации CSS-файлов:

До JIT
📁
tailwind.css
8-10 MB
1. Генерация всех возможных классов
2. Очистка неиспользуемых классов с PurgeCSS
3. Минификация финального CSS
❌ Длительная сборка
❌ Ограниченный синтаксис
❌ Фиксированные значения
После JIT
📁
tailwind.css
~10 KB
1. Сканирование HTML/JS файлов
2. Генерация только используемых классов
3. Мгновенная регенерация при изменениях
✅ Мгновенная сборка
✅ Произвольные значения (mt-[27px])
✅ Сложные модификаторы (lg:dark:hover:bg-white)

JIT-компилятор сканирует ваши шаблоны и JavaScript-файлы во время разработки и генерирует только те CSS-классы, которые вы фактически используете. Это имеет несколько важных преимуществ:

  • Молниеносная разработка — изменения появляются мгновенно, без полной перестройки CSS
  • Произвольные значения — вы можете использовать произвольные значения через квадратные скобки, например text-[22px] или mt-[17vh]
  • Неограниченная вложенность модификаторов — можно комбинировать несколько состояний, например lg:dark:hover:bg-white
  • Минимальный финальный CSS — только используемые классы попадают в финальный CSS, обеспечивая минимальный размер файла

Система дизайн-токенов

Tailwind CSS предоставляет хорошо продуманную систему дизайн-токенов — набор предопределенных значений для цветов, размеров, отступов и других свойств, что обеспечивает согласованность дизайна.

Система цветов

Tailwind поставляется с тщательно подобранной палитрой цветов, каждый из которых доступен в разных оттенках (от 50 до 950):

bg-blue-50
bg-blue-100
bg-blue-200
bg-blue-300
bg-blue-400
bg-blue-500
bg-blue-600
bg-blue-700
bg-blue-800
bg-blue-900
bg-blue-950

Использование этой системы очень просто. Достаточно добавить нужный цвет и его интенсивность:

HTML
<div class="bg-blue-50">Очень светло-синий</div>
<div class="bg-blue-100">Светло-синий</div>
<div class="bg-blue-500">Средне-синий</div>
<div class="bg-blue-900">Тёмно-синий</div>

Расширенные возможности Tailwind CSS

Группировка и наследование стилей

Tailwind CSS предоставляет мощный механизм для группировки стилей и их наследования, который помогает избежать повторения классов и создавать более чистый HTML.

Модификатор group

Модификатор group позволяет стилизовать дочерние элементы на основе состояния родительского элемента. Это особенно полезно для создания интерактивных компонентов.

HTML
<div class="group border rounded-lg overflow-hidden hover:shadow-lg transition duration-300">
  <div class="p-4">
    <h3 class="text-lg font-bold group-hover:text-blue-600 transition duration-300">Заголовок карточки</h3>
    <p class="text-gray-600 group-hover:text-black transition duration-300">Описание карточки с эффектом наведения.</p>
    <button class="mt-3 px-4 py-2 bg-gray-200 group-hover:bg-blue-500 group-hover:text-white rounded transition duration-300">Подробнее</button>
  </div>
</div>

Интерактивная карточка

При наведении на карточку меняется её внешний вид, включая цвет текста и кнопку.

Модификатор peer

Модификатор peer работает аналогично group, но позволяет стилизовать элементы на основе состояния их "соседей" (то есть, элементов, расположенных рядом).

HTML
<div class="relative">
  <input type="text" class="peer border rounded px-4 py-2 w-full focus:border-blue-500 focus:outline-none" placeholder="Введите email">
  <p class="mt-1 text-sm text-transparent peer-invalid:text-red-500">Пожалуйста, введите корректный email.</p>
</div>

Тёмная тема из коробки

Tailwind CSS предоставляет встроенную поддержку тёмного режима через модификатор dark:. Для его работы нужно включить соответствующую опцию в файле конфигурации.

Настройка тёмной темы

В файле tailwind.config.js можно настроить тёмную тему двумя способами:

JAVASCRIPT
// tailwind.config.js
module.exports = {
  darkMode: 'media', // Автоматически на основе системных настроек
  // ИЛИ
  darkMode: 'class', // Ручное переключение с помощью класса 'dark'
  // ...остальные настройки
}

Использование модификатора dark:

HTML
<div class="bg-white dark:bg-gray-800 text-gray-900 dark:text-white p-6 rounded-lg shadow-md">
  <h2 class="text-xl font-bold mb-4 text-gray-800 dark:text-gray-200">Адаптивная карточка</h2>
  <p class="text-gray-600 dark:text-gray-300">Этот текст будет хорошо читаться как в светлом, так и в тёмном режиме.</p>
  <button class="mt-4 bg-blue-500 hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
    Подробнее
  </button>
</div>

Светлая тема

Текст в светлом режиме.

Тёмная тема

Текст в тёмном режиме.

Переключение темы с помощью JavaScript

Если используется darkMode: 'class', необходимо добавить класс dark к элементу html для активации тёмной темы:

JAVASCRIPT
// Проверяем предпочтения пользователя
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')
}

// Функция для переключения темы
function toggleDarkMode() {
  if (document.documentElement.classList.contains('dark')) {
    document.documentElement.classList.remove('dark')
    localStorage.theme = 'light'
  } else {
    document.documentElement.classList.add('dark')
    localStorage.theme = 'dark'
  }
}

Директивы @apply для компонентов

Директива @apply позволяет использовать утилитарные классы Tailwind внутри CSS, что особенно полезно при создании повторно используемых компонентов или при работе с глобальными стилями.

Базовое использование @apply

CSS
/* В вашем CSS файле */
.btn {
  @apply py-2 px-4 font-bold rounded;
}

.btn-blue {
  @apply bg-blue-500 text-white hover:bg-blue-700;
}

.card {
  @apply bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition duration-300;
}
HTML
<!-- Использование в HTML -->
<button class="btn btn-blue">Кнопка</button>

<div class="card">
  <h3 class="text-lg font-bold">Заголовок карточки</h3>
  <p>Содержимое карточки</p>
</div>

Пример использования @apply

Использование @apply в сочетании с другими CSS-функциями

CSS
/* Комбинирование @apply с CSS переменными и calc() */
.custom-element {
  @apply bg-blue-500 text-white rounded;
  width: calc(100% - var(--sidebar-width));
  margin-left: var(--sidebar-width);
}

/* Использование @apply с медиа-запросами */
@media (max-width: 768px) {
  .responsive-card {
    @apply p-4 rounded-md shadow-sm;
  }
}

/* Использование с модификаторами состояний */
.interactive-button {
  @apply bg-blue-500 text-white py-2 px-4 rounded;
  
  &:hover {
    @apply bg-blue-600 shadow-md;
  }
  
  &:active {
    @apply bg-blue-700;
  }
  
  &:focus {
    @apply outline-none ring-2 ring-blue-500 ring-opacity-50;
  }
}

Лучшие практики использования @apply

  1. Используйте для абстрагирования повторяющихся паттернов
    CSS
    .input-field {
      @apply w-full border border-gray-300 rounded-md px-4 py-2 focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500;
    }
    
  2. Комбинируйте с CSS-переменными для гибкой настройки
    CSS
    :root {
      --primary: #3b82f6;
      --primary-dark: #1d4ed8;
    }
    
    .brand-button {
      @apply py-2 px-4 rounded font-medium;
      background-color: var(--primary);
      
      &:hover {
        background-color: var(--primary-dark);
      }
    }
    
  3. Избегайте излишнего применения @apply
    Вместо того, чтобы переносить всю вёрстку в CSS-файлы, выделяйте в компоненты только повторяющиеся шаблоны. Для уникальных элементов лучше использовать классы в HTML напрямую.

Установка и настройка Tailwind CSS

1. Установка с нуля

Начнем с установки Tailwind CSS в новый проект. Есть несколько способов установки, но здесь мы рассмотрим наиболее распространенный подход с использованием npm/yarn.

Шаг 1: Создание проекта

Создайте новую директорию для проекта и инициализируйте npm:

Bash
mkdir my-tailwind-project
cd my-tailwind-project
npm init -y

Шаг 2: Установка зависимостей

Установите Tailwind CSS, PostCSS и autoprefixer:

Bash
npm install -D tailwindcss postcss autoprefixer

Шаг 3: Инициализация Tailwind

Создайте конфигурационные файлы Tailwind:

Bash
npx tailwindcss init -p

Эта команда создаст два файла:

  • tailwind.config.js - основная конфигурация Tailwind
  • postcss.config.js - конфигурация PostCSS
Результат выполнения команд

Созданные файлы:

tailwind.config.js - конфигурация TailwindCSS
postcss.config.js - конфигурация PostCSS

2. Настройка конфигурации

После инициализации необходимо настроить Tailwind для вашего проекта. Основные настройки выполняются в файле tailwind.config.js.

Базовая конфигурация

По умолчанию созданный файл конфигурации выглядит так:

JAVASCRIPT
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
}

Настройка путей к файлам контента

Важно указать пути к файлам, где будут использоваться классы Tailwind. Это необходимо для JIT-компилятора, чтобы он мог генерировать только используемые стили:

JAVASCRIPT
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/**/*.{html,js,jsx,ts,tsx,vue}",
    "./public/index.html",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

Кастомизация темы

Tailwind позволяет настраивать различные аспекты темы, включая цвета, отступы, шрифты и другие параметры:

JAVASCRIPT
// tailwind.config.js
const colors = require('tailwindcss/colors')

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js,jsx,ts,tsx}"],
  theme: {
    // Полная замена цветовой палитры
    colors: {
      transparent: 'transparent',
      current: 'currentColor',
      black: colors.black,
      white: colors.white,
      gray: colors.neutral,
      primary: {
        50: '#f0f9ff',
        100: '#e0f2fe',
        500: '#0ea5e9',
        700: '#0369a1',
        900: '#0c4a6e',
      },
    },
    // Кастомные шрифты
    fontFamily: {
      sans: ['Inter var', 'sans-serif'],
      mono: ['JetBrains Mono', 'monospace'],
    },
    // Расширение существующей темы
    extend: {
      spacing: {
        '128': '32rem',
      },
      borderRadius: {
        'xl': '1rem',
        '2xl': '2rem',
      },
      animation: {
        'bounce-slow': 'bounce 3s infinite',
      },
    },
  },
  plugins: [
    // Собственные компоненты
    require('./tailwind/buttons.js'),
    require('./tailwind/forms.js'),
  ],
}

Добавление плагинов

Tailwind имеет экосистему плагинов, которые добавляют новую функциональность:

JAVASCRIPT
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{js,jsx}"],
  theme: {
    extend: {},
  },
  plugins: [
    require('@tailwindcss/forms'),
    require('@tailwindcss/typography'),
    require('@tailwindcss/aspect-ratio'),
  ],
}

Совет

Не забудьте установить плагины ниже перед их использованием:

Bash
    npm install -D @tailwindcss/forms @tailwindcss/typography @tailwindcss/aspect-ratio

3. Включение в CSS

После настройки конфигурационных файлов необходимо создать CSS-файл и включить в него директивы Tailwind.

Создание основного CSS-файла

Создайте файл src/input.css (или выберите другое имя) и добавьте следующий код:

CSS
/* src/input.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

/* Дополнительные пользовательские стили */яё
@layer components {
  .btn {
    @apply px-4 py-2 rounded font-semibold transition duration-200;
  }
  .btn-primary {
    @apply bg-blue-500 text-white hover:bg-blue-600;
  }
}

/* Глобальные стили */
@layer base {
  h1 {
    @apply text-2xl font-bold mb-4;
  }
  h2 {
    @apply text-xl font-bold mb-3;
  }
}

Директивы @tailwind подключают три основных слоя Tailwind:

  • base - базовые стили (сброс стилей)
  • components - стили компонентов
  • utilities - утилитарные классы

Сборка CSS

Добавьте скрипт в package.json для сборки CSS:

JSON
{
  "scripts": {
    "build:css": "tailwindcss -i ./src/input.css -o ./dist/output.css --minify",
    "watch:css": "tailwindcss -i ./src/input.css -o ./dist/output.css --watch"
  }
}

Запустите сборку:

Bash
# Однократная сборка
npm run build:css

# Режим разработки с отслеживанием изменений
npm run watch:css

Подключение CSS к HTML

Создайте файл public/index.html и подключите сгенерированный CSS:

HTML
<!DOCTYPE html>
<html lang="ru">
<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-gray-100 font-sans">
  <div class="container mx-auto px-4 py-8">
    <h1 class="text-3xl font-bold text-gray-800 mb-6">
      Привет, Tailwind CSS!
    </h1>
    <button class="btn btn-primary">Нажми меня</button>
  </div>
</body>
</html>

4. Интеграция с фреймворками

Tailwind CSS можно легко интегрировать с большинством современных JavaScript-фреймворков. Рассмотрим популярные варианты.

Nuxt 3

Для интеграции Tailwind с Nuxt 3 следуйте этим шагам:

  1. Установка модулей:
Bash
# Установка основного пакета Nuxt
npm init nuxt-app my-nuxt-project

# Переход в директорию проекта
cd my-nuxt-project

# Установка Tailwind и зависимостей
npm install -D tailwindcss postcss autoprefixer @nuxtjs/tailwindcss
  1. Настройка модуля в nuxt.config.ts:
TYPESCRIPT
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@nuxtjs/tailwindcss'
  ],
  tailwindcss: {
    // опциональные настройки
    configPath: '~/tailwind.config.js',
    exposeConfig: false,
    viewer: true, // просмотрщик компонентов в режиме разработки
  }
})
  1. Создание конфигурации Tailwind:
JAVASCRIPT
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./components/**/*.{js,vue,ts}",
    "./layouts/**/*.vue",
    "./pages/**/*.vue",
    "./plugins/**/*.{js,ts}",
    "./nuxt.config.{js,ts}",
    "./app.vue",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
  1. Использование в компонентах Vue:
Vue
<!-- pages/index.vue -->
<template>
  <div class="min-h-screen bg-gray-50">
    <div class="container mx-auto px-4 py-16">
      <h1 class="text-4xl font-bold text-gray-800 mb-8">
        Nuxt 3 с Tailwind CSS
      </h1>
      <div class="bg-white rounded-lg shadow p-6">
        <p class="text-gray-600">Это базовый компонент с Tailwind классами.</p>
      </div>
    </div>
  </div>
</template>

React (Create React App)

Интеграция Tailwind с Create React App:

  1. Создание проекта React:
Bash
npx create-react-app my-react-tailwind
cd my-react-tailwind
  1. Установка Tailwind и настройка PostCSS:
Bash
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
  1. Настройка конфигурации Tailwind:
JAVASCRIPT
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
  1. Включение Tailwind в CSS:
CSS
/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
  1. Импорт CSS в главном компоненте:
React JSX
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
  1. Использование в компонентах:
React JSX
// src/App.js
function App() {
  return (
    <div className="min-h-screen bg-gray-100 flex flex-col justify-center items-center">
      <div className="max-w-md w-full bg-white rounded-lg shadow-lg p-6">
        <h1 className="text-2xl font-bold text-gray-800 mb-4">
          React + Tailwind CSS
        </h1>
        <button className="bg-blue-500 hover:bg-blue-600 text-white font-medium py-2 px-4 rounded">
          Нажми меня
        </button>
      </div>
    </div>
  );
}

export default App;

Vue 3

Интеграция Tailwind с Vue 3 (используя Vite):

  1. Создание проекта Vue с Vite:
Bash
npm init vite my-vue-tailwind -- --template vue
cd my-vue-tailwind
npm install
  1. Установка Tailwind и зависимостей:
Bash
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
  1. Настройка конфигурации Tailwind:
JAVASCRIPT
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{vue,js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
  1. Включение Tailwind в CSS:
CSS
/* src/assets/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
  1. Импорт CSS в главном файле:
JAVASCRIPT
// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import './assets/index.css'

createApp(App).mount('#app')
  1. Использование в компонентах Vue:
Vue
<!-- src/App.vue -->
<template>
  <div class="min-h-screen bg-gray-100 flex justify-center items-center">
    <div class="max-w-md w-full bg-white rounded-lg shadow-lg p-6">
      <h1 class="text-2xl font-bold text-gray-800 mb-4">
        Vue 3 + Tailwind CSS
      </h1>
      <button class="bg-green-500 hover:bg-green-600 text-white font-medium py-2 px-4 rounded">
        Нажми меня
      </button>
    </div>
  </div>
</template>

Совместимость с другими фреймворками

Tailwind CSS также хорошо работает с другими фреймворками, включая Angular, Svelte, и Next.js. Для каждого из них есть официальные руководства по интеграции на сайте документации Tailwind.

Заключение: Экосистема Tailwind CSS

В заключение, Tailwind CSS – это не просто библиотека утилитарных классов, а целая экосистема инструментов и подходов к веб-разработке, которая существенно ускоряет процесс создания красивых и функциональных интерфейсов.

Headless UI

Команда Tailwind также создала Headless UI – набор полностью доступных компонентов без стилизации, которые идеально интегрируются с Tailwind CSS.

Headless UI + Tailwind CSS

Идеальная комбинация для быстрого создания доступных интерфейсов

Что такое Headless UI?

  • Доступные компоненты без стилей
  • Поддержка React и Vue
  • WAI-ARIA совместимость
  • Управление с клавиатуры

Доступные компоненты

• Dialog (модальные окна)

• Dropdown

• Switch (тумблеры)

• Tabs (вкладки)

• Combobox (выпадающий список с поиском)

• Transition (анимации)

• Popover

Примеры использования Headless UI

Headless UI предоставляет только функциональность без стилей, позволяя вам полностью контролировать внешний вид компонентов с помощью Tailwind CSS.

Пример 1: Выпадающее меню с Headless UI (React)
React JSX
import { Menu, Transition } from '@headlessui/react'
import { Fragment } from 'react'

export default function DropdownMenu() {
  return (
    <Menu as="div" className="relative inline-block text-left">
      <div>
        <Menu.Button className="inline-flex w-full justify-center rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500">
          Опции
          <svg 
            className="ml-2 -mr-1 h-5 w-5" 
            xmlns="http://www.w3.org/2000/svg" 
            viewBox="0 0 20 20" 
            fill="currentColor" 
            aria-hidden="true"
          >
            <path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
          </svg>
        </Menu.Button>
      </div>
      <Transition
        as={Fragment}
        enter="transition ease-out duration-100"
        enter-from="transform opacity-0 scale-95"
        enter-to="transform opacity-100 scale-100"
        leave="transition ease-in duration-75"
        leave-from="transform opacity-100 scale-100"
        leave-to="transform opacity-0 scale-95"
      >
        <Menu.Items className="absolute right-0 mt-2 w-56 origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
          <div className="px-1 py-1">
            <Menu.Item>
              {({ active }) => (
                <button
                  className={`${
                    active ? 'bg-blue-500 text-white' : 'text-gray-900'
                  } group flex w-full items-center rounded-md px-2 py-2 text-sm`}
                >
                  Редактировать
                </button>
              )}
            </Menu.Item>
            <Menu.Item>
              {({ active }) => (
                <button
                  className={`${
                    active ? 'bg-blue-500 text-white' : 'text-gray-900'
                  } group flex w-full items-center rounded-md px-2 py-2 text-sm`}
                >
                  Дублировать
                </button>
              )}
            </Menu.Item>
          </div>
        </Menu.Items>
      </Transition>
    </Menu>
  )
}
Пример 2: Модальное окно с Headless UI (Vue)
Vue
<script setup>
import { ref } from 'vue'
import { Dialog, DialogPanel, DialogTitle, TransitionChild, TransitionRoot } from '@headlessui/vue'

const isOpen = ref(false)

function closeModal() {
  isOpen.value = false
}

function openModal() {
  isOpen.value = true
}
</script>

<template>
  <div>
    <button 
      type="button" 
      @click="openModal" 
      class="rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700"
    >
      Открыть диалог
    </button>
  </div>

  <TransitionRoot appear :show="isOpen" as="template">
    <Dialog as="div" @close="closeModal" class="relative z-10">
      <TransitionChild
        as="template"
        enter="duration-300 ease-out"
        enter-from="opacity-0"
        enter-to="opacity-100"
        leave="duration-200 ease-in"
        leave-from="opacity-100"
        leave-to="opacity-0"
      >
        <div class="fixed inset-0 bg-black bg-opacity-25" />
      </TransitionChild>

      <div class="fixed inset-0 overflow-y-auto">
        <div class="flex min-h-full items-center justify-center p-4 text-center">
          <TransitionChild
            as="template"
            enter="duration-300 ease-out"
            enter-from="opacity-0 scale-95"
            enter-to="opacity-100 scale-100"
            leave="duration-200 ease-in"
            leave-from="opacity-100 scale-100"
            leave-to="opacity-0 scale-95"
          >
            <DialogPanel class="w-full max-w-md transform overflow-hidden rounded-2xl bg-white p-6 text-left align-middle shadow-xl transition-all">
              <DialogTitle as="h3" class="text-lg font-medium leading-6 text-gray-900">
                Заголовок модального окна
              </DialogTitle>
              <div class="mt-2">
                <p class="text-sm text-gray-500">
                  Это модальное окно, созданное с помощью Headless UI и стилизованное через Tailwind CSS. Оно полностью доступно, поддерживает управление с клавиатуры и имеет анимированные переходы.
                </p>
              </div>

              <div class="mt-4">
                <button
                  type="button"
                  class="inline-flex justify-center rounded-md border border-transparent bg-blue-100 px-4 py-2 text-sm font-medium text-blue-900 hover:bg-blue-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500"
                  @click="closeModal"
                >
                  Закрыть
                </button>
              </div>
            </DialogPanel>
          </TransitionChild>
        </div>
      </div>
    </Dialog>
  </TransitionRoot>
</div>
Пример 3: Переключатель (Switch) с Headless UI
React JSX
import { useState } from 'react'
import { Switch } from '@headlessui/react'

export default function Toggle() {
  const [enabled, setEnabled] = useState(false)

  return (
    <div className="flex items-center space-x-4">
      <Switch
        checked={enabled}
        onChange={setEnabled}
        className={`${
          enabled ? 'bg-blue-600' : 'bg-gray-200'
        } relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2`}
      >
        <span className="sr-only">Включить уведомления</span>
        <span
          className={`${
            enabled ? 'translate-x-6' : 'translate-x-1'
          } inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}
        />
      </Switch>
      <span className="text-sm font-medium text-gray-700">
        {enabled ? 'Включено' : 'Выключено'}
      </span>
    </div>
  )
}

Интеграция Headless UI с Tailwind CSS позволяет создавать доступные и интерактивные компоненты интерфейса, фокусируясь на функциональности, в то время как Tailwind обеспечивает гибкие возможности стилизации. Эта комбинация особенно полезна при создании сложных интерфейсов с высокими требованиями к доступности.

Полезные ссылки и ресурсы

  1. Официальный сайт Tailwind CSS
  2. Подробная документация
  3. Готовые компоненты и шаблоны
  4. Головные иконки для Tailwind
  5. Tailwind Play - онлайн-песочница
  6. Плагины для Tailwind
  7. Tailwind CSS на GitHub
  8. Tailwind CSS IntelliSense - расширение для VS Code
Администратор
22 мая 2025 г.
#tailwindcss
#web-development
#tutorial
#ru

Поделиться статьёй

Поделиться через: