<button type="button" class="menu-button js-menu-trigger" aria-label="Click to open menu"></button>
<div class="pen-title js-menu-trigger">
<h1>Grid Menu</h1>
<div class="info">Click here</div>
</div>
<div class="menu js-menu">
<div class="menu__item">
<div class="menu__item__bg-container"></div>
<div class="menu__item__content">
<a href="#" class="btn-link">Home</a>
</div>
</div>
<div class="menu__item">
<div class="menu__item__bg-container"></div>
<div class="menu__item__content">
<a href="#" class="btn-link">About</a>
</div>
</div>
<div class="menu__item">
<div class="menu__item__bg-container"></div>
<div class="menu__item__content">
<nav class="main-navigation">
<a class="main-navigation__link" href="#">Lorem, ipsum.</a>
<a class="main-navigation__link" href="#">Ipsum dolor.</a>
<a class="main-navigation__link" href="#">amet consectetur.</a>
<a class="main-navigation__link" href="#">voluptate provident</a>
</nav>
</div>
</div>
<div class="menu__item">
<div class="menu__item__bg-container"></div>
<div class="menu__item__content">
<a href="#" class="btn-link">Contact</a>
</div>
</div>
<div class="menu__item">
<div class="menu__item__bg-container"></div>
<div class="menu__item__content">
<a href="#" class="btn-link">More</a>
</div>
</div>
</div>
$color-1: #272727;
$color-2: #ecf445;
$color-3: #e17055;
$color-4: #eee;
* {
box-sizing: border-box;
}
body {
margin: 0;
background: darken($color-1, 5%) url(https://picsum.photos/1920/1080?image=33) no-repeat center / cover;
background-blend-mode: overlay;
}
.pen-title {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(1);
transition: all 300ms ease;
z-index: 2;
opacity: 1;
transition-delay: 600ms;
cursor: pointer;
color: #fff;
font-family: Helvetica, arial, sans-serif;
text-align: center;
.info {
font-size: 10px;
letter-spacing: 3px;
font-weight: bold;
color: $color-2;
}
h1 {
letter-spacing: 4px;
margin: 2px auto;
font-size: 18px;
}
&.menu-trigger--menu-open {
opacity: 0;
top: -100%;
transform: translate(-50%, -50%) scale(0.1);
transition-delay: 0ms;
}
}
.main-navigation {
display: flex;
flex-direction: column;
flex: 1 1 auto;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
.main-navigation__link {
text-decoration: none;
color: #fff;
font-size: 1.5rem;
font-family: Helvetica, arial, sans-serif;
padding: 4% 0.2rem;
font-weight: bold;
transition: all 300ms ease;
position: relative;
display: block;
@media (min-width: 480px) {
font-size: 2rem;
}
&:after {
content: '';
display: block;
width: 10px;
height: 2px;
background: $color-2;
position: absolute;
bottom: 18%;
left: 0;
transform-origin: left;
transition: all 300ms ease-out;
}
&:hover {
&:after {
transform: scaleX(4);
}
}
}
}
.btn-link {
display: flex;
height: 100%;
width: 100%;
flex: 1 1 auto;
justify-content: center;
align-items: center;
text-decoration: none;
color: $color-1;
font-size: 14px;
font-weight: bold;
letter-spacing: 3px;
font-family: Helvetica, arial, sans-serif;
position: relative;
&:before {
content: '';
position: absolute;
display: block;
width: 1px;
height: calc(50% - 60px);
transform-origin: top;
transition: all 300ms ease;
transform: scaleY(0);
background: $color-1;
top: 20px;
left: 50%;
margin-left: -2px;
opacity: 1;
}
&:hover {
&:before {
transform: scaleY(1);
}
}
}
.menu-button {
position: fixed;
top: 20px;
right: 20px;
z-index: 3;
background: $color-2;
border: none;
box-shadow: none;
outline: none;
width: 40px;
height: 40px;
padding: 0;
font-family: Helvetica, arial, sans-serif;
font-size: 10px;
cursor: pointer;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 300ms ease;
&:after {
content: '+';
width: 30px;
height: 30px;
display: block;
color: #000;
font-size: 24px;
font-weight: lighter;
transition: all 300ms ease;
}
&:hover {
transform: scale(1.1);
}
&.menu-trigger--menu-open {
&:after {
transform: rotate(765deg);
}
}
}
.menu {
height: 100vh;
width: 100vw;
display: grid;
overflow-y: auto;
grid-template-columns: 100%;
grid-template-rows: 20% 20% 20% 10% 10% 10% 10%;
@media (min-width: 480px) {
grid-template-columns: 30% 70%;
grid-template-rows: 25% 25% 25% 25%;
}
@media (min-width: 800px) {
grid-template-columns: 20% 30% 50%;
grid-template-rows: 60% 40%;
}
}
.menu__item {
opacity: 0;
transition: all 200ms ease;
overflow: hidden;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1 1 auto;
.menu__item__bg-container {
position: absolute;
height: 100%;
width: 100%;
top: 0;
left: 0;
background-size: cover;
background-repeat: no-repeat;
background-position: center;
mix-blend-mode: overlay;
transform-origin: center;
transform: scale(2);
transition: all 2000ms ease-out;
z-index: 1;
}
.menu__item__content {
display: flex;
flex: 1 1 auto;
justify-content: center;
align-items: center;
height: 100%;
width: 100%;
position: relative;
z-index: 2;
opacity: 0;
transition: all 300ms ease;
}
&:first-child {
background-color: $color-1;
.btn-link {
color: #eee;
&:before {
background: #ccc;
}
}
}
&:nth-child(2) {
background-color: $color-2;
}
&:nth-child(3) {
background-color: $color-1;
grid-column-start: 1;
grid-row-start: 1;
grid-row-end: 4;
@media (min-width: 480px) {
grid-column-start: 2;
grid-row-start: 1;
grid-row-end: 5;
}
@media (min-width: 800px) {
grid-column-start: 3;
grid-row-start: 1;
grid-row-end: 3;
}
}
&:nth-child(4) {
background-color: $color-3;
}
&:nth-child(5) {
background-color: $color-4;
}
@for $i from 1 through 5 {
&:nth-child(#{$i}) {
transition-delay: #{$i * 50}ms;
.menu__item__bg-container {
background-image: url(https://picsum.photos/800/600?image=#{$i * 11});
}
.menu__item__content {
transition-delay: #{($i * 50) - 50}ms;
}
@if $i % 2 == 0 {
transform-origin: left;
transform: scaleX(0);
} @else {
transform-origin: bottom;
transform: scaleY(0);
}
}
.menu--open & {
&:nth-child(#{$i}) {
transition-delay: #{$i * 200}ms;
.menu__item__content {
transition-delay: #{($i * 200) + 500}ms;
}
}
}
}
.menu--open & {
transform: scale(1);
opacity: 1;
transition: all 400ms ease;
.menu__item__bg-container {
transform: scale(1);
}
.menu__item__content {
opacity: 1;
}
&:hover {
.menu__item__bg-container {
transform: scale(1.2);
}
}
}
}
View Compiled
const penTitle = document.querySelector('.pen-title');
const menu = document.querySelector('.js-menu');
const menuTrigger = document.querySelectorAll('.js-menu-trigger');
menuTrigger.forEach(btn => {
btn.addEventListener('click', function() {
menuTrigger.forEach(b => {
b.classList.toggle('menu-trigger--menu-open');
});
menu.classList.toggle('menu--open');
});
});
View Compiled
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.