Menu toggle button with flat menu. Uses CSS transitions and Vanilla JS.
A Pen by Geoffrey Crofte on CodePen.
| <a href="#menu" id="toggle"><span></span></a> | |
| <div id="menu"> | |
| <ul> | |
| <li><a href="#home">Home</a></li> | |
| <li><a href="#about">About</a></li> | |
| <li><a href="#contact">Contact</a></li> | |
| </ul> | |
| </div> | |
| <p>Inspirated by <a href="https://codepen.io/loredonut/pen/hjuai">Loredonut Pen</a></p> |
| var theToggle = document.getElementById('toggle'); | |
| // based on Todd Motto functions | |
| // https://toddmotto.com/labs/reusable-js/ | |
| // hasClass | |
| function hasClass(elem, className) { | |
| return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' '); | |
| } | |
| // addClass | |
| function addClass(elem, className) { | |
| if (!hasClass(elem, className)) { | |
| elem.className += ' ' + className; | |
| } | |
| } | |
| // removeClass | |
| function removeClass(elem, className) { | |
| var newClass = ' ' + elem.className.replace( /[\t\r\n]/g, ' ') + ' '; | |
| if (hasClass(elem, className)) { | |
| while (newClass.indexOf(' ' + className + ' ') >= 0 ) { | |
| newClass = newClass.replace(' ' + className + ' ', ' '); | |
| } | |
| elem.className = newClass.replace(/^\s+|\s+$/g, ''); | |
| } | |
| } | |
| // toggleClass | |
| function toggleClass(elem, className) { | |
| var newClass = ' ' + elem.className.replace( /[\t\r\n]/g, " " ) + ' '; | |
| if (hasClass(elem, className)) { | |
| while (newClass.indexOf(" " + className + " ") >= 0 ) { | |
| newClass = newClass.replace( " " + className + " " , " " ); | |
| } | |
| elem.className = newClass.replace(/^\s+|\s+$/g, ''); | |
| } else { | |
| elem.className += ' ' + className; | |
| } | |
| } | |
| theToggle.onclick = function() { | |
| toggleClass(this, 'on'); | |
| return false; | |
| } |
| /* Important styles */ | |
| #toggle { | |
| display: block; | |
| width: 28px; | |
| height: 30px; | |
| margin: 30px auto 10px; | |
| } | |
| #toggle span:after, | |
| #toggle span:before { | |
| content: ""; | |
| position: absolute; | |
| left: 0; | |
| top: -9px; | |
| } | |
| #toggle span:after{ | |
| top: 9px; | |
| } | |
| #toggle span { | |
| position: relative; | |
| display: block; | |
| } | |
| #toggle span, | |
| #toggle span:after, | |
| #toggle span:before { | |
| width: 100%; | |
| height: 5px; | |
| background-color: #888; | |
| transition: all 0.3s; | |
| backface-visibility: hidden; | |
| border-radius: 2px; | |
| } | |
| /* on activation */ | |
| #toggle.on span { | |
| background-color: transparent; | |
| } | |
| #toggle.on span:before { | |
| transform: rotate(45deg) translate(5px, 5px); | |
| } | |
| #toggle.on span:after { | |
| transform: rotate(-45deg) translate(7px, -8px); | |
| } | |
| #toggle.on + #menu { | |
| opacity: 1; | |
| visibility: visible; | |
| } | |
| /* menu appearance*/ | |
| #menu { | |
| position: relative; | |
| color: #999; | |
| width: 200px; | |
| padding: 10px; | |
| margin: auto; | |
| font-family: "Segoe UI", Candara, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; | |
| text-align: center; | |
| border-radius: 4px; | |
| background: white; | |
| box-shadow: 0 1px 8px rgba(0,0,0,0.05); | |
| /* just for this demo */ | |
| opacity: 0; | |
| visibility: hidden; | |
| transition: opacity .4s; | |
| } | |
| #menu:after { | |
| position: absolute; | |
| top: -15px; | |
| left: 95px; | |
| content: ""; | |
| display: block; | |
| border-left: 15px solid transparent; | |
| border-right: 15px solid transparent; | |
| border-bottom: 20px solid white; | |
| } | |
| ul, li, li a { | |
| list-style: none; | |
| display: block; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| li a { | |
| padding: 5px; | |
| color: #888; | |
| text-decoration: none; | |
| transition: all .2s; | |
| } | |
| li a:hover, | |
| li a:focus { | |
| background: #1ABC9C; | |
| color: #fff; | |
| } | |
| /* demo styles */ | |
| body { margin-top: 3em; background: #eee; color: #555; font-family: "Open Sans", "Segoe UI", Helvetica, Arial, sans-serif; } | |
| p, p a { font-size: 12px;text-align: center; color: #888; } |