sidemenu
by Alexandru Gatea
HTML
<nav>
<button class="side-nav-toggle">Menu</button>
</nav>
<div id="sideMenu">
<ul class="side-nav">
<li class="side-nav-item level0">Item Level 0</li>
<li class="side-nav-item level0" data-level="1" data-toggle="sub-nav">
Item Level 0 ▾
<ul class="side-nav-sub-nav" data-level="1">
<li class="side-nav-item level1">Item Level 1</li>
<li class="side-nav-item level1">Item Level 1</li>
<li class="side-nav-item level1" data-level="2" data-toggle="sub-nav">
Item Level 1 ▾
<ul class="side-nav-sub-nav" data-level="2">
<li class="side-nav-item level2">Item Level 2</li>
<li class="side-nav-item level2">Item Level 2</li>
<li class="side-nav-item level1">Item Level 2</li>
<li class="side-nav-item level2" data-level="3" data-toggle="sub-nav">
Item Level 2 ▾
<ul class="side-nav-sub-nav" data-level="3">
<li class="side-nav-item level3">Item Level 3</li>
<li class="side-nav-item level3">Item Level 3</li>
<li class="side-nav-item level3">Item Level 3</li>
</ul>
</li>
</ul>
</li>
<li class="side-nav-item level1">Item Level 1</li>
</ul>
</li>
<li class="side-nav-item level0">Item Level 0</li>
<li class="side-nav-item level0">Item Level 0</li>
</ul>
</div>
SCSS
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Gotham Light", sans-serif;
}
$bg: #dddddd;
nav {
width: 100%;
display: flex;
justify-content: flex-end;
padding: 20px;
button {
background: $bg;
color: #212121;
padding: 10px 20px;
border: none;
cursor: pointer;
border-radius: 4px;
&:focus {
box-shadow: 0px 0px 0px 4px rgba($bg, 0.2);
}
}
}
#sideMenu {
background: $bg;
width: 300px;
height: 100vh;
display: block;
position: fixed;
top: 0;
left: -100%;
transition: all 0.6s cubic-bezier(.83, -0.19, .3, 1.15);
overflow: hidden;
&.active {
left: 0;
}
.side-nav,
.side-nav-item {
position: static;
list-style-type: none;
}
.side-nav-item {
line-height: 34px;
color: #212121;
padding: 10px 20px;
cursor: pointer;
}
.side-nav-sub-nav {
display: block;
position: absolute;
top: 0;
height: 100vh;
width: 260px;
left: 100%;
padding-left: 0px;
transition: all 0.6s cubic-bezier(.83, -0.19, .3, 1.15);
&.active {
left: 0;
}
}
}
@for $i from 1 through 3 {
$offset: $i * 20px;
#sideMenu .side-nav-sub-nav[data-level="#{$i}"] {
background: darken($bg, $i * 5);
&.active {
left: #{$offset};
width: calc(100% - #{$offset});
}
}
#sideMenu li[data-level="#{$i}"].active {
background: darken($bg, $i * 5);
}
}
JavaScript
var sideMenuToggle = $('.side-nav-toggle'),
menu = $('#sideMenu'),
dropdownToggle = $('[data-toggle="sub-nav"]');
sideMenuToggle.on('click', function() {
menu.toggleClass('active');
});
dropdownToggle.on('click', function() {
var level = $(this).attr('data-level');
$(this).addClass('active');
$(this).find('[data-level=' + level + ']').addClass('active');
});