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 &dtrif;
      <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 &dtrif;
          <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 &dtrif;
              <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');
});