Fun Animated Button Hover Effect In CSS

Hover effects are one of those things we know, see and hear about — but the implementation is generally pretty basic. In this tutorial, we’re going to create a button hover effect, but with a fun twist to it.


This is what we’ll be making:

While it looks like we’re animating the buttons, what’s actually happening here is that we’re just transitioning the height of the blue background.

Here is the base HTML for the buttons above:

<button class="btn btn1">Hello</button>
<button class="btn btn2">Hello</button>
<button class="btn btn3">Hello</button>
<button class="btn btn4">Hello</button>

There is a base btn class to configure the dimensions and general theme of the button. The btn1 to btn4 classes deal with the background color and transition direction.

There isn’t really anything fancy for the HTML. Let’s take a look at the CSS:

.btn{
  border: 1px solid #3498db;
  background: none;
  padding: 10px 20px;
  font-size: 20px;
  font-family: "Arial";
  cursor:pointer;
  margin:10px;
  transition: 0.8s all linear;
  position:relative;
  overflow: hidden;
}

The styling on the .btn class is pretty simple — a border, no background (so a transparent button that takes on whatever color background you’ve got for your page), some padding, the font size, font family, and making the cursor into a pointer instead of the usual boring click arrow.

There are, however, some points of interest you should take note of.

  • position:relative; — this is used to contain all the positioning and sizing-related things that we are going to do inside the button.
  • overflow: hidden; — this will hide anything that sits outside your button.
  • transition: 0.8s all linear; — to create the animation effect when we hover over our buttons.

Here’s what it currently looks like:

Let’s style the text inside the button.

.btn1, .btn3{
  color: #3498db;
}
.btn2, .btn4{
  color: #fff;
}

The 2nd and 4th button is going to be white with a blue background, while the 1st and 3rd button will have a transparent background.

Here’s what they look like now:

Let’s add the hover effects for text.

.btn1:hover, .btn3:hover{
  color: #fff;
}
.btn2:hover, .btn4:hover{
  color: #3498db;
}

Here’s what it looks like after the CSS has been applied:

Now for the background hover effect.

.btn::before{
  content: "";
  position:absolute;
  left:0;
  height: 100%;
  width:100%;
  background:#3498db;
  z-index: -1;
  transition: 0.8s all ease-in-out;
}

What’s happening here is that we’re using ::before to add another background layer. The z-index is set to -1 so it doesn’t interfere with our clickability. The transition effect is ease-in-out so that it creates a variable animation effect, rather than just a straight animation.

When height is set to 100%, this is what the background currently looks like:

I haven’t set the top positioning because I want to set it on the individual button to determine their movement direction.

Now, I’m going to play with the border-radius to create a curved effect.

.btn1::before, .btn3::before{
  top: 0;
  border-radius:  0 0 100% 5% ;
}
.btn2::before, .btn4::before{
  bottom: 0;
  border-radius:  100% 5% 0 0 ;
}

Here is what it looks like:

We want the blue background to be the animated part. To do this, go back to your .btn::before selector and set the height to 0 .

Because we’ve already got the transitions set on btn, it’s just a matter of changing the height of the individual buttons in context based on their state.

.btn2::before, .btn4::before{
  height: 180%;
}
.btn1:hover::before, .btn3:hover::before{
  height: 180%;
}
.btn2:hover::before, .btn4:hover::before{
  height: 0;
}

And there you have it!

f you remove the border at .btn, you can get cool looking buttons like this:

Here is the full CSS:

body{
  maring: 0;
  padding: 0;
}
.container{
  text-align: center;
  margin-top: 360px;
}
.btn{
  border: 1px solid #3498db;
  background: none;
  padding: 10px 20px;
  font-size: 20px;
  font-family: "Arial";
  cursor:pointer;  margin:10px;
  transition: 0.8s all linear;
  position:relative;
  overflow: hidden;
}
.btn1, .btn3{
  color: #3498db;
}
.btn2, .btn4{
  color: #fff;
}
.btn1:hover, .btn3:hover{
  color: #fff;
}
.btn2:hover, .btn4:hover{
  color: #3498db;
}
.btn::before{
  content: "";
  position:absolute;
  left:0;
  height: 0;
  width:100%;
  background:#3498db;
  z-index: -1;
  transition: 0.8s all ease-in-out;
}
.btn1::before, .btn3::before{
  top: 0;
  border-radius:  0 0 100% 5% ;
}
.btn2::before, .btn4::before{
  bottom: 0;
  border-radius:  100% 5% 0 0 ;
}
.btn2::before, .btn4::before{
  height: 180%;
}
.btn1:hover::before, .btn3:hover::before{
  height: 180%;
}
.btn2:hover::before, .btn4:hover::before{
  height: 0;
}