Адаптивный дизайн позволяет интерфейсу корректно отображаться на устройствах с разными размерами экранов, сохраняя функциональность и удобство использования. В Vue.js реализация адаптивного интерфейса опирается на реактивность компонентов, условный рендеринг и динамическое управление стилями.
В Vue.js для адаптивного дизайна ключевым инструментом является
привязка классов и стилей через :class и
:style. Примеры:
<template>
<div :class="{'mobile-layout': isMobile, 'desktop-layout': !isMobile}">
Контент страницы
</div>
</template>
<script>
export default {
data() {
return {
isMobile: false
};
},
mounted() {
this.checkScreen();
window.addEventListener('resize', this.checkScreen);
},
beforeUnmount() {
window.removeEventListener('resize', this.checkScreen);
},
methods: {
checkScreen() {
this.isMobile = window.innerWidth <= 768;
}
}
};
</script>
<style>
.mobile-layout {
font-size: 14px;
}
.desktop-layout {
font-size: 18px;
}
</style>
Ключевой момент: использование реактивного свойства
isMobile позволяет автоматически пересчитывать и применять
классы при изменении размера окна.
Composition API предоставляет более гибкий способ работы с реактивными данными и вычисляемыми свойствами:
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const isMobile = ref(false);
const checkScreen = () => {
isMobile.value = window.innerWidth <= 768;
};
onMounted(() => {
checkScreen();
window.addEventListener('resize', checkScreen);
});
onUnmounted(() => {
window.removeEventListener('resize', checkScreen);
});
</script>
<template>
<div :class="{ 'mobile-layout': isMobile, 'desktop-layout': !isMobile }">
Контент страницы
</div>
</template>
Composition API позволяет изолировать логику адаптивности в отдельные функции и легко переиспользовать их в разных компонентах.
Даже при использовании Vue.js важную роль играют традиционные CSS медиа-запросы:
.container {
padding: 20px;
}
@media (max-width: 768px) {
.container {
padding: 10px;
}
}
Особенность: сочетание реактивного состояния Vue и CSS медиа-запросов позволяет одновременно управлять поведением компонентов и стилями, обеспечивая полный контроль над адаптивным интерфейсом.
В больших приложениях полезно загружать разные версии компонентов для
разных экранов. В Vue это реализуется через динамический импорт и
v-if:
<template>
<component :is="currentComponent"></component>
</template>
<script>
import DesktopComponent from './DesktopComponent.vue';
import MobileComponent from './MobileComponent.vue';
export default {
data() {
return {
isMobile: window.innerWidth <= 768
};
},
computed: {
currentComponent() {
return this.isMobile ? MobileComponent : DesktopComponent;
}
}
};
</script>
Преимущество: позволяет уменьшить нагрузку на фронтенд и подгружать только необходимые ресурсы для конкретного устройства.
Vue не ограничивает использование современных CSS-технологий. Flexbox и Grid идеально подходят для построения адаптивной структуры компонентов:
<template>
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
</div>
</template>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
@media (max-width: 768px) {
.grid-container {
grid-template-columns: 1fr;
}
}
</style>
Рекомендация: комбинировать реактивные свойства Vue с возможностями CSS Grid и Flexbox для адаптации макета без перегрузки логики компонентов.
В приложениях с маршрутизацией можно отображать разные страницы или компоненты в зависимости от устройства:
const routes = [
{ path: '/dashboard', component: DesktopDashboard, meta: { mobileOnly: false } },
{ path: '/mobile-dashboard', component: MobileDashboard, meta: { mobileOnly: true } }
];
В навигации проверяется текущее состояние устройства и при необходимости выполняется редирект на подходящий маршрут. Это позволяет создавать специализированные интерфейсы без дублирования кода.
Библиотеки, такие как Vuetify, Quasar или BootstrapVue, предоставляют встроенные адаптивные компоненты, которые легко интегрируются с Vue:
<v-container fluid>
<v-row>
<v-col cols="12" md="6">
Контент для адаптивного макета
</v-col>
</v-row>
</v-container>
Преимущество: сокращение времени разработки и использование проверенных адаптивных решений.
:class и
:style.Эти методы позволяют построить гибкую и масштабируемую архитектуру интерфейса, полностью адаптированного под любые размеры экранов.