логотип PurpleSchool
логотип PurpleSchool

Гайд по созданию адаптивных интерфейсов с 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).

Стрелочка влевоИнтеграция Tailwind CSS в NuxtИнтеграция Swiper в NuxtСтрелочка вправо

Постройте личный план изучения Nuxt до уровня Middle — бесплатно!

Nuxt — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Nuxt

Генерация статического сайта с помощью NuxtКак использовать useAsyncData в NuxtКак использовать SVG в NuxtКоманды для запуска NuxtРабота с JSON-данными в NuxtКак настроить HTML-шаблон в NuxtГенерация статического сайта с помощью NuxtРуководство по получению данных с Fetch в NuxtКак отключить определенные функции в NuxtРабота с данными в Nuxt с помощью useNuxtDataНастройка и использование cookie в NuxtГайд по аутентификации (auth) в NuxtКак создавать API-маршруты в Nuxt
Использование Vite для ускорения разработки в NuxtРуководство по использованию TypeScript в NuxtКак запустить Nuxt-приложение в productionКак работает Server-Side Rendering SSR в NuxtНастройка и оптимизация серверной части Nuxt-приложенияРуководство по настройке маршрутизации в NuxtКакие проекты разумно реализовывать на NuxtИнструкция по управлению пакетами NPM в NuxtИнтеграция Node.js для Nuxt-приложенияНастройка мета-тегов для SEO в NuxtНастройка и использование HTTPS в NuxtКак отлавливать и обрабатывать ошибки в NuxtКак развернуть Nuxt приложение в DockerРуководство по развертыванию приложений в Nuxt CloudКак оптимизировать сборку на NuxtИнтеграция Laravel и Nuxt
Открыть базу знаний

Лучшие курсы по теме

Иконка ракетыСкоро!
изображение курса

Nuxt

Антон Ларичев
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий