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 icon-close" data-action="close" href="#some-overlay"><span></span></a>
</div>
</div>
<a class="js-btn-overlay" data-action="toggle" href="#some-overlay">toggle</a>
CSS
body {
margin: 50px;
}
.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;
}
/* Icon close */
.icon-close {
display: block;
width: 4em;
height: 4em;
position: relative;
font-size: 8px;
transform: rotate(45deg);
}
.icon-close:before,
.icon-close:after,
.icon-close span:before,
.icon-close span:after {
content: "";
position: absolute;
top: 0; left: 0;
bottom: 0; right: 0;
background: #111;
transition: 0.2s ease;
transition-property: transform, width, height;
}
.icon-close:before,
.icon-close:after {
width: 50%;
height: 0.5em;
margin: auto 0;
}
.icon-close:after {
margin-left: auto;
}
.icon-close span:before,
.icon-close span:after {
width: 0.5em;
height: 50%;
margin: 0 auto;
}
.icon-close span:after {
margin-top: auto;
}
/* hover */
.icon-close:hover:before {
transform: translateX(-1em);
}
.icon-close:hover:after {
transform: translateX(1em);
}
.icon-close:hover span:before {
transform: translateY(-1em);
}
.icon-close:hover span:after {
transform: translateY(1em);
}
/* active */
.icon-close:active:before,
.icon-close:active:after {
width: 25%;
}
.icon-close:active...
JavaScript
Overlay = (function() {
var mill = {};
mill.init = function() {
$('.js-btn-overlay').on('click', function(e) {
e.preventDefault();
var trigger = $(this),
target = this.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();