Want to make your Elementor buttons stand out? In this tutorial series, I’ll show you 6 stunning button hover effects that you can add to your WordPress site using just custom CSS – no plugins needed!
📺 Watch the Full Tutorial Series
Table of Contents
Effect #1: Vertical Slide Up (Text Push)
Transform your boring buttons into eye-catching interactive elements! This effect pushes the button text up vertically and replaces it with new text sliding up from below.
✨ What You’ll Learn:
- How to create a smooth vertical text transition
- Customizing the hover text
- Adjusting animation speed
- BONUS: Auto-animation option with JavaScript (optional)
📋 How to Apply:
Step 1: Add CSS Class
- Select your button widget in Elementor
- Go to Advanced → CSS Classes
- Add:
slide-up-button
Step 2: Add Custom CSS
- Go to Elementor → Custom Code → Add CSS
- Paste the CSS code below
💻 CSS Code:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
.slide-up-button .elementor-button { overflow: hidden; position: relative; box-sizing: border-box; } /* Animate the ENTIRE content wrapper (icon + text together) */ .slide-up-button .elementor-button-content-wrapper { display: flex; align-items: center; transition: transform 0.3s ease; position: relative; } /* Keep original styles for text-only buttons */ .slide-up-button .elementor-button-text { display: block; } .slide-up-button .elementor-button::before { content: "\f3fe\00a0\00a0 New Text Here"; /* \00a0 = non-breaking space */ white-space: pre; /* This preserves the spaces! */ /* Inherit ALL text properties from the button */ font-size: inherit; font-weight: inherit; font-family: "Font Awesome 5 Brands", "Font Awesome 6 Brands", var(--e-global-typography-text-font-family), sans-serif; /* Font Awesome for icon, then inherit for text */ line-height: inherit; letter-spacing: inherit; color: inherit; position: absolute; top: 100%; left: 0; right: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; transition: transform 0.3s ease; } .slide-up-button .elementor-button:hover .elementor-button-content-wrapper { transform: translateY(-190%); /* Adjust this value based on your button padding */ } .slide-up-button .elementor-button:hover::before { transform: translateY(-100%); } |
🎯 Customization Options:
- Change the hover text in
content: "New Text Here" - Adjust speed by modifying
0.3svalue - Change
translateY(-100%)to increase/decrease slide distance
🔥 Optional: Auto-Animation
Want the button to animate automatically? Add this JavaScript!
Add Extra CSS Class
- Select your button widget in Elementor
- Go to Advanced → CSS Classes
- Add:
auto-animatebesideslide-up-buttonso you will haveslide-up-button auto-animate
JavaScript Code:
|
1 2 3 4 5 6 7 8 9 10 11 |
<script> document.addEventListener('DOMContentLoaded', function() { // Find all buttons with slide-up-button class const buttons = document.querySelectorAll('.slide-up-button'); buttons.forEach(function(button) { // Add the auto-animate class to enable animation button.classList.add('auto-animate'); }); }); </script> |
Additional CSS for Auto-Animation:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/* Auto-Animation Keyframes - MUST match the hover values */ @keyframes autoSlideUpText { 0%, 45% { transform: translateY(0); } 50%, 95% { transform: translateY(-190%); /* MUST match the hover value in first css*/ } 100% { transform: translateY(0); } } @keyframes autoSlideUpBefore { 0%, 45% { transform: translateY(0); } 50%, 95% { transform: translateY(-100%); } 100% { transform: translateY(0); } } /* Apply animation when auto-animate class is added */ .slide-up-button.auto-animate .elementor-button-content-wrapper { animation: autoSlideUpText 4s ease-in-out infinite; } .slide-up-button.auto-animate .elementor-button::before { animation: autoSlideUpBefore 4s ease-in-out infinite; } /* Pause animation on hover */ .slide-up-button.auto-animate .elementor-button:hover .elementor-button-content-wrapper, .slide-up-button.auto-animate .elementor-button:hover::before { animation-play-state: paused; } |
Effect #2: Horizontal Slide
Make your button text slide horizontally! The original text slides out to the right while new text slides in from the left.
✨ What You’ll Learn:
- Creating horizontal text animations
- Customizing slide direction
- Perfect for call-to-action buttons
📋 How to Apply:
Step 1: Add CSS Class
- CSS Class:
horizontal-slide-button
Step 2: Add Custom CSS
💻 CSS Code:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
.horizontal-slide-button .elementor-button { overflow: hidden; position: relative; } .horizontal-slide-button .elementor-button-content-wrapper { transition: transform 0.4s ease; } .horizontal-slide-button .elementor-button::before { content: "\f3fe\00a0\00a0 Slide Right!"; /* \00a0 = non-breaking space */ white-space: pre; /* This preserves the spaces! */ /* Inherit ALL text properties from the button */ font-size: inherit; font-weight: inherit; font-family: "Font Awesome 5 Brands", "Font Awesome 6 Brands", var(--e-global-typography-text-font-family), sans-serif; /* Font Awesome for icon, then inherit for text */ line-height: inherit; letter-spacing: inherit; color: inherit; position: absolute; left: -100%; top: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; transition: left 0.4s ease; } .horizontal-slide-button .elementor-button:hover .elementor-button-content-wrapper { transform: translateX(150%); /* Adjust this value based on your padding */ } .horizontal-slide-button .elementor-button:hover::before { left: 0; } |
🎯 Pro Tips:
- Change
left: -100%toleft: 100%to reverse the slide direction - Modify
"Slide Right!"to your desired hover text - Adjust
0.4sfor faster or slower animations
Effect #3: Fill From Bottom
This elegant effect fills your button with color from the bottom up, creating a smooth paint-fill animation.
✨ What You’ll Learn:
- Creating fill animations
- Working with transparent backgrounds
- Border to solid color transitions
📋 How to Apply:
Step 1: Add CSS Class
- CSS Class:
fill-bottom-button
Step 2: Add Custom CSS
💻 CSS Code:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
.fill-bottom-button .elementor-button { position: relative; overflow: hidden; } .fill-bottom-button .elementor-button::before { content: ""; position: absolute; bottom: 0; left: 0; width: 100%; height: 0; background: #667eea; transition: height 0.4s ease; z-index: 0; } .fill-bottom-button .elementor-button-content-wrapper { position: relative; z-index: 1; } .fill-bottom-button .elementor-button:hover { color: white; } .fill-bottom-button .elementor-button:hover::before { height: 100%; } |
🎯 Customization Options:
- Change
bottom: 0totop: 0for fill from top - Modify colors in
borderandbackgroundproperties - Adjust
height: 100%for partial fills
Effect #4: Border Draw
An impressive effect where borders draw themselves around your button from opposite corners, creating a sophisticated animation.
✨ What You’ll Learn:
- Creating animated borders with pseudo-elements
- Corner-to-corner animations
- Professional-looking outline effects
📋 How to Apply:
Step 1: Add CSS Class
- CSS Class:
border-draw-button
Step 2: Add Custom CSS
💻 CSS Code (Variation 1):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
.border-draw-button .elementor-button { position: relative; transition: border-color 0.3s ease, color 0.3s ease; /* Border radius will be set in Elementor */ } /* Optional: Set custom values via CSS variables */ .border-draw-button { --border-width: 2px; --border-color: #667eea; --hover-color: #764ba2; --border-extend: 10px; /* How much the border extends beyond corners */ } .border-draw-button .elementor-button::before, .border-draw-button .elementor-button::after { content: ""; position: absolute; width: 0; height: 0; transition: all 0.4s ease; box-sizing: border-box; } /* Top-left corner with extension */ .border-draw-button .elementor-button::before { top: calc(var(--border-width, 2px) * -1); left: calc(var(--border-width, 2px) * -1); border-top: var(--border-width, 2px) solid var(--border-color, currentColor); border-left: var(--border-width, 2px) solid var(--border-color, currentColor); border-top-left-radius: inherit; /* Inherit border radius */ border-bottom-right-radius: inherit; /* Add this */ } /* Bottom-right corner with extension */ .border-draw-button .elementor-button::after { bottom: calc(var(--border-width, 2px) * -1); right: calc(var(--border-width, 2px) * -1); border-bottom: var(--border-width, 2px) solid var(--border-color, currentColor); border-right: var(--border-width, 2px) solid var(--border-color, currentColor); border-bottom-right-radius: inherit; /* Inherit border radius */ border-top-left-radius: inherit; /* Add this */ } .border-draw-button .elementor-button:hover { border-color: transparent !important; } .border-draw-button .elementor-button:hover::before, .border-draw-button .elementor-button:hover::after { width: calc(100% + var(--border-extend, 10px)); height: calc(100% + var(--border-extend, 10px)); } |
Or 💻 CSS Code (Variation 2):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
.border-draw-button .elementor-button { position: relative; /* Elementor sets: background, border, color, padding, etc. */ transition: border-color 0.3s ease, color 0.3s ease; } /* Optional: Set custom values via CSS variables */ .border-draw-button { --border-width: 2px; /* Change this to match your design */ --border-color: #667eea; /* Change this to match your design */ --hover-color: #764ba2; /* Text color on hover */ } .border-draw-button .elementor-button::before, .border-draw-button .elementor-button::after { content: ""; position: absolute; width: 0; height: 0; transition: all 0.4s ease; box-sizing: border-box; border-radius: inherit; } .border-draw-button .elementor-button::before { top: 0; left: 0; border-top: var(--border-width, 2px) solid var(--border-color, currentColor); border-left: var(--border-width, 2px) solid var(--border-color, currentColor); } .border-draw-button .elementor-button::after { bottom: 0; right: 0; border-bottom: var(--border-width, 2px) solid var(--border-color, currentColor); border-right: var(--border-width, 2px) solid var(--border-color, currentColor); } .border-draw-button .elementor-button:hover { border-color: transparent !important; /* Hide original border */ color: var(--hover-color, #764ba2); /* Optional: change text color */ } .border-draw-button .elementor-button:hover::before, .border-draw-button .elementor-button:hover::after { width: 100%; height: 100%; } |
🎯 Customization Tips:
- Change border colors to match your brand
- Adjust
border-widthfor thicker/thinner lines - Modify
0.4sfor animation speed
Effect #5: 3D Flip Effect
Create a stunning 3D flip animation that reveals text on the “back” of your button. Perfect for modern, interactive designs!
✨ What You’ll Learn:
- Working with CSS 3D transforms
- Creating flip card effects
- Perspective and transform-style properties
📋 How to Apply:
Step 1: Add CSS Class
- CSS Class:
flip-3d-button
Step 2: Add Custom CSS
💻 CSS Code:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
.flip-3d-button { perspective: 1000px; } .flip-3d-button .elementor-button { position: relative; transform-style: preserve-3d; transition: transform 0.6s; } .flip-3d-button .elementor-button::before { content: "Flipped!"; position: absolute; top: 0; left: 0; width: 100%; height: 140%; display: flex; align-items: center; justify-content: center; background: #764ba2; color: white; transform: rotateX(-90deg); transform-origin: center bottom; transition: transform 0.6s; } .flip-3d-button .elementor-button:hover { transform: rotateX(50deg); } |
🎯 Pro Tips:
- Change
rotateXtorotateYfor horizontal flip - Modify
"Flipped!"to your desired back text - Adjust
0.6sfor flip speed - Change perspective value for different 3D depth
Effect #6: Shutter Effect
Two colored panels slide in from top and bottom simultaneously, creating a dramatic shutter effect that fills your button.
✨ What You’ll Learn:
- Creating dual-panel animations
- Synchronized transitions
- Dramatic fill effects
📋 How to Apply:
Step 1: Add CSS Class
- CSS Class:
shutter-button
Step 2: Add Custom CSS
💻 CSS Code:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
.shutter-button .elementor-button { position: relative; overflow: hidden; } /* Make sure content wrapper is above the animation */ .shutter-button .elementor-button-content-wrapper { position: relative; z-index: 1; } .shutter-button .elementor-button::before, .shutter-button .elementor-button::after { content: ""; position: absolute; width: 100%; height: 0; left: 0; background: #667eea; transition: height 0.3s ease; z-index: 0; } .shutter-button .elementor-button::before { top: 0; } .shutter-button .elementor-button::after { bottom: 0; } .shutter-button .elementor-button:hover { color: white; } .shutter-button .elementor-button:hover::before, .shutter-button .elementor-button:hover::after { height: 51%; } |
🎯 Customization Options:
- Change
height: 51%to adjust panel meeting point - Modify for horizontal shutters by changing width/height
- Adjust colors to match your design
- Change
0.3sfor faster/slower effect