Vuetify is a popular UI framework for Vue apps.
In this article, we’ll look at how to work with the Vuetify framework.
Hover
The v-hover
component lets us handle hover states for any component.
For example, we can write:
<template>
<v-container class="grey lighten-5">
<v-row>
<v-col>
<v-hover v-slot:default="{ hover }">
<v-card :elevation="hover ? 12 : 2" class="mx-auto" height="350" max-width="350">
<v-card-text class="my-4 text-center title">Hover over me!</v-card-text>
</v-card>
</v-hover>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
to add the hover functionality with the v-hover
component.
We can add the disabled
prop to v-hover
to disable hover effects.
Open/Close Delay
We can set a delay when opening or closing the hover effect with the open-delay
and close-delay
props.
For example, we can write:
<template>
<v-container class="grey lighten-5">
<v-row>
<v-col>
<v-hover v-slot:default="{ hover }" open-delay="200">
<v-card :elevation="hover ? 12 : 2" class="mx-auto" height="350" max-width="350">
<v-card-text class="my-4 text-center title">Hover over me!</v-card-text>
</v-card>
</v-hover>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
to set a 200ms open delay.
Hover List
We can make a hover list with the v-hover
component.
For example, we can write:
<template>
<v-container class="grey lighten-5">
<v-row>
<v-col>
<v-container class="pa-4 text-center">
<v-row class="fill-height" align="center" justify="center">
<template v-for="(item, i) in items">
<v-col :key="i" cols="12" md="4">
<v-hover v-slot:default="{ hover }">
<v-card :elevation="hover ? 12 : 2" :class="{ 'on-hover': hover }">
<v-img :src="item.img" height="225px">
<v-card-title class="title white--text">
<v-row class="fill-height flex-column" justify="space-between">
<p class="mt-4 subheading text-left">{{ item.title }}</p>
<div>
<p
class="ma-0 body-1 font-weight-bold font-italic text-left"
>{{ item.text }}</p>
<p
class="caption font-weight-medium font-italic text-left"
>{{ item.subtext }}</p>
</div>
</v-row>
</v-card-title>
</v-img>
</v-card>
</v-hover>
</v-col>
</template>
</v-row>
</v-container>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({
items: [
{
title: "Title",
text: "Text",
subtext: "Subtext",
img: "https://picsum.photos/200",
},
{
title: "Title",
text: "Text",
subtext: "Subtext",
img: "https://picsum.photos/200",
},
{
title: "Title",
text: "Text",
subtext: "Subtext",
img: "https://picsum.photos/200",
},
],
transparent: "rgba(255, 255, 255, 0)",
}),
};
</script>
We have 3 slides each in their own v-card
component.
They are inside a v-hover
component so that we see a hover effect when our mouse is over the square.
Transitions
We can add our own transitions for v-hover
.
For example, we can write:
<template>
<v-container class="grey lighten-5">
<v-row>
<v-col>
<v-hover v-slot:default="{ hover }">
<v-card class="mx-auto" color="grey lighten-4" max-width="600">
<v-img :aspect-ratio="16/9" src="[https://cdn.vuetifyjs.com/images/cards/kitchen.png](https://cdn.vuetifyjs.com/images/cards/kitchen.png)">
<v-expand-transition>
<div
v-if="hover"
class="d-flex transition-fast-in-fast-out orange darken-2 v-card--reveal display-3 white--text"
style="height: 100%;"
>$100.99</div>
</v-expand-transition>
</v-img>
<v-card-text class="pt-6" style="position: relative;">
<v-btn absolute color="orange" class="white--text" fab large right top>
<v-icon>mdi-cart</v-icon>
</v-btn>
<div class="font-weight-light grey--text title mb-2">Perfect meal</div>
</v-card-text>
</v-card>
</v-hover>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
name: "HelloWorld",
data: () => ({}),
};
</script>
<style>
.v-card--reveal {
align-items: center;
bottom: 0;
justify-content: center;
opacity: 0.5;
position: absolute;
width: 100%;
}
</style>
to add a v-expand-transition
to create our hover effect.
We display the price when we hover over the image.
The styles make the overlay text centered and translucent.
Conclusion
We can add hover effect with the v-hover
component.
The transition is built-in but we can also customize to what we want.