Олег Марков
Гайд по созданию адаптивных интерфейсов с Nuxt UI
Введение
Создание современных веб-приложений невозможно представить без адаптивных интерфейсов. Пользователи заходят на сайты со смартфонов, планшетов, десктопов и даже с телевизоров — с такими условиями нужно считаться при проектировании UI. Один из удобных и мощных инструментов для разработки на Vue экосистеме — это Nuxt UI. Если вы используете Nuxt (особенно на версии 3 и выше), вы получаете доступ к готовым компонентам, интеграции Tailwind CSS и инструментам, которые позволят быстро собрать визуально привлекательные адаптивные решения.
В этом гайде мы подробно рассмотрим, как именно строить адаптивную верстку и поведение интерфейса с помощью Nuxt UI. Я покажу на примерах, как подходить к созданию компонентов, использовать гриды, медиазапросы, управлять состоянием компонентов в зависимости от экрана пользователя. Вы узнаете тонкости настройки и способы избежать распространенных ошибок.
Установка и настройка Nuxt UI
Прежде чем мы перейдем к адаптации интерфейсов, давайте разберемся, как быстро запустить Nuxt проект с поддержкой Nuxt UI.
Установка Nuxt UI в проект
Если у вас уже есть проект Nuxt, выполните эти команды:
npm install @nuxt/ui
Или, если вы предпочитаете Yarn:
yarn add @nuxt/ui
Теперь добавьте модуль в ваш nuxt.config.ts
или nuxt.config.js
:
export default defineNuxtConfig({
modules: ['@nuxt/ui'],
})
Это подключит Nuxt UI глобально ко всему вашему приложению.
Tailwind CSS и Nuxt UI
Nuxt UI тесно интегрирован с Tailwind CSS. Если у вас Tailwind еще не установлен, добавьте его командой:
npx nuxi@latest module add tailwindcss
Убедитесь, что в вашем проекте есть настроенный файл tailwind.config.js
— он понадобится для продвинутой адаптации интерефейса.
Адаптивные интерфейсы — это необходимость в современном веб-разработке. Они позволяют создавать приложения, которые корректно отображаются на различных устройствах с разными размерами экранов. Nuxt UI предоставляет удобные инструменты для создания адаптивных интерфейсов. Если вы хотите детальнее погрузиться в мир Nuxt, освоить все его тонкости и стать настоящим профессионалом — приходите на наш большой курс Nuxt - fullstack Vue фреймворк. На курсе 129 уроков и 13 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Проверка работы UI компонентов
Проверьте установку, добавив в любой из ваших компонентов следующий код:
<template>
<UButton color="primary">Тестовая кнопка</UButton>
</template>
Если кнопка рендерится корректно, значит все работает.
Основы адаптивности в Nuxt UI
Принципы адаптации интерфейса
Адаптивность — это когда интерфейс автоматически подстраивается под размер и тип устройства пользователя. Основная задача — чтобы контент выглядел отлично и был удобен для любого экрана.
С помощью Nuxt UI эта задача решается сочетанием возможностей Tailwind CSS, системы готовых компонентов и опций респонсивности, встроенных в сами компоненты.
Давайте перечислим, какие инструменты у вас будут под рукой:
- Система breakpoint'ов Tailwind (sm, md, lg, xl и др.)
- Готовые компоненты Nuxt UI с поддержкой управления размером/видимостью
- Директивы и классы (например, скрытие блоков на разных экранах)
- Работа с CSS-свойствами через props компонентов
- Управление layout через flex, grid, контейнеры
Теперь перейдём к примерам.
Использование респонсивных классов Tailwind
Nuxt UI компоненты поддерживают Tailwind классы. Вот как вы можете скрыть или показать элемент в зависимости от ширины экрана:
<template>
<div>
<UButton class="hidden md:inline-block">Видно только на десктопе</UButton>
<UButton class="inline-block md:hidden">Видно только на мобильном</UButton>
</div>
</template>
В этом примере первая кнопка показывается только на экранах от md (768px) и выше, а вторая только на мобильных.
Гибкая подстройка размеров
У любого Nuxt UI компонента вы можете контролировать размер через Tailwind классы:
<template>
<UButton class="w-full sm:w-auto px-4 py-2">Адаптивная кнопка</UButton>
</template>
Кнопка будет разной ширины на мобильных и десктопах.
Работа с адаптивными грид-системами
Nuxt UI не ограничивает вас в использовании CSS Grid или Flexbox — наоборот, компоненты проектируются так, чтобы быть максимально совместимыми с Tailwind Layout Utilities.
Пример создания адаптивной сетки товаров
<template>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<UCard v-for="item in products" :key="item.id">
<template #header>
{{ item.title }}
</template>
{{ item.description }}
</UCard>
</div>
</template>
<script setup>
// Массив товаров
const products = [
{ id: 1, title: 'Товар 1', description: 'Описание 1' },
{ id: 2, title: 'Товар 2', description: 'Описание 2' },
// Добавьте еще элементы для теста
]
</script>
В этом примере на мобильном будет одна колонка, на планшете две, на десктопе — четыре. Благодаря Tailwind вы легко можете добавить еще больше breakpoint'ов или изменить количество колонок.
Использование props для управления респонсивностью
Некоторые компоненты Nuxt UI уже имеют встроенные props для адаптивного поведения. Например, компонент UContainer
:
<template>
<UContainer>
<div class="py-4">
Контент в адаптивном контейнере
</div>
</UContainer>
</template>
UContainer
сам будет ограничивать максимальную ширину в зависимости от размера экрана. Вы можете управлять этим через параметры:
<UContainer :max-width="{ default: 'xl', sm: 'full' }">
// Контент здесь
</UContainer>
В этом случае на мобильных контейнер будет на всю ширину, а на больших экранах — максимум xl.
Практические паттерны реализации адаптивных элементов
Адаптивное меню (бургер-меню)
Один из стандартных кейсов — переключение горизонтального меню на иконку "бургер" на мобильных.
<template>
<nav class="flex items-center justify-between py-4">
<span class="text-xl font-bold">Логотип</span>
<ul class="hidden md:flex gap-6">
<li><a href="#">Главная</a></li>
<li><a href="#">Каталог</a></li>
<li><a href="#">Контакты</a></li>
</ul>
<UButton
class="md:hidden"
icon="i-heroicons-bars-3"
@click="menuOpen = !menuOpen"
/>
<!-- Мобильное меню -->
<div v-if="menuOpen" class="fixed top-0 left-0 w-full h-full bg-black bg-opacity-60 z-50 flex flex-col items-center">
<UButton icon="i-heroicons-x-mark" @click="menuOpen = false" class="self-end m-4" />
<ul class="flex flex-col gap-8 mt-16 text-white text-xl">
<li><a href="#">Главная</a></li>
<li><a href="#">Каталог</a></li>
<li><a href="#">Контакты</a></li>
</ul>
</div>
</nav>
</template>
<script setup>
import { ref } from 'vue'
const menuOpen = ref(false) // Управление видимостью бургер-меню
</script>
Здесь навигация видна на десктопе, а на мобильном появляется бургер-иконка, раскрывающая боковое меню.
Обработка адаптивных изображений
Nuxt UI позволяет интегрировать с оптимизированными компонентами изображений (например, используя NuxtImg
из @nuxt/image
). Пример адаптации изображений:
<template>
<NuxtImg
:src="imageUrl"
class="w-full h-48 object-cover rounded-lg md:h-64"
alt="Пример изображения"
sizes="(max-width: 768px) 100vw, 33vw"
/>
</template>
<script setup>
const imageUrl = 'https://source.unsplash.com/random/800x600'
// Здесь можно использовать динамические/статичные пути
</script>
Благодаря классам и параметру sizes
изображение будет занимать нужное пространство на разных экранах.
Управление отображением/скрытием элементов
Многие элементы интерфейса нужно отображать только для определенных устройств. Для этого есть специальные классы и логику в компонентах.
Пример: показываем контактный телефон только на мобильных
<template>
<div>
<span class="inline-block md:hidden">+7 900 123-45-67</span>
</div>
</template>
Комбинирование Tailwind и props Nuxt UI
Мощная особенность Nuxt UI — возможность смешивать Tailwind utility-классы и пропсы компонентов.
Пример для кнопки:
<UButton
label="Купить"
size="md"
class="block w-full sm:w-auto text-base sm:text-lg"
/>
На мобильном кнопка займет всю ширину и станет чуть мельче, на десктопе — компактнее и текст крупнее.
Гибкая адаптация форм
Формы требуют особого внимания: поля могут быть на всю ширину на мобильном, но компактнее на больших экранах.
<template>
<form class="grid grid-cols-1 md:grid-cols-2 gap-4">
<UInput label="Имя" class="w-full" />
<UInput label="Email" class="w-full" />
<!-- На мобильном столбцом, на десктопе — в две колонки -->
<UButton type="submit" class="md:col-span-2 w-full md:w-auto">
Отправить
</UButton>
</form>
</template>
Динамическое управление адаптивностью через JavaScript
В некоторых случаях недостаточно только CSS-классов — требуется реагировать в JavaScript на размер экрана.
Использование composable useBreakpoints
Nuxt UI интегрирует composable-хуки для отслеживания размеров экрана.
import { useBreakpoints } from '@vueuse/core'
const breakpoints = useBreakpoints({
mobile: 0,
tablet: 768,
desktop: 1280,
})
const isMobile = breakpoints.smaller('tablet')
Теперь в компоненте вы можете использовать isMobile.value
, чтобы условно управлять поведением.
Пример: показываем разный контент
<template>
<div>
<div v-if="isMobile">Это мобильная версия</div>
<div v-else>Это десктопная версия</div>
</div>
</template>
<script setup>
import { useBreakpoints } from '@vueuse/core'
const breakpoints = useBreakpoints({
mobile: 0,
tablet: 768,
desktop: 1280,
})
const isMobile = breakpoints.smaller('tablet') // true, если < 768px
</script>
Лучшие практики и типовые ошибки
Что стоит использовать всегда
- Составляйте интерфейс так, чтобы минимальное жизнеспособное отображение (mobile first) выглядело достойно.
- Используйте utility-классы Tailwind для процентов, маргинов, паддингов на каждом breakpoint — это уменьшит потребность писать явные медиазапросы.
- Оборачивайте сложные группы элементов в компоненты и выносите всю адаптивность в их шаблон.
- По возможности старайтесь использовать встроенные возможности Nuxt UI (например, параметры размера, компонентов меню и т.п.).
Типичные ошибки
- Забывают проверять, как элементы ведут себя на промежуточных размерах экрана (например, phablet).
- Используют фиксированные размеры вместо адаптивных (используйте
max-w
,w-full
,flex
). - Не тестируют табуляцию и доступность при различных состояниях (проверьте клавиатуру и скринридеры).
- Дублируют элементы в шаблоне, когда достаточно скрытия через CSS.
Интеграция с внешними UI-библиотеками
Nuxt UI дружит с большинством сторонних Vue-компонентов, если вы сохраняете подход Tailwind и не переопределяете стили через !important. Для сложного поведения используйте slot-ы и классы, как показано выше.
Заключение
Nuxt UI создаёт прочную базу для быстрой и комфортной разработки адаптивных, масштабируемых интерфейсов. Сочетание гибких компонентов, полноценных Tailwind-утилит и composable функций покрывает большинство потребностей современного фронтенда. Постарайтесь выносить логику в переиспользуемые компоненты и не бойтесь активно комбинировать props и utility-классы. Особое внимание уделяйте не только красоте, но и интерактивности — так ваш проект станет удобен для использования на всех устройствах без лишних доработок.
Создание адаптивных интерфейсов с Nuxt UI — это лишь один из аспектов разработки веб-приложений на Nuxt. Чтобы создавать полноценные и качественные приложения, необходимо также освоить множество других навыков, таких как работа с данными, роутинг, стилизация и деплой. На курсе Nuxt - fullstack Vue фреймворк вы получите комплексные знания и практический опыт, необходимые для создания современных веб-приложений на Nuxt. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Nuxt прямо сегодня.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как добавить собственные breakpoint'ы для Tailwind в Nuxt UI проекте?
Откройте файл tailwind.config.js
и добавьте новые значения в секцию theme.extend.screens
. Например:js
module.exports = {
theme: {
extend: {
screens: {
'xs': '480px', // Новый breakpoint
},
},
},
}
После этого вы сможете использовать классы вида xs:bg-red-500
.
Можно ли полностью переопределить стили Nuxt UI компонентов для уникального дизайна?
Да. Используйте class-атрибуты и стилизуйте компоненты через Tailwind классы или пишите кастомные CSS-модули. Для полного изменения глобальных переменных измените соответствующие значения в tailwind.config.js
и настройках темы Nuxt UI.
Как реализовать server-side рендеринг при адаптивном отображении контента?
Для server-side определения breakpoint используйте cookie или user-agent парсинг на сервере. Передайте нужные данные через initial state и реагируйте в компонентах. На клиенте уже используйте CSS-классы и составные значения.
Как сделать так, чтобы адаптивные изображения подгружались для retina-экранов?
Используйте компонент NuxtImg
(или другой с поддержкой srcset и sizes), передавайте несколько вариантов размеров/разрешений. Атрибуты srcset
и sizes
обеспечат подгрузку нужной версии под DPI экрана.
Почему респонсивные классы Tailwind не работают в динамически создаваемых компонентах Nuxt?
Скорее всего, Tailwind не видит их при компиляции, если используете динамические названия классов или шаблонные строки. Убедитесь, что используемые классы есть прямо в шаблоне или добавьте их в safelist в tailwind.config.js
(раздел safelist
).
Постройте личный план изучения Nuxt до уровня Middle — бесплатно!
Nuxt — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Nuxt
Лучшие курсы по теме

Nuxt
Антон Ларичев
TypeScript с нуля
Антон Ларичев