JSFiddle - React, Tailwind, and code Playground
HTML
<div id="some-overlay" class="overlay">
<div class="overlay--body">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Repellendus autem qui, quas totam. Odio corporis alias sequi
numquam a itaque qui, enim dicta, eos minima rem, error, labore aliquid. Odio.
</p>
<a class="js-btn-overlay" data-action="close" href="#some-overlay">close</a>
</div>
</div>
<a class="js-btn-overlay" data-action="toggle" href="#some-overlay">toggle</a>
CSS
.overlay {
visibility: hidden;
overflow: auto;
position: fixed;
top: 0; left: 0;
bottom: 0; right: 0;
background: #fff;
}
.overlay.-active {
visibility: visible;
}
.overlay[data-animation="in"] {
animation: overlay-in 0.5s ease 1;
}
.overlay[data-animation="out"] {
animation: overlay-out 0.5s ease 1;
}
@keyframes overlay-in {
0% {
visibility: hidden;
opacity: 0;
transform: translateX(100%);
}
100% {
visibility: visible;
opacity: 1;
transform: translateX(0);
}
}
@keyframes overlay-out {
0% {
visibility: visible;
opacity: 1;
transform: translateX(0);
}
100% {
visibility: hidden;
opacity: 0;
transform: translateX(-100%);
}
}
.overlay--body {
max-width: 400px;
margin: auto;
padding: 60px 30px;
}
JavaScript
Overlay = (function() {
var mill = {};
mill.init = function() {
$('.js-btn-overlay').on('click', function(e) {
e.preventDefault();
var trigger = $(e.target),
target = e.target.hash,
action = mill[trigger.attr('data-action')];
if (action) action(target);
});
};
mill.open = function(target) {
target = $(target);
target.addClass('-active');
target.attr('data-animation', 'in');
};
mill.close = function(target) {
target = $(target);
target.removeClass('-active');
target.attr('data-animation', 'out');
};
mill.toggle = function(target) {
target = $(target);
if (target.hasClass('-active')) {
mill.close(target);
}
else {
mill.open(target);
}
};
return mill;
})();
//
Overlay.init();