Here is the basis for creating a menu with a hamburger button that changes to close when the menu is open. In addition, there is a background on top of the content. You can close the menu by clicking on the background.
codepen example: https://codepen.io/ktr92/pen/gOBRyKO
HTML:
<div class="jsbackdrop"></div> <div class="container"> <header class="header"> <div class="flex items-center space-between w-full"> <div class="headercontent">HEADER</div> <a href="#" class="menubtn" data-menutoggle="mainmenu"> <span></span> <span></span> <span></span> </a> </div> <div class="mainmenu" data-menu="mainmenu"> <div class="mainmenu__wrapper"> <div class="mainmenu__items"> <ul> <li class="active"><a href="#">Home</a></li> <li><a href="#">Page 1</a></li> <li><a href="#">Page 2</a></li> <li><a href="#">Page 3</a></li> <li><a href="#">Page 4</a></li> <li><a href="#">Page 5</a></li> </ul> </div> </div> </div> </header> <main> content body </main> </div>
CSS:
[data-menutoggle] { display: block; margin-left: 15px; } [data-menutoggle] span { width: 32px; height: 3px; margin-bottom: 5px; display: block; background: #324064; transform-origin: 4px 0px; transition: transform 0.3s cubic-bezier(0.77, 0.2, 0.05, 1), background 0.5s cubic-bezier(0.77, 0.2, 0.05, 1), opacity 0.55s ease; &:last-child { margin-bottom: 0; } } [data-menutoggle] span:first-child { transform-origin: 0% 0%; } [data-menutoggle] span:last-child { transform-origin: 0% 100%; } [data-menutoggle].active span:first-child { opacity: 1; transform: translate(0, 18px) rotate(-45deg); } [data-menutoggle].active span:last-child { transform: translate(0, -21px) rotate(45deg); } [data-menutoggle].active span:nth-child(2) { opacity: 0; } [data-menu] { display: none; } [data-menu].active { display: block; } .jsbackdrop { background: rgba(52, 60, 75, 0.5); display: none; position: fixed; z-index: 9; height: 100%; min-height: 100vh; left: 0; top: 0; width: 100%; } .jsbackdrop.active { display: block; } .mainmenu { width: 100%; position: absolute; background: #fff; z-index: 99; left: 0; padding: 10px; top: 100%; } .mainmenu li { list-style: none; margin-bottom: 5px; }
JS[jquery]:
$("[data-menutoggle]").on("click", function (e) { e.preventDefault(); let menu = $(this).data("menutoggle"); $(`[data-menu=${menu}]`).toggleClass("active"); $(this).toggleClass("active"); $(".jsbackdrop").toggleClass("active"); }); $(".jsbackdrop").on("click", function (e) { $(this).removeClass("active"); $("[data-menu]").removeClass("active"); $("[data-menutoggle]").removeClass("active"); });
Top comments (0)