Директива v-ripple предназначена для
добавления визуального эффекта “всплеска” (ripple) при взаимодействии
пользователя с элементами интерфейса. Она имитирует распространение
волны от точки нажатия и часто используется на кнопках, карточках,
списках и других интерактивных компонентах, повышая отзывчивость
интерфейса и визуальную обратную связь.
Vuetify автоматически предоставляет директиву v-ripple
для всех компонентов, поддерживающих её. Для самостоятельного применения
на кастомных элементах достаточно добавить её в разметку:
<template>
<div v-ripple class="custom-button">
Нажми меня
</div>
</template>
<style>
.custom-button {
padding: 16px 32px;
background-color: #1976d2;
color: white;
border-radius: 4px;
cursor: pointer;
display: inline-block;
user-select: none;
text-align: center;
}
</style>
При клике на блок появится эффект волны, исходящей из точки нажатия.
Директива v-ripple поддерживает объект
конфигурации, позволяющий управлять поведением эффекта:
<div v-ripple="{ class: 'my-ripple', center: true, circle: true }">
Центрированный круглый ripple
</div>
Основные параметры:
class – CSS-класс для кастомного оформления волны.center – если true, волна начинается из
центра элемента, а не из точки клика.circle – применяет эффект круговой формы, удобен для
круглых кнопок или иконок.color – позволяет задать цвет волны через
CSS-переменную --v-ripple-color или через собственный
класс.Многие компоненты Vuetify уже имеют встроенный ripple-эффект. Например:
<v-btn color="primary" v-ripple>
Кнопка с ripple
</v-btn>
<v-card v-ripple>
<v-card-title>Карточка с ripple</v-card-title>
</v-card>
<v-list-item v-ripple>
Элемент списка с эффектом
</v-list-item>
Для кнопок, карточек и списков директива активируется автоматически,
но её можно отключить через атрибут ripple="false":
<v-btn color="secondary" :ripple="false">
Без ripple
</v-btn>
Директива поддерживает динамическое управление через булевое значение:
<div :v-ripple="isRippleEnabled ? {} : false">
Динамический ripple
</div>
false, эффект отключается.Для глубокого контроля можно создавать собственные стили через
параметр class или переопределяя стандартные
CSS-переменные:
.my-ripple {
--v-ripple-color: rgba(255, 0, 0, 0.3);
--v-ripple-duration: 800ms;
}
--v-ripple-color – цвет волны.--v-ripple-duration – длительность анимации.--v-ripple-scale – масштаб расширения волны.Пример применения:
<div v-ripple="{ class: 'my-ripple', center: true }">
Красный ripple
</div>
Директива позволяет интегрировать эффект с собственными обработчиками событий:
<div
v-ripple
@mousedown="handleMouseDown"
@mouseup="handleMouseUp"
>
Элемент с ripple и кастомными событиями
</div>
<script>
export default {
methods: {
handleMouseDown() {
console.log('Нажатие зафиксировано');
},
handleMouseUp() {
console.log('Отпускание кнопки');
}
}
}
</script>
Ripple визуально синхронизируется с действиями пользователя, не мешая собственным обработчикам событий.
v-ripple только на
корневом элементе.circle и center
следует учитывать размеры элемента, чтобы волна не выходила за границы
или не была слишком маленькой.Vuetify позволяет управлять ripple через API программно, например,
используя this.$vuetify.ripple для вызова эффекта вручную
на любом элементе:
<template>
<div ref="rippleTarget" class="ripple-box">
Ripple вручную
</div>
<v-btn @click="triggerRipple">Запустить эффект</v-btn>
</template>
<script>
export default {
methods: {
triggerRipple() {
this.$vuetify.ripple.show(this.$refs.rippleTarget, {
event: { x: 50, y: 50 }, // координаты для начала ripple
center: true,
});
}
}
}
</script>
<style>
.ripple-box {
width: 200px;
height: 100px;
background-color: #e0e0e0;
display: flex;
align-items: center;
justify-content: center;
}
</style>
Такой подход позволяет запускать эффект независимо от стандартных событий клика.
v-ripple в Vuetify является мощным инструментом для
создания отзывчивого и визуально привлекательного интерфейса,
предоставляя гибкие возможности кастомизации и программного управления,
сохраняя при этом простоту интеграции на уровне компонентов и отдельных
элементов.