JSFiddle - React, Tailwind, and code Playground
by piiantom
HTML
<div class="container">
<div class="btn ripple" ripple="true">Click here<span class="ripple"></span></div>
</div>
CSS
.btn {
border: none;
padding: 20px;
margin: 10px;
font-size: 14px;
outline: 0;
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, .2);
border-radius: 4px;
text-align: center;
width: 200px;
transition: all 250ms;
cursor: pointer;
background-color: #3b59ce;
color: #fff;
text-transform: uppercase;
font-family: Arial;
user-select: none;
}
.btn:active {
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, .3);
}
[ripple] {
position: relative;
overflow: hidden;
}
[ripple] .ripple {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
opacity: 0;
background-color: #fff;
border-radius: 100%;
width: 10px;
height: 10px;
transform: translate(-50%, -50%) scale(0);
}
[ripple] .ripple.show{
opacity: 0.3;
transition: transform 450ms, opacity 150ms;
transform: translate(-50%, -50%) scale(40);
}
[ripple] .ripple.show.hide{
opacity: 0;
transform: translate(-50%, -50%) scale(60);
}
JavaScript
showRipple = function(e) {
var ripple = this;
var size = ripple.offsetWidth;
var pos = ripple.getBoundingClientRect();
var x = e.pageX - pos.left;
var y = e.pageY - pos.top;
var style = 'top:' + y + 'px; left: ' + x + 'px;';
var rippler = ripple.getElementsByClassName("ripple")[0];
rippler.classList.remove("show");
rippler.classList.remove("hide");
rippler.setAttribute('style', style);
rippler.classList.add("show");
};
hideRipple = function() {
var ripple = this;
setTimeout(function(){
var rippler = ripple.getElementsByClassName("ripple")[0];
rippler.classList.add("hide");
setTimeout(function(){
rippler.classList.remove("show");
rippler.classList.remove("hide");
}, 250);
}, 250);
}
ripples = document.querySelectorAll('[ripple]');
for (i = 0, len = ripples.length; i < len; i++) {
ripple = ripples[i];
ripple.addEventListener('mousedown', showRipple);
ripple.addEventListener('mouseup', hideRipple);
}