v-bottom-sheet — это компонент библиотеки Vuetify,
предназначенный для создания выдвигающихся панелей с нижней части
экрана. Он используется для отображения дополнительного контента,
действий или информации, не загромождая основной интерфейс. В отличие от
диалогов (v-dialog), нижние листы занимают нижнюю часть
экрана и могут быть частично видимыми, что делает их удобными для
мобильных интерфейсов.
Для работы с v-bottom-sheet необходимо убедиться, что
проект настроен с Vuetify и поддерживает версию 3+. Основная структура
компонента выглядит следующим образом:
<template>
<v-bottom-sheet v-model="sheet">
<v-card>
<v-card-title>Детали</v-card-title>
<v-card-text>
Здесь размещается содержимое нижнего листа.
</v-card-text>
<v-card-actions>
<v-btn text @click="sheet = false">Закрыть</v-btn>
</v-card-actions>
</v-card>
</v-bottom-sheet>
<v-btn @click="sheet = true">Открыть лист</v-btn>
</template>
<script>
export default {
data() {
return {
sheet: false
}
}
}
</script>
Ключевые моменты:
v-model управляет видимостью нижнего
листа.v-bottom-sheet можно использовать любые
Vuetify-компоненты, включая карточки, списки, формы и кнопки.v-model на false.v-bottom-sheet поддерживает несколько важных свойств для
тонкой настройки поведения:
persistent — предотвращает закрытие листа при клике вне
него.scrim — затемнение фона за листом, можно задать цвет
или прозрачность.max-width и max-height — ограничение
размеров панели.inset — сдвиг листа от краев экрана, полезно для
iOS-подобного интерфейса.Пример использования с кастомными параметрами:
<v-bottom-sheet v-model="sheet" persistent :scrim="0.6" max-width="400" inset>
<v-card>
<v-card-title>Фильтры поиска</v-card-title>
<v-card-text>
<v-text-field label="Поиск по имени"></v-text-field>
<v-select :items="['Опция 1', 'Опция 2']" label="Выберите категорию"></v-select>
</v-card-text>
<v-card-actions>
<v-btn text @click="sheet = false">Применить</v-btn>
</v-card-actions>
</v-card>
</v-bottom-sheet>
v-bottom-sheet автоматически использует анимацию
выдвижения снизу, но можно дополнительно настраивать переходы с помощью
слотов и классов:
transition — позволяет заменить стандартную анимацию на
любую из встроенных (slide-y-transition,
fade-transition) или кастомную.v-slot:activator — удобный способ привязать открытие
листа к кнопке или другому элементу без явного изменения
v-model.Пример с activator и кастомной анимацией:
<v-bottom-sheet transition="slide-y-reverse-transition" v-model="sheet">
<template v-slot:activator="{ props }">
<v-btn v-bind="props">Открыть панель</v-btn>
</template>
<v-card>
<v-card-title>Информация</v-card-title>
<v-card-text>Контент с кастомной анимацией выезда снизу.</v-card-text>
</v-card>
</v-bottom-sheet>
Нижние листы идеально подходят для:
Возможности интеграции с другими компонентами Vuetify:
Для мобильных интерфейсов важно:
inset для корректного отображения
на устройствах с вырезами.max-height или
height="auto" для предотвращения выхода контента за
экран.scrim и
persistent, чтобы не мешать основному UX.Пример адаптивного листа:
<v-bottom-sheet v-model="sheet" max-height="80vh" inset scrim="0.5">
<v-card>
<v-card-title>Мобильные фильтры</v-card-title>
<v-card-text>
<v-select :items="categories" label="Категория"></v-select>
<v-slider label="Цена" v-model="price" min="0" max="1000"></v-slider>
</v-card-text>
<v-card-actions>
<v-btn text @click="sheet = false">Применить</v-btn>
</v-card-actions>
</v-card>
</v-bottom-sheet>
v-bottom-sheet можно открывать и закрывать программно, а
также управлять его содержимым динамически:
export default {
data() {
return {
sheet: false,
content: 'Начальный текст'
}
},
methods: {
openSheet(newContent) {
this.content = newContent;
this.sheet = true;
}
}
}
Использование:
<v-btn @click="openSheet('Динамически обновленный текст')">Открыть лист</v-btn>
<v-bottom-sheet v-model="sheet">
<v-card>
<v-card-text>{{ content }}</v-card-text>
</v-card>
</v-bottom-sheet>
Такой подход позволяет создавать универсальные панели, которые подстраиваются под контекст приложения и данные пользователя.
Нижние листы в Vuetify предоставляют мощный инструмент для организации интерфейса, объединяя удобство диалогов и гибкость мобильного UX.