DEV Community

Sekti Wicaksono
Sekti Wicaksono

Posted on • Updated on

Fill Background Animation using CSS

Hello, ladies and gentlemen.
Recently I was trying to make button with background animation.

So I start with this html code:

<div class="outer">

  <h1>Left to Right</h1> &nbsp;
  <div class="outer__button button__left-right">
    <div class="text">Button</div>
  </div>&nbsp;

  <h1>Right to Left</h1> &nbsp;
  <div class="outer__button button__right-left">
    <div class="text">Button</div>
  </div>&nbsp;

  <h1>Top to Bottom</h1> &nbsp;
  <div class="outer__button button__top-bottom">
    <div class="text">Button</div>
  </div>&nbsp;

  <h1>Bottom to Top</h1> &nbsp;
  <div class="outer__button button__bottom-top">
    <div class="text">Button</div>
  </div>
</div>
Enter fullscreen mode Exit fullscreen mode

And I set the font family to Montserrat:

@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700;900&display=swap');

html {
  font-family: 'Montserrat', sans-serif;
}
Enter fullscreen mode Exit fullscreen mode

After that I set the layout into flex because I want the content into columns.

.outer {
  margin: 5em;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

h1 {
  color: teal;
  text-transform: uppercase;
}

.outer__button { 
  padding: .5em 1.5em;
  font-size: 2em;
  font-weight: 700;
  color: #000;
  text-transform: uppercase;
  margin-top: -1em;
  border-radius: 100vh;
}
Enter fullscreen mode Exit fullscreen mode

Now lets give fill background animation for the 1st button:

/* LEFT TO RIGHT */
.button__left-right {
  border: 2px solid black;
  background: linear-gradient(to right, #000 50%, #fff 50%);
  background-size: 200% 100%;
  background-position: bottom right;
  transition: all .7s ease-out;
}

.button__left-right:hover {
  border: 2px solid limegreen;
  background-position: bottom left;
  color: #fff;
}
Enter fullscreen mode Exit fullscreen mode

From the code above, I set background with linear-gradient(to right, #000 50%, #fff 50%), because I want the background move from left to right with black-white color. And I set background-size to 200% width and 100% height. When the width is bigger than 100% it will not fill the button with black, instead will be filled with white background.

Then, I set the animation stop at right position of the button so I put background-position: bottom right;. After that, because I want the animation start when hover I put background-position: bottom left; on hover state.

Now let's see the result:
Left to Right

It works :)
Let's add and modify linear-gradient, background-size and background-position to make other buttons have similar animation with different directions.

/* RIGHT TO LEFT */
.button__right-left {
  border: 2px solid black;
  background: linear-gradient(to left, #000 50%, #fff 50%);
  background-size: 200% 100%;
  background-position: bottom left;
  transition: all .7s ease-out;
}

.button__right-left:hover {
  border: 2px solid limegreen;
  background-position: bottom right;
  color: #fff;
}

/* TOP TO BOTTOM */
.button__top-bottom {
  border: 2px solid black;
  background: linear-gradient(to bottom, #000 50%, #fff 50%);
  background-size: 100% 200%;
  background-position: bottom left;
  transition: all .5s ease-out;
}

.button__top-bottom:hover {
  border: 2px solid limegreen;
  background-position: top left;
  color: #fff;
}

/* BOTTOM TO TOP */
.button__bottom-top {
  border: 2px solid black;
  background: linear-gradient(to top, #000 50%, #fff 50%);
  background-size: 100% 200%;
  background-position: top left;
  transition: all .5s ease-out;
}

.button__bottom-top:hover {
  border: 2px solid limegreen;
  background-position: bottom left;
  color: #fff;
}
Enter fullscreen mode Exit fullscreen mode

These are the result:
Right to Left
Top to Bottom
Bottom to Top

The full code are posted on my codepen link below: https://codepen.io/flyingduck92/pen/yLeEGNg

That's all folks. See you next time.
Happy coding!

Top comments (1)

Collapse
 
fcfn profile image
Peter Timoshevsky

Hey, thanks for your article. Could you perhaps help me with a similar, but a bit more complex, thing?