How to fix hamburger menu animation?
You have two Hamburger components in your app. One in App.js
and one in Header.js
.
Animated Hamburger toggle button not not working properly
I moved the transform-origin
property to the basic css. When it was being applied later, it was somehow animating differently from others. Now it is working fine.
const button = document.querySelector('button');
button.addEventListener('click', () => {
button.ariaExpanded = !JSON.parse(button.ariaExpanded);
});
.navbar-toggler.x:focus {
outline: none;
box-shadow: none;
}
.navbar-toggler.x[aria-expanded='true'] .icon-bar:nth-of-type(1) {
transform: rotate(45deg);
}
.navbar-toggler.x[aria-expanded='true'] .icon-bar:nth-of-type(2) {
opacity: 0;
filter: alpha(opacity=0);
}
.navbar-toggler.x[aria-expanded='true'] .icon-bar:nth-of-type(3) {
transform: rotate(-45deg);
}
.navbar-toggler.x .icon-bar {
width: 22px;
display: block;
height: 2px;
background-color: #fff;
transition:all 0.2s;
}
.navbar-toggler.x .icon-bar + .icon-bar {
margin-top: 4px;
}
.navbar-toggler.x .icon-bar:nth-of-type(1) {
transform: rotate(0);
transform-origin: 10% 10%;
}
.navbar-toggler.x .icon-bar:nth-of-type(2) {
opacity: 1;
filter: alpha(opacity=100);
}
.navbar-toggler.x .icon-bar:nth-of-type(3) {
transform: rotate(0);
transform-origin: 10% 90%;
}
<button class="navbar-toggler x" type="button" data-bs-toggle="mobile-menu" data-bs-target="#navbarTogglerDemo01" aria-controls="navbarTogglerDemo01" aria-expanded="false" aria-label="Toggle navigation">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
Side menu transform animations is not working properly when the hamburger menu is clicked
translateX(-100%) translates the element to the left by its own width.
To hide it initially therefore it needs to know where its initial left position is and then translate. No left setting has been given so it 'starts' from where it is.
We need to position it to the left so include a left: 0
styling.
.nav-text-links-content {
position: absolute;
display: flex;
gap: 20px;
flex-direction: column;
width: 100%;
height: 85vh;
top: 5rem;
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
/* left: -100%; */
left: 0; /* ADDED */
opacity: 0;
transition: transform 300ms linear;
}
Just as an aside, although using translate can indeed be 'more efficient' in this instance efficiency may not matter so much as this is not a continuous animation but happens only when the user clicks the icon which is unlikely to be continuous but occasional.
Bootstrap 5 Hamburger Animation not working
just add JQuery libs to let the script work,
EDITED: added event to close menu after clicking outside.
here is an example;
$(document).ready(function() {
$('.navbar-toggler-button').on('click', function() {
$('.animated-hamburger').toggleClass('open');
});
$(document).click(function(event) {
var tover = $(event.target);
if ($('.animated-hamburger').hasClass('open') && !tover.hasClass('animated-hamburger')) {
$('.animated-hamburger').toggleClass('open');
}
});
});
.animated-hamburger {
width: 30px !important;
height: 20px !important;
position: relative !important;
margin: 0px !important;
-webkit-transform: rotate(0deg) !important;
-moz-transform: rotate(0deg) !important;
-o-transform: rotate(0deg) !important;
transform: rotate(0deg) !important;
-webkit-transition: .5s ease-in-out !important;
-moz-transition: .5s ease-in-out !important;
-o-transition: .5s ease-in-out !important;
transition: .5s ease-in-out !important;
cursor: pointer !important;
}
.animated-hamburger span {
display: block !important;
position: absolute !important;
height: 3px !important;
width: 100% !important;
border-radius: 9px !important;
opacity: 1 !important;
left: 0 !important;
-webkit-transform: rotate(0deg) !important;
-moz-transform: rotate(0deg) !important;
-o-transform: rotate(0deg) !important;
transform: rotate(0deg) !important;
-webkit-transition: .25s ease-in-out !important;
-moz-transition: .25s ease-in-out !important;
-o-transition: .25s ease-in-out !important;
transition: .25s ease-in-out !important;
}
.animated-hamburger span {
background: #f3e5f5 !important;
}
.animated-hamburger span:nth-child(1) {
top: 0px !important;
-webkit-transform-origin: left center !important;
-moz-transform-origin: left center !important;
-o-transform-origin: left center !important;
transform-origin: left center !important;
}
.animated-hamburger span:nth-child(2) {
top: 10px !important;
-webkit-transform-origin: left center !important;
-moz-transform-origin: left center !important;
-o-transform-origin: left center !important;
transform-origin: left center !important;
}
.animated-hamburger span:nth-child(3) {
top: 20px !important;
-webkit-transform-origin: left center !important;
-moz-transform-origin: left center !important;
-o-transform-origin: left center !important;
transform-origin: left center !important;
}
.animated-hamburger.open span:nth-child(1) {
-webkit-transform: rotate(45deg) !important;
-moz-transform: rotate(45deg) !important;
-o-transform: rotate(45deg) !important;
transform: rotate(45deg) !important;
top: 0px !important;
left: 8px !important;
}
.animated-hamburger.open span:nth-child(2) {
width: 0% !important;
opacity: 0 !important;
}
.animated-hamburger.open span:nth-child(3) {
-webkit-transform: rotate(-45deg) !important;
-moz-transform: rotate(-45deg) !important;
-o-transform: rotate(-45deg) !important;
transform: rotate(-45deg) !important;
top: 21px !important;
left: 8px !important;
}
<!-- JUST ADD THIS LINE -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- ENDS HERE -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet">
<nav id="navbar" class="navbar fixed-top navbar-expand-lg navbar-dark">
<div class="container-fluid container-fluid-mobile">
<jdoc:include type="modules" name="logo"/>
<button class="navbar-toggler navbar-toggler-button" type="button" data-bs-toggle="collapse" data-bs-target="#navigation"aria-controls="navigation" aria-expanded="false" aria-label="Toggle navigation">
<div class="animated-hamburger"><span></span><span></span><span></span></div>
</button>
<div class="collapse navbar-collapse" id="navigation">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0 navbar-right nav-item">
<jdoc:include type="modules" name="navigation" onclick="toggleMenu() />
</ul>
<div class="collapse-show-bottom"></div>
</div>
</div>
</nav>
Rounded animation Hamburger menu not opening menu items
Here is an all CSS solution. Instead of using an event, I used a checkbox with a label that acts as the button.
HTML
<div class="nav">
<input type="checkbox" class="nav__checkbox" id="nav-toggle">
<label for="nav-toggle" class="nav__button">
<span class="nav__icon"></span>
</label>
<div class="nav__background"></div>
<nav class="nav__menu">
<ul class="nav__list">
<li class="nav__item">Item1</li>
<li class="nav__item">Item2</li>
<li class="nav__item">Item3</li>
<li class="nav__item">Item4</li>
</ul>
</nav>
</div>
CSS
.nav__checkbox{
display: none;
}
.nav__button{
background-color: #fff;
position: fixed;
height: 4.375rem;
width: 4.375rem;
border-radius: 50%;
top: 2.5rem;
right: 2.5rem;
z-index: 20;
cursor: pointer;
}
.nav__background{
background-image: linear-gradient(#000, #000);
height: 3.75rem;
width: 3.75rem;
border-radius: 50%;
position: fixed;
top: 2.8125rem;
right: 2.8125rem;
z-index: 10;
transition: transform .6s ease;
}
.nav__menu{
height: 100vh;
position: fixed;
color:#00f;
top: 0;
left: 0;
z-index: 15;
opacity: 0;
visibility: hidden;
width: 0;
transition: all .6s ease;
}
.nav__checkbox:checked ~ .nav__menu{
opacity: 1;
visibility: visible;
width: 100%;
}
.nav__checkbox:checked ~ .nav__background{
transform: scale(20);
}
body{
background-color: #eee;
}
Here is the link
https://jsfiddle.net/1wcpz3ua/8/
Animation for hamburger icon animation not working
Use the CSS display: inline-block
or display: block
so the element will have a width and height.
.hamburger {
position: relative;
font-size: 40px !important;
padding: 0px !important;
padding-left: 30px !important;
text-align: left !important;
color: #000;
text-decoration: none;
display: inline-block;
transition: 0.75 ease-in-out !important;
}
.hamburger:hover {
transform: scale(1.1) rotate(90deg) !important;
}
<div class="wrapper">
<div class="header">
<a class="hamburger" href="#" onclick="dropdown()"> ≡ </a>
</div>
Hamburger Overlay menu animation
Check this, i have fixed your issue..
function openNav() { document.getElementById("myNav").style.left = "0"; setTimeout(function(){ document.getElementById("overlay-content").style.display = "flex"; // document.getElementById("menu-anim-fix").style.display = "flex"; }, 100); }
function closeNav() { document.getElementById("myNav").style.left = "-100%"; document.getElementById("overlay-content").style.display = "none"; }
header a { letter-spacing: 8px; text-transform: uppercase; color: #fff; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -ms-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; text-decoration:none !important;}header a:hover { color: #d3a356; letter-spacing: 10px; }
.overlay45 { height: 100%; width: 100%; position: fixed; z-index: 49; top: 0; left: -100%; background-color: rgb(0,0,0); background-color: rgba(0,0,0, 0.9); overflow-x: hidden; transition: 1s;
}
.overlay-content{ transition: 1s;}
.overlay45 a {display: block; transition: 0.3s;}
/*.overlay-content { position: relative; width: 100%;}*/
.overlay45 .closebtn { position: absolute; top: -10px; right: 65px; font-size: 60px; z-index: 50;}
@media screen and (max-height: 450px) { .overlay45 a {font-size: 20px} .overlay45 .closebtn { font-size: 40px; top: 15px; right: 35px; }}@media screen and (max-width: 600px) { .overlay45 .closebtn { position: absolute; top: -10px; right: 20px; font-size: 60px; z-index: 50;}}
@media screen and (max-width: 767px) { header .col-sm-12 { text-align: center !important; } header .col-md-2 { border-right: none !important; border-left: none !important; } }
.refrences-website-fix{ padding-top: 10%;}
.refrences-website-fix a{ font-size: 35px; font-weight: 900;}
.refrences-website-fix .corvin:hover{ background-image: url(../img/logo.jpg); -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover;}
.header-top { padding: 0 10px !important;
}.header-top img{ width: 50px; height: 50px;}
@media screen and (max-width: 760px) {.header-top img{ width: 80px; height: 80px;} }
.header-top { padding: 0 60px; position: fixed; top: 0; width: 100%; z-index: 16; -webkit-box-sizing: border-box; box-sizing: border-box;}.header-top a{ /*color: grey !important;*/
}.header-top i{ background: #fff !important;}h1 { line-height: 70px; height: 70px;}
h1 a { display: block; padding: 0 10px;}
.toggle-menu { width: 50px; height: 50px; display: inline-block; position: relative; top: 20px;}
.toggle-menu i { position: absolute; display: block; height: 2px; background: white; width: 24px; left: 10px; -webkit-transition: all .3s; -o-transition: all .3s; transition: all .3s;}
.toggle-menu i:nth-child(1) { top: 16px;}
.toggle-menu i:nth-child(2) { top: 24px;}
.toggle-menu i:nth-child(3) { top: 32px;}
/*.open-menu i:nth-child(1) { top: 25px; -webkit-transform: rotateZ(45deg); -ms-transform: rotate(45deg); transform: rotateZ(45deg);}
.open-menu i:nth-child(2) { background: transparent !important;}
.open-menu i:nth-child(3) { top: 25px; -webkit-transform: rotateZ(-45deg); -ms-transform: rotate(-45deg); transform: rotateZ(-45deg);}*/
nav { height: 0; -webkit-box-sizing: border-box; box-sizing: border-box; background:#000; position: fixed; width: 100%; /* -webkit-transition: all 1s; -o-transition: all 1s; transition: all 1s;*/ visibility: hidden; opacity: 0; -webkit-transition: opacity 1s, visibility 0s 1s; transition: opacity 1s, visibility 0s 1s; z-index: 15;}
.clearfix:before,.clearfix:after { content: ""; display: table;}
.clearfix:after { clear: both;}
.l-left { float: left;}
.l-right { float: right;}
.ref-menu-fix{ text-align: center; margin: 0 auto; width: 50%; font-size: 24px; letter-spacing: 8px; color: #fff !important; margin-top:20px; text-transform: uppercase;}
.toggle-menu { width: 50px; height: 50px;
display: inline-block; position: relative; top: 20px;}
.toggle-menu i { position: absolute; display: block; height: 2px; background: white; width: 24px; left: 10px; -webkit-transition: all .3s; -o-transition: all .3s; transition: all .3s;}
.toggle-menu i:nth-child(1) { top: 16px;}
.toggle-menu i:nth-child(2) { top: 24px;}
.toggle-menu i:nth-child(3) { top: 32px;}
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <link rel="stylesheet" href="style.css"></head><body style="background-color: #000;"> <header> <div class="header-top clearfix"> <h1 class="l-left link"><a href="index.html" style="font-size: 16px;"><img style="" src="assets/img/logo.jpg" height="100" width="100" alt="Sample Image"></a></h1> <a href="refrences.html" class="ref-menu-fix" style="">REFERENCES</a> <a class="l-right link toggle-menu" style="cursor:pointer;" onclick="openNav()" style="filter: brightness(1);" href="#"> <i ></i> <i ></i> <i ></i> </a> <!-- <span class="l-right link toggle-menu" style="font-size:30px;cursor:pointer" onclick="openNav()">☰ open</span> --> </div> <div id="myNav" class="overlay45"> <header style="background-color: #1f1f1f; height: 100%;"> <a href="javascript:void(0)" class="closebtn" onclick="closeNav()">×</a> <div class="row overlay-content" id="overlay-content" style="height: 100%; position: fixed;display: none;width: 100%;"> <div class="col-md-2" style="border-right: 1px solid #fff" ></div> <div class="col-md-8"> <div class="row mt-5"> <div class="col-md-12" style="text-align: center;"> <img src="assets/img/logo2.png" style="width: 20%; margin: 1 auto;" alt="Sample Image"> </div> </div> <div class="row mb-5"> <div class="col-sm-12 col-md-2"></div> <div class="col-sm-12 col-md-4"> <a id="menu-anim-fix" href="index.html">Home Page</a> </div> <div class="col-sm-12 col-md-4" style="text-align: right;"> <a id="menu-anim-fix" href="ouroffer.html">Our Offer</a> </div> <div class="col-sm-12 col-md-2"></div> </div> <div class="row mb-5"> <div class="col-sm-12 col-md-2"></div> <div class="col-sm-12 col-md-4"> <a id="menu-anim-fix" href="ourwork.html">Our Work</a> </div> <div class="col-sm-12 col-md-4" style="text-align: right;"> <a id="menu-anim-fix" href="stepform.html">Order Us</a> </div> <div class="col-sm-12 col-md-2"></div> </div> <div class="row mb-5"> <div class="col-sm-12 col-md-2"></div> <div class="col-sm-12 col-md-4"> <a id="menu-anim-fix" href="website-art.html">Website Art</a> </div> <div class="col-sm-12 col-md-4" style="text-align: right;"> <a href="contact.html">Contact Us</a> </div> <div class="col-sm-12 col-md-2"></div> </div> <div class="row"> <div class="col-sm-12 col-md-12" style="text-align: center;"> <a id="menu-anim-fix" href="refrences.html">REFERENCES</a> </div> </div> <div class="row mt-5"> <div class="col-md-12 mt-5" style="text-align: center;"> <p class="mt-5" style="color: #fff;font-size: 12px;">2019- All Rights Reserved</p> </div> </div> </div> <div class="col-md-2" style="border-left: 1px solid #fff" ></div> </div> </header> </div> </header>
</body></html>
Hamburger icon css animation into an x
You can use tranform: rotate()
on the top and bottom with a transition
on the width for the middle span.
let navToggle = document.querySelector('.nav-toggle')
let bars = document.querySelectorAll('.bar')
function toggleHamburger(e) {
bars.forEach(bar => bar.classList.toggle('x'))
}
navToggle.addEventListener('click', toggleHamburger)
.nav-toggle {
display: flex;
flex-direction: column;
justify-content: space-between;
height: 22px;
width: 22px;
}
.nav-toggle .bar {
height: 3px;
width: 100%;
background-color: black;
transition: all 100ms ease-in-out;
}
.nav-toggle:hover {
cursor: pointer;
}
.x:nth-of-type(1) {
transition: all 100ms ease-in-out;
transform: rotate(45deg);
transform-origin: top left;
width: 28px;
}
.x:nth-of-type(2) {
transition: all 100ms ease-in-out;
transform-origin: center;
width: 0;
}
.x:nth-of-type(3) {
transition: all 100ms ease-in-out;
transform: rotate(-45deg);
transform-origin: bottom left;
width: 28px;
}
<a class="nav-toggle">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</a>
Related Topics
Question About CSS Files for Smartgwt Project
Li:Before{ Content: "■"; } How to Encode This Special Character as a Bullit in an Email Stationery
Override and Reset CSS Style: Auto or None Don't Work
Optimize Font Awesome for Only Used Classes
Strategies for Handling Multiple Screen Resolutions and Aspect Ratios in Web Development
Requirejs: Loading Modules Including Templates and CSS
Gm_Addstyle Equivalent in Tampermonkey
How to Make The Elements Cover 100% of The Space Available in a Container Using Flexbox
How to Fix Hamburger Menu Animation
Facebook/Twitter Style Photos Grid Style Layout
What Does The Smiley Face ":)" Mean in CSS
CSS Filter: Make Color Image with Transparency White
Widths to Use in Media Queries
How to Add Background Color Only for Padding
How to Animate an Ellipsis with CSS Animations
Is There an Alternative to CSS