Олег Марков
Организация сеток и гридов для верстки интерфейсов на Vue
Введение
Эффективная организация сеток и гридов является основой современной вёрстки интерфейсов, особенно при разработке SPA на Vue. От того, насколько правильно выбрана и реализована структура сетки, напрямую зависит масштабируемость, адаптивность и поддерживаемость вашего проекта. Вы узнаете о базовых принципах построения сеток на Vue, вариантах реализации с нуля, интеграции решений на CSS Grid и Flexbox, а также о том, как использовать UI-фреймворки для ускорения процесса разработки.
Сеточная система для интерфейсов: теория и способы организации
Почему важно использовать сетки?
Сетка — это структурная основа интерфейса, которая распределяет пространство на странице между элементами. Главные плюсы использования сеток:
- Удобство при проектировании и изменении макета
- Адаптивность под разные устройства
- Единообразие внешнего вида и поведение элементов
- Упрощение сопровождения и масштабирования приложения
Основные подходы
Давайте рассмотрим три базовых способа организации сетки во Vue-проектах:
- CSS Grid — мощный инструмент для создания любых сеток
- Flexbox — проще в освоении, полезен для строк и колонок
- Готовые UI-фреймворки (Vuetify, Element Plus, BootstrapVue) — предлагают готовые сеточные компоненты
Сейчас пошагово разберём каждый из этих способов.
Изучение сеток и гридов — важный шаг для создания адаптивных и привлекательных интерфейсов на Vue.js. Но для разработки по-настоящему сложных и функциональных приложений необходимо также понимать, как организовать компоненты, управлять состоянием и обеспечивать навигацию между страницами. Если вы хотите получить комплексные знания и навыки в разработке Vue-приложений, приходите на наш большой курс Vue.js 3, Vue Router и Pinia. На курсе 173 уроков и 21 упражнение, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Организация сетки при помощи CSS Grid во Vue
CSS Grid позволяет создавать двухмерные сетки с явным позиционированием элементов как по горизонтали, так и по вертикали.
Пример базовой сетки с помощью CSS Grid
Смотрите, я покажу вам, как реализовать простую сетку 3x2 во Vue без сторонних библиотек:
<template>
<div class="grid-container">
<div class="grid-item" v-for="n in 6" :key="n">
Элемент {{ n }}
</div>
</div>
</template>
<style scoped>
.grid-container {
display: grid; /* Включаем Grid-контекст */
grid-template-columns: repeat(3, 1fr); /* 3 колонки */
grid-template-rows: repeat(2, 120px); /* 2 строки высотой по 120px */
gap: 16px; /* Отступы между ячейками */
}
.grid-item {
background: #f2f2f2;
border: 1px solid #ccc;
display: flex;
align-items: center; /* Вертикальное выравнивание */
justify-content: center; /* Горизонтальное выравнивание */
font-size: 20px;
}
</style>
Обратите внимание, как легко масштабируется код — достаточно поменять количество колонок или строк в стилях.
Адаптивная сетка с Grid
Теперь посмотрим, как адаптировать сетку под разные экраны. Для этого используем auto-fit и minmax:
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 16px;
}
Такая запись означает: на больших экранах элементы будут располагаться в несколько колонок, но никогда не станут меньше 220px. На мобильных колонок станет меньше, и сетка останется читаемой.
Продвинутая компоновка с Grid Areas
Можно задать именованные области (areas) и размещать элементы по именам:
<template>
<div class="layout">
<header class="header">Шапка</header>
<aside class="sidebar">Меню</aside>
<main class="content">Контент</main>
<footer class="footer">Подвал</footer>
</div>
</template>
<style scoped>
.layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 40px;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
height: 100vh;
}
.header { grid-area: header; background: #d4f1f9; }
.sidebar { grid-area: sidebar; background: #e9edc9; }
.content { grid-area: content; background: #fefaec; }
.footer { grid-area: footer; background: #dbe7e4; }
</style>
Теперь вы увидели, насколько удобно управлять раскладкой с помощью grid areas.
Flexbox для организации простых сеток во Vue
Flexbox удобен для создания линейных (одномерных) сеток — например, строк карточек или горизонтальных меню.
Базовый пример сетки на Flexbox
Реализуем горизонтальную строку карточек:
<template>
<div class="row">
<div class="card" v-for="item in ['alpha', 'beta', 'gamma']" :key="item">
{{ item }}
</div>
</div>
</template>
<style scoped>
.row {
display: flex; /* Включаем flex-контекст */
gap: 12px; /* Отступы между элементами */
flex-wrap: wrap; /* Позволяем элементам переноситься на новую строку */
}
.card {
min-width: 180px;
background: #ececec;
padding: 24px;
border-radius: 9px;
flex: 1 1 0px; /* Карточка растягивается, но не сжимается меньше контента */
text-align: center;
}
</style>
Здесь основное свойство — flex-wrap, с его помощью карточки можно адаптировать под разные размеры экрана.
Вертикальное и горизонтальное выравнивание
Flexbox позволяет легко управлять выравниванием:
align-itemsуправляет вертикальюjustify-content— горизонтальным выравниванием
Для примера:
.row {
display: flex;
align-items: center; /* Центрируем по вертикали */
justify-content: space-between; /* Равномерно распределяем по горизонтали */
}
Использование готовых UI-фреймворков для сеток в Vue
Многие разработчики предпочитают использовать готовые библиотеки для ускорения работы и получения дополнительных возможностей. Давайте рассмотрим самые популярные фреймворки: Vuetify, Element Plus и BootstrapVue.
Сетки во Vuetify
Vuetify предлагает мощную 12-колоночную сетку с компонентами <v-container>, <v-row>, <v-col>. Смотрите пример использования:
<template>
<v-container>
<v-row>
<v-col cols="6" md="4">Колонка 1</v-col>
<v-col cols="6" md="4">Колонка 2</v-col>
<v-col cols="12" md="4">Колонка 3</v-col>
</v-row>
</v-container>
</template>
Комментарии:
cols="6"— колонка занимает 6/12 ширины (50%) на мобильныхmd="4"— колонка будет 4/12 (33%) на экранахmdи выше
Vuetify сам заботится о media-правилах и отступах, упрощая адаптивность.
Особенности управления отступами в Vuetify
Вы можете управлять промежутками между колонками с помощью свойства gutter:
<v-row :gutter="24">
<v-col cols="6">A</v-col>
<v-col cols="6">B</v-col>
</v-row>
BootstrapVue: Сетки с привычным синтаксисом
BootstrapVue базируется на Bootstrap 4, его сетка органично интегрирована во Vue через компоненты <b-container>, <b-row>, <b-col>. Вот как выглядит строка из трёх колонок:
<template>
<b-container>
<b-row>
<b-col md="4">Один</b-col>
<b-col md="4">Два</b-col>
<b-col md="4">Три</b-col>
</b-row>
</b-container>
</template>
Те же правила: всего 12 колонок, удобная адаптивность через props (md, sm, lg), поддержка выравнивания с помощью классов (align-items-center, justify-content-end и др.).
Сетка в Element Plus
В Element Plus существует компонентная сетка с <el-row> и <el-col>. Пример:
<template>
<el-row :gutter="20">
<el-col :span="8">Колонка 1</el-col>
<el-col :span="8">Колонка 2</el-col>
<el-col :span="8">Колонка 3</el-col>
</el-row>
</template>
Здесь сетка также из 12 частей, и через параметр span вы определяете, сколько их займет колонка. Отступы (gutter) задаются у строки.
Динамическая генерация сетки во Vue с помощью массивов
Vue прекрасно справляется с динамикой. Например, если количество элементов у вас заранее неизвестно, вы всегда можете сформировать сетку программно:
<template>
<div class="grid">
<div
v-for="(item, idx) in items"
:key="item.id"
class="grid-item"
>
{{ item.label }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, label: 'Яблоко' },
{ id: 2, label: 'Груша' },
{ id: 3, label: 'Киви' },
// ... можно динамически расширять
]
};
}
};
</script>
<style scoped>
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 14px;
}
.grid-item {
background: #f7fafc;
border: 1px solid #dedede;
padding: 14px;
text-align: center;
}
</style>
Как видите, любой массив объектов может быть элегантно выведен в сетке.
Лучшие практики и советы по организации сеток во Vue
Разделяйте логику и представление
Избегайте написания больших блоков JS и CSS в одном компоненте. Старайтесь декомпозировать сетку, разбив компонент на ячейки-контейнеры и отдельные элементы.
Используйте SCSS для сложных сеток
SCSS помогает создавать повторяющиеся шаблоны для сеток, устанавливать переменные и миксины для колонок, что упрощает стилизацию.
Не злоупотребляйте "магическими" числами
Старайтесь использовать переменные и относительные единицы (em, rem, %) для ширин и отступов, чтобы ваше приложение было более гибким.
Не забывайте про семантику
Если у вас гриды представляют таблицы данных или списки, используйте правильные семантические теги (table, ul, li), это повысит доступность приложения.
Заключение
Организация сеток и гридов во Vue — фундаментальный навык для фронтенд-разработчика. Независимо от выбранного подхода — кастомного CSS, нативных возможностей Grid/Flexbox или готовых UI-библиотек, важно осознанно выбирать инструменты в зависимости от задач проекта. Разобравшись в ключевых подходах, вы сможете быстро создавать адаптивные, масштабируемые интерфейсы и ускорить разработку сложных SPA-приложений на Vue.
Верстка сеток и гридов — важный, но не единственный аспект создания привлекательных Vue-приложений. Чтобы создавать по-настоящему профессиональные решения, нужно уверенно владеть маршрутизацией, управлением состоянием и другими важными аспектами. На нашем курсе Vue.js 3, Vue Router и Pinia вы получите все необходимые знания и навыки. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Vue прямо сегодня.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как сделать так, чтобы колонка в сетке автоматически сохраняла соотношение сторон (например, квадраты)?
Используйте свойство aspect-ratio (поддерживается современными браузерами):
.grid-item {
aspect-ratio: 1 / 1; /* Квадрат */
}
Если нужна поддержка старых браузеров — используйте padding-bottom: 100% в комбинации с абсолютным позиционированием вложенного контента.
Как добавить анимацию при перестроении сетки?
Воспользуйтесь <transition-group> от Vue и CSS-анимациями:
<transition-group name="fade" tag="div" class="grid">
<div v-for="item in items" :key="item.id" class="grid-item">
{{ item.label }}
</div>
</transition-group>
Допишите CSS-анимацию для класса .fade-enter-active, .fade-leave-active.
Как реализовать сетку, в которой некоторые элементы занимают сразу несколько колонок или строк?
В CSS Grid используйте свойства grid-column и grid-row:
.grid-item.special {
grid-column: span 2; /* Занять две колонки */
grid-row: span 2; /* Занять две строки */
}
Добавляйте класс special к нужному элементу.
Как реализовать вложенные сетки во Vue?
Просто вложите один .grid внутрь другого — это особенно удобно для карточек со своим внутренним макетом. Не забудьте применять соответствующие стили в каждом уровне вложенности.
Что делать, если нужна одинаковая высота элементов в строке на Flexbox?
Используйте свойство align-items: stretch у контейнера-строки, а у элементов уберите фиксированную высоту (или задайте ее авто).
Постройте личный план изучения Vue до уровня Middle — бесплатно!
Vue — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Vue
Лучшие курсы по теме

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