JSFiddle - React, Tailwind, and code Playground
HTML
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.css">
<script src=" https://cdnjs.cloudflare.com/ajax/libs/classie/1.0.1/classie.js"></script>
<!-- Navigation Menu -->
<p><button id="trigger-overlay" type="button">menu</button></p>
<div class="overlay overlay-slidedown">
<button type="button" class="overlay-close"></button>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About us</a></li>
<li><a href="#">Categories</a></li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Events</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Contact us</a></li>
</ul>
</nav>
</div>
CSS
/* Overlay closing cross */
.overlay .overlay-close {
width: 80px;
height: 80px;
position: absolute;
right: 20px;
top: 20px;
overflow: hidden;
border: none;
background: url(../img/cross.png) no-repeat center center;
text-indent: 200%;
color: transparent;
outline: none;
z-index: 100;
}
/* Menu style */
.overlay nav {
text-align: center;
position: relative;
top: 50%;
height: 60%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
letter-spacing: 10px;
}
.overlay ul {
text-transform: uppercase;
list-style: none;
padding: 0;
margin: 0 auto;
display: inline-block;
height: 50%;
position: relative;
}
.overlay ul li {
display: block;
height: 30%;
height: calc(100% / 5);
min-height: 54px;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.overlay ul li a {
font-size: 3rem;
font-weight: 300;
display: block;
color: #626264;
-webkit-transition: color 0.2s;
transition: color 0.2s;
margin-top: -30px;
float: left;
font-weight: 700;
}
.overlay ul li a:hover,
.overlay ul li a:focus {
color: #FFF;
text-decoration: underline;
}
/* Effects */
.overlay-slidedown {
visibility: hidden;
-webkit-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: -webkit-transform 0.4s ease-in-out, visibility 0s 0.4s;
transition: transform 0.4s ease-in-out, visibility 0s 0.4s;
}
.overlay-slidedown.open {
visibility: visible;
-webkit-transform: translateY(0%);
transform: translateY(0%);
-webkit-transition: -webkit-transform 0.4s ease-in-out;
transition: transform 0.4s ease-in-out;
}
#trigger-overlay{
margin-top: 50px;
padding: 5px 0 5px 0;
float: right;
color: #FFF;
text-transform: uppercase;
border-top: 2px solid #FFF;
border-bottom: 2px solid #FFF;
}
@media screen and (max-height: 30.5em) {
.overlay nav {
height: 70%;
font-size: 34px;
}
.overlay ul li {
min-height: 34px;
}
}
JavaScript
function shuffle(array) {
var currentIndex = array.length
, temporaryValue
, randomIndex
;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
var triggerBttn = document.getElementById( 'trigger-overlay' ),
overlay = document.querySelector( 'div.overlay' ),
closeBttn = overlay.querySelector( 'button.overlay-close' ),
paths = [].slice.call( overlay.querySelectorAll( 'svg > path' ) ),
pathsTotal = paths.length;
function toggleOverlay() {
var cnt = 0;
shuffle( paths );
if( classie.has( overlay, 'open' ) ) {
classie.remove( overlay, 'open' );
classie.add( overlay, 'close' );
paths.forEach( function( p, i ) {
setTimeout( function() {
++cnt;
p.style.display = 'none';
if( cnt === pathsTotal ) {
classie.remove( overlay, 'close' );
}
}, i * 30 );
});
}
else if( !classie.has( overlay, 'close' ) ) {
classie.add( overlay, 'open' );
paths.forEach( function( p, i ) {
setTimeout( function() {
p.style.display = 'block';
}, i * 30 );
});
}
}
triggerBttn.addEventListener( 'click', toggleOverlay );
closeBttn.addEventListener( 'click', toggleOverlay );