JSFiddle - React, Tailwind, and code Playground

by srinivaspotluri

HTML

<div class="wrapper">
  <input type="checkbox" id="menuToggler" class="input-toggler" value="1" autofocus="true"/>
  <label for="menuToggler" id="menuTogglerLabel" class="menu-toggler" role="button" aria-pressed="false" aria-expanded="false" aria-label="Navigation button">
    <span class="menu-toggler__line"></span>
    <span class="menu-toggler__line"></span>
    <span class="menu-toggler__line"></span>
  </label>
  <div id="sidebar" class="sidebar" role="navigation" aria-labelledby="menuTogglerLabel" aria-hidden="true">
    <ul id="menubar" class="menu" role="menubar" aria-orientation="vertical">
      <li class="menu__item" role"none"><a class="menu__link" href="#" role="menuitem" tabindex="-1">Home</a></li>
      <li class="menu__item" role"none"><a class="menu__link" href="#" role="menuitem" tabindex="-1">Blog</a></li>
      <li class="menu__item" role"none"><a class="menu__link" href="#" role="menuitem" tabindex="-1">Portfolio</a></li>
      <li class="menu__item" role"none"><a class="menu__link" href="#" role="menuitem" tabindex="-1">About</a></li>
      <li class="menu__item" role"none"><a class="menu__link" href="#" role="menuitem" tabindex="-1">Contact</a></li>
    </ul>
  </div>
  <main class="content">
    <h1>CSS sidebar toggle</h1>
    <p>Pure CSS solution for hiding and showing sidebar.</p>
  </main>
</div>
<a class="sb-link" href="//silvestarbistrovic.from.hr/en/articles/css-sidebar-toggle/">silvestarbistrovic.from.hr</a>

CSS

:root {
  --sidebar-width: 100%;
  --toggler-size: 30px;
  --toggler-line-number: 3;
  --toggler-line-size: calc(var(--toggler-size) / (var(--toggler-line-number) + var(--toggler-line-number) - 1));
  --toggler-offset-left: 10px;
  --toggler-offset-top: 10px;
  --toggler-color: Tomato;
  --toggler-color-hover: Wheat;
}

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

html {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
  font-size: 0.8rem;
}
@media screen and (min-width: 20em) {
  html {
    font-size: calc(0.8rem + 0.4 * (100vw - 20em) / 55);
  }
}
@media screen and (min-width: 75em) {
  html {
    font-size: 1.2rem;
  }
}

.wrapper {
  min-width: 100vw;
  background: AliceBlue;
  display: flex;
}

.sidebar,
.content {
  transition: all .25s ease-out;
}

.sidebar {
  width: var(--sidebar-width);
  -webkit-transform: translateX(calc(var(--sidebar-width) * -1));
          transform: translateX(calc(var(--sidebar-width) * -1));
  background: linear-gradient(to bottom right, Tomato, Wheat);
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  top: 0;
  height: 100vh;
  opacity: .5;
}

.content {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}

.menu {
  list-style-type: none;
}

.menu__link {
  color: white;
  font-weight: 100;
  text-decoration: none;
  font-size: 10vmin;
  line-height: 15vmin;
  transition: all .25s ease-out;
}
.menu__link:hover, .menu__link:focus, .menu__link:active {
  color: Gold;
}

.menu-toggler {
  border-radius: calc(var(--toggler-line-size) / 2);
  display: block;
  width: var(--toggler-size);
  height: var(--toggler-size);
  position: fixed;
  top: var(--toggler-offset-top);
  left: var(--toggler-offset-left);
  cursor: pointer;
  z-index: 1;
}

.menu-toggler__line {
  height: var(--toggler-line-size);
 ...

JavaScript

let menuToggler = document.getElementById('menuToggler');
let menuTogglerLabel = document.getElementById('menuTogglerLabel');
let sidebar = document.getElementById('sidebar');
let menuItems = document.getElementsByClassName('menu__link');

menuToggler.addEventListener('change', function () {
  if (menuToggler.checked) {
    menuTogglerLabel.setAttribute('aria-pressed', 'true');
    sidebar.setAttribute('aria-hidden', 'false');
  } else {
    menuTogglerLabel.setAttribute('aria-pressed', 'false');
    sidebar.setAttribute('aria-hidden', 'true');
  }

  for (let menuItem of menuItems) {
    if (menuToggler.checked) {
      menuItem.setAttribute('tabindex', '0');
    } else {
      menuItem.setAttribute('tabindex', '-1');
    }
  }
});