[[!meta title="Shiny, Animated CSS Buttons"]]
[[!meta date="2021-04-27"]]
Everyone can appreciate fancy, animated buttons - but often times they come with a performance cost: *JavaScript*. Luckily for us, we can create our very own shiny, animated buttons with pure CSS.
## The Demo
![Four buttons that shine when hovered](/public/images/shiny-buttons.png)
[Live CodePen Example](https://codepen.io/bradleytaunt/pen/oNBQevj)
## The HTML
Nothing fancy going on here, just a set of `ahref` elements with specific `button` classes added:
Green Button
Blue Button
Orange Button
Purple Button
## The CSS
First we set the default base styling for all the buttons. We also place the inner text into `span` elements (I will explain why in a little bit):
.button {
background: white;
border: 1px solid #a5b1c2;
border-radius: 6px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
color: #111111;
display: inline-block;
margin: 1rem auto;
min-width: 180px;
overflow: hidden;
padding: 15px 30px;
position: relative;
text-align: center;
text-decoration: none;
transition: .3s ease-in-out all;
}
.button span {
position: relative;
z-index: 2;
}
Now we need to create our *shiny* element that will pass across the button on `hover` or `focus`. For this object we will use the `before` pseudo element:
.button:before {
background: linear-gradient(transparent 0%, rgba(255,255,255,0.6) 50%, transparent 100%);
content:'';
height: 200%;
position: absolute;
right: calc(100% + 20px);
top: -55%;
transform: rotate(-70deg);
transition: .6s ease-in-out right;
width: 80px;
z-index: 0;
}
Next, we tell the `before` element to swipe across the main `.button` parent element when the user hovers or focuses on it. Remember placing our inner content into a `span` element? That insures that our shiny/swipe element doesn't position itself *over* the text, but instead flows under it:
.button:hover:before {
right: -100%;
}
/* Extra visual styling for buttons on hover - optional */
.button:hover, button:focus {
box-shadow: 0 8px 12px rgba(0,0,0,0.1), inset 0 10px 30px rgba(255,255,255,0.3), inset 0 2px 2px rgba(255,255,255,0.2);
color: white;
}
All that's left is adding some visual flare to each individual button - in this case background-color and border-color:
.button.green:hover, button.green:focus { background: #20bf6b; border-color: #20bf6b; }
.button.blue:hover, button.blue:focus { background: #0984e3; border-color: #0984e3; }
.button.orange:hover, button.orange:focus { background: #ff793f; border-color: #ff793f; }
.button.purple:hover, button.purple:focus { background: #6c5ce7; border-color: #6c5ce7; }
## Browser Support
These buttons work across all browsers flawlessly. See the details [on the caniuse report itself](https://caniuse.com/css-gencontent).
## The Live CodePen
You can find the live demo embedded at the top of this post, or [directly on CodePen here](https://codepen.io/bradleytaunt/pen/oNBQevj).