Почему Tailwind CSS стал стандартом адаптивной вёрстки
Tailwind CSS кардинально изменил подход к созданию адаптивных интерфейсов. Вместо написания медиа-запросов в отдельных CSS-файлах разработчик описывает адаптивное поведение прямо в разметке — рядом с компонентом, которому оно принадлежит.
К 2026 году Tailwind используют более 40% React- и Next.js-проектов. С выходом версии 4.0 фреймворк получил новые возможности: container queries, улучшенную систему цветов и нативную поддержку CSS cascade layers.
Адаптивный дизайн — это не просто «сделать чтобы не ломалось на мобильном». Это проектирование интерфейса, который оптимально работает на любом экране: от iPhone SE (375px) до 4K-монитора (3840px). В этой статье разберём все ключевые паттерны и приёмы.
Mobile-first: основа адаптивного дизайна
Принцип mobile-first
Tailwind CSS построен на принципе mobile-first. Это значит, что стили без префикса применяются ко всем экранам, а
префиксы sm:, md:, lg: и т.д. добавляют стили для экранов больше указанного размера.
<!-- Текст: маленький по умолчанию, больше на десктопе -->
<h1 class="text-2xl md:text-4xl lg:text-5xl">Заголовок</h1>
Этот код означает: размер шрифта 2xl на мобильных, 4xl начиная с 768px и 5xl начиная с 1024px.
Почему mobile-first, а не desktop-first
Три причины:
- 70%+ трафика — мобильный. Вы разрабатываете для большинства пользователей
- Progressive enhancement. Начинаете с минимума и добавляете — а не начинаете с максимума и урезаете
- Меньше кода. Mobile-first требует меньше переопределений стилей
Типичная ошибка
Не пишите стили для десктопа «по умолчанию» и не добавляйте мобильные через медиа-запросы:
<!-- Плохо: desktop-first -->
<div class="flex flex-row sm:flex-col">
<!-- На мобильном будет flex-col, на десктопе flex-row -->
<!-- Логика инвертирована! -->
</div>
<!-- Хорошо: mobile-first -->
<div class="flex flex-col sm:flex-row">
<!-- По умолчанию колонкой, на sm+ в строку -->
</div>
Система breakpoints в Tailwind CSS
Стандартные breakpoints
| Префикс | Минимальная ширина | Типичные устройства |
|---|---|---|
| (нет) | 0px | Все экраны |
sm |
640px | Крупные мобильные, мелкие планшеты |
md |
768px | Планшеты |
lg |
1024px | Ноутбуки |
xl |
1280px | Десктопы |
2xl |
1536px | Большие мониторы |
Кастомизация breakpoints
В tailwind.config.js можно изменить или добавить breakpoints:
// tailwind.config.js
module.exports = {
theme: {
screens: {
xs: "475px", sm: "640px", md: "768px", lg: "1024px", xl: "1280px", "2xl": "1536px", "3xl": "1920px", // Full HD
},
},
};
Диапазоны breakpoints
Tailwind позволяет задать стили для конкретного диапазона ширин через max-* модификаторы:
<!-- Только на мобильных (до md) -->
<div class="block md:hidden">Мобильное меню</div>
<!-- Только на md–lg -->
<div class="hidden md:block lg:hidden">Планшетный контент</div>
Адаптивная сетка: паттерны и примеры
Базовая адаптивная сетка
Самый распространённый паттерн — карточки, которые перестраиваются в зависимости от экрана:
<div
class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-4"
>
<div class="bg-white rounded-lg shadow p-6">Карточка 1</div>
<div class="bg-white rounded-lg shadow p-6">Карточка 2</div>
<div class="bg-white rounded-lg shadow p-6">Карточка 3</div>
<div class="bg-white rounded-lg shadow p-6">Карточка 4</div>
</div>
Результат: 1 колонка на мобильном, 2 на планшете, 3 на ноутбуке, 4 на десктопе.
Сетка с разными размерами элементов
Для лендингов часто нужна ассиметричная сетка:
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Главный блок — занимает 2 колонки на десктопе -->
<div class="lg:col-span-2 bg-blue-50 rounded-xl p-8">
<h2 class="text-xl lg:text-3xl font-bold">Основной контент</h2>
<p class="mt-4 text-gray-600">Описание продукта или услуги...</p>
</div>
<!-- Боковой блок -->
<div class="bg-gray-50 rounded-xl p-8">
<h3 class="text-lg font-semibold">Быстрые факты</h3>
<ul class="mt-4 space-y-2">
<li>500+ проектов</li>
<li>50+ разработчиков</li>
<li>5 лет на рынке</li>
</ul>
</div>
</div>
Auto-fill для динамического количества колонок
Когда количество элементов неизвестно заранее, используйте CSS Grid с auto-fill:
<div class="grid grid-cols-[repeat(auto-fill,minmax(280px,1fr))] gap-4">
<!-- Элементы автоматически заполнят доступное пространство -->
<div class="bg-white rounded-lg p-4">Элемент</div>
<!-- ... -->
</div>
Этот подход не требует breakpoints — сетка сама определяет, сколько колонок помещается.
Адаптивная навигация
Мобильное меню с hamburger-кнопкой
Навигация — первый элемент, который нужно адаптировать:
<nav class="bg-white shadow">
<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">
<a href="/" class="text-xl font-bold">Brand</a>
</div>
<!-- Десктопное меню (скрыто на мобильном) -->
<div class="hidden md:flex items-center space-x-8">
<a href="/services" class="text-gray-600 hover:text-gray-900">Услуги</a>
<a href="/portfolio" class="text-gray-600 hover:text-gray-900"
>Портфолио</a
>
<a href="/blog" class="text-gray-600 hover:text-gray-900">Блог</a>
<a
href="/contact"
class="bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700"
>
Связаться
</a>
</div>
<!-- Hamburger кнопка (видна только на мобильном) -->
<div class="md:hidden flex items-center">
<button class="p-2 rounded-md text-gray-600" aria-label="Меню">
<svg
class="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4 6h16M4 12h16M4 18h16"
/>
</svg>
</button>
</div>
</div>
</div>
<!-- Мобильное меню (раскрывается по клику) -->
<div class="md:hidden border-t">
<div class="px-2 pt-2 pb-3 space-y-1">
<a href="/services" class="block px-3 py-2 rounded-md text-gray-600"
>Услуги</a
>
<a href="/portfolio" class="block px-3 py-2 rounded-md text-gray-600"
>Портфолио</a
>
<a href="/blog" class="block px-3 py-2 rounded-md text-gray-600">Блог</a>
<a
href="/contact"
class="block px-3 py-2 bg-blue-600 text-white rounded-md"
>
Связаться
</a>
</div>
</div>
</nav>
Навигация для Mini Apps
В Telegram Mini Apps навигация ещё проще — Telegram предоставляет нативные кнопки «Назад» и «Главная». Но адаптивность самого контента всё равно нужна, особенно если Mini App поддерживает десктоп.
Hero-секция: адаптивные паттерны
Hero с текстом и изображением
<section class="relative overflow-hidden">
<div class="max-w-7xl mx-auto px-4 py-12 sm:py-16 lg:py-24">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-12 items-center">
<!-- Текст -->
<div class="text-center lg:text-left">
<h1
class="text-3xl sm:text-4xl lg:text-5xl xl:text-6xl font-bold tracking-tight"
>
Разработка сайтов
<span class="text-blue-600">под ключ</span>
</h1>
<p
class="mt-4 sm:mt-6 text-lg sm:text-xl text-gray-600 max-w-2xl mx-auto lg:mx-0"
>
Создаём лендинги и веб-приложения, которые приносят клиентов. Средняя
конверсия наших лендингов — 8%.
</p>
<div
class="mt-8 flex flex-col sm:flex-row gap-4 justify-center lg:justify-start"
>
<a
href="/contact"
class="bg-blue-600 text-white px-8 py-3 rounded-lg text-lg font-medium hover:bg-blue-700"
>
Обсудить проект
</a>
<a
href="/portfolio"
class="border border-gray-300 px-8 py-3 rounded-lg text-lg font-medium hover:bg-gray-50"
>
Портфолио
</a>
</div>
</div>
<!-- Изображение -->
<div class="order-first lg:order-last">
<img
src="/hero-image.webp"
alt="Пример проекта"
class="w-full max-w-md mx-auto lg:max-w-none rounded-2xl shadow-xl"
/>
</div>
</div>
</div>
</section>
Обратите внимание: на мобильном изображение идёт первым (order-first), а на десктопе — вторым (lg:order-last). Это
работает лучше, потому что на мобильном визуал привлекает внимание, а текст идёт ниже.




