Create hover underline animation in TailwindCSS
If you want to improve the aesthetics of your website a little but don't want to use grandiose effects, a simple underline animation can be a good solution.
It's not intrusive, but still a bit more than the default functionality, which helps to brighten up the design. It looks like this:
Concept
The implementation isn't too complicated either. The concept is to place an absolute positioned div tag inside the element. This div tag will give the underline. We will resize the with of this div element during the animation.
Implementation
Let's look at a concrete example. Create a menu component with three menu items:
<div class="flex p-4 bg-slate-100">
<a class="p-2 px-4" href="#"> Home </a>
<a class="p-2 px-4" href="#"> Products </a>
<a class="p-2 px-4" href="#"> Resources </a>
</div>
Add the previously mentioned div elements to each menu item as the next step. We can control the thickness of the line by adjusting the height of the div, and we can increase the distance from the text by adjusting the top margin.
<div class="flex p-4 bg-slate-100">
<a class="p-2 px-4" href="#">
Home
<div class="bg-amber-500 h-[2px]"></div>
</a>
<a class="p-2 px-4" href="#">
Products
<div class="bg-amber-500 h-[2px]"></div>
</a>
<a class="p-2 px-4" href="#">
Resources
<div class="bg-amber-500 h-[2px]"></div>
</a>
</div>
Set the width of the div element to 0 using the w-0
class, to hide it by default. The hover event should cause the width to be set to full width using the w-full
class.
The question is how can we change the width value?
We can not use the hover
pseudo property of the div
element as we want the animation if the user mouse is over the parent element. To solve this problem, we can use the group
utility class in TailwindCSS. On the parent element, we put the group
class, and then on the div
element, we monitor the group hover event. So instead of using hover:w-full
notation, we use group-hover:w-full
.
<div class="flex p-4 bg-slate-100">
<a class="p-2 px-4 group" href="#">
Home
<div class="bg-amber-500 h-[2px] w-0 group-hover:w-full"></div>
</a>
<a class="p-2 px-4 group" href="#">
Products
<div class="bg-amber-500 h-[2px] w-0 group-hover:w-full"></div>
</a>
<a class="p-2 px-4 group" href="#">
Resources
<div class="bg-amber-500 h-[2px] w-0 group-hover:w-full"></div>
</a>
</div>
At this point, we have a simple hover effect without animation, that is similar to what you get by default with a link element. However, from here we can set the animation classes transition-all
and duration, for example duration-500
to get the final result:
<div class="flex p-4 bg-slate-100">
<a class="p-2 px-4 group" href="#">
Home
<div class="bg-amber-500 h-[2px] w-0 group-hover:w-full transition-all duration-500"></div>
</a>
<a class="p-2 px-4 group" href="#">
Products
<div class="bg-amber-500 h-[2px] w-0 group-hover:w-full transition-all duration-500"></div>
</a>
<a class="p-2 px-4 group" href="#">
Resources
<div class="bg-amber-500 h-[2px] w-0 group-hover:w-full transition-all duration-500"></div>
</a>
</div>
Resources