Author: | Erik Terwan |
---|---|
Views Total: | 6,420 views |
Official Page: | Go to website |
Last Update: | November 26, 2015 |
License: | MIT |
Preview:

Description:
A HTML / CSS only navigation system that uses :checked
selector to toggle an off-screen menu with a hamburger button.
How to use it:
Create a fake / hidden checkbox which is used as click reciever, so you can use the :checked selector on it.
<input type="checkbox">
Create three spans for the hamburger button.
<span></span> <span></span> <span></span>
Create the navigation menu.
<ul id="menu"> <a href="#"><li>Home</li></a> <a href="#"><li>About</li></a> <a href="#"><li>Blog</li></a> <a href="#"><li>Contact</li></a> </ul>
The entire html structure should be like this:
<nav> <div id="menuToggle"> <input type="checkbox"> <span></span> <span></span> <span></span> <ul id="menu"> <a href="#"><li>Home</li></a> <a href="#"><li>About</li></a> <a href="#"><li>Blog</li></a> <a href="#"><li>Contact</li></a> </ul> </div> </nav>
The CSS / CSS3 rules for the hamburger button.
#menuToggle { display: block; position: relative; top: 50px; left: 50px; z-index: 1; -webkit-user-select: none; user-select: none; } #menuToggle input { display: block; width: 33px; height: 28px; position: absolute; top: 0; left: 0; cursor: pointer; opacity: 0; /* hide this */ z-index: 2; /* and place it over the hamburger */ } /* * Just a quick hamburger */ #menuToggle span { display: block; width: 33px; height: 4px; margin-bottom: 5px; position: relative; background: #cdcdcd; border-radius: 3px; z-index: 1; transform-origin: 4px 0px; transition: transform 0.5s cubic-bezier(0.77, 0.2, 0.05, 1.0), background 0.5s cubic-bezier(0.77, 0.2, 0.05, 1.0), opacity 0.55s ease; } #menuToggle span:first-child { transform-origin: 0% 0%; } #menuToggle span:nth-last-child(2) { transform-origin: 0% 100%; } /* * Transform all the slices of hamburger * into a crossmark. */ #menuToggle input:checked ~ span { opacity: 1; transform: rotate(45deg) translate(-2px, -1px); background: #232323; } /* * But let's hide the middle one. */ #menuToggle input:checked ~ span:nth-last-child(3) { opacity: 0; transform: rotate(0deg) scale(0.2, 0.2); } /* * Ohyeah and the last one should go the other direction */ #menuToggle input:checked ~ span:nth-last-child(2) { opacity: 1; transform: rotate(-45deg) translate(0, -1px); }
The Primary CSS styles for the navigation menu.
/* * Make this absolute positioned * at the top left of the screen */ #menu { position: absolute; width: 300px; margin: -100px 0 0 -50px; padding: 50px; padding-top: 125px; background: #ededed; list-style-type: none; transform-origin: 0% 0%; transform: translate(-100%, 0); transition: transform 0.5s cubic-bezier(0.77, 0.2, 0.05, 1.0); } #menu li { padding: 10px 0; font-size: 22px; } /* * And let's fade it in from the left */ #menuToggle input:checked ~ ul { transform: scale(1.0, 1.0); opacity: 1; }
For some reason this is not working in Safari, the transform is coming up as a unknown property… Below is my code:
#menu {
position: absolute;
width: 300px;
margin: -100px 0 0 -50px;
padding: 50px;
padding-top: 125px;
background: #ededed;
-webkit-transform-origin: 0% 0%;
transform-orgin: 0% 0%;
-webkit-transform:translate (-100%,0);
transform:translate(-100%,0);
-webkit-transition: -webkit-transform 0.5s cubic-bezier(0.77, 0.2, 0.05, 1.0);
transition: -webkit-transform 0.5s cubic-bezier(0.77, 0.2, 0.05, 1.0);
}