// Please ❤ if you like it

// update 25/4/2019
// I'd noticed that there are a lot of people who seem interested in this pen so I changed a little bit in the logic so it would fit better on production sites and make it easier to read!

div.menu
	button.nav-tgl(type='button' aria-label='toggle menu')
		// this span just for the three dividers in the hamburger button
		span(aria-hidden='true')

	nav.nav
		// I don't care about the menu elements here so I will hide them
		ul
			li element one
			li element two
			li element three
			li element four
View Compiled
.nav {
	ul {
		display: none;
	}
}

.nav-tgl {
  display: inline-block;
  cursor: pointer;
  position: fixed;
  z-index: 100;
  right: 30px;
  top: 30px;
  width: 70px;
  height: 70px;
  border: none;
  border-radius: 50%;
  padding: 0;
  background: #fff;
	box-shadow: 0px 4px 24px rgba(#000, 0.24);
  line-height: 0.6;
  text-align: center;
	
	// making the dividers
	> span {
		// the second divider
		display: inline-block;
		position: relative;
		height: 2px;
		width: 34px;
		border-radius: 1px;
		background: #293335;
		vertical-align: middle;
		
		// the first & the third dividers
		&:before, &:after {
		  display: inline-block;
			position: absolute;
			content: "";
			height: 2px;
			border-radius: 1px;
			background: #293335;
			// for the hover state
			transition: all 200ms;
		}
		&:before {
		  top: -11px;
			left: 3px;
			width: 28px;
		}
		&:after {
		  top: 11px;
			left: 6px;
			width: 22px;
		}
	}
	
	// ofcorse we should find a replacement for the focus state but it's not our topic
	&:focus {outline: none}
	
	&:hover > span:after, &:hover > span:before {
		width: 34px;
		left: 0;
	}
}

// for the nav background (styling the nav itself is not our topic)
.nav:before {
  display: block;
  position: fixed;
  top: 0;
  left: 0;
  content: '';
  width: 100vw;
  height: 100vh;
  background: rgba(0, 0, 0, 0.8);
  transition: all 500ms ease-in-out;
	
	// that's all the pen about
  clip-path: circle(30px at calc(100% - 65px) 65px);
	// for AT
  visibility: hidden;
}

// when it gits activated
.menu.active {
	.nav:before {
		visibility: visible;

		// that's all the pen about
		clip-path: circle(100%);
	}
	
	.nav-tgl > span {
		height: 0;
		&:after, &:before {
		  top: 0px;
			left: 0;
			width: 34px;
		}
		&:after {
		  transform: rotate(-45deg);
		}
		&:before {
			transform: rotate(45deg);
		}
	}
}
View Compiled
const menu = document.querySelector('.menu');
const btn = menu.querySelector('.nav-tgl');
btn.addEventListener('click', evt => {
	menu.classList.toggle('active');
})

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.