Bora Ceray
Bora Ceray

Reputation: 13

Responsive Hamburger Menu via jQuery

I am new to coding and am struggling to get the template for my nav menu ready. First of all, I want the hamburger to hide whenever I click on it and then the menu opens. However, I'm still at the beginning, and can't even get the hamburger to hide. I want to toggle the class ".hamburger-hide" using jQuery, which includes the display:none property.

this is the html:

    <!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="css/styles.css">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@100&display=swap" rel="stylesheet">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@800&display=swap" rel="stylesheet">
    <title>Navbar</title>
  </head>
  <body>

    <header class="header">
    <h1 class="logo">Logo</h1>

    <nav class="navbar">
      <ul class="nav-list">
        <li class="nav-item"><a href="#">Home</a></li>
        <li class="nav-item"><a href="#">About</a></li>
        <li class="nav-item"><a href="#">Contact Us</a></li>
        <li class="nav-item"><a href="#">Links</a></li>
      </ul>
    </nav>

  <div class="btn">
    <a class="cta" href="#"><button>Hello World</button></a>
  </div>

  <img class="hamburger" src="speisekarte.svg" alt="hamburger-menu">

    </header>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="index.js" charset="utf-8"></script>
  </body>
</html>

this is my CSS:

*{                              /*Setting all to 0*/
  padding:0;
  margin:0;
  box-sizing: border-box;      /*If you set box-sizing: border-box; on an element, padding and border are included in the width and height*/
}

header {
  display: flex;              /* Das ist der Flex container (header) in ihm müssen items positioniert werden*/
  justify-content: space-between;    /*justify-content + align-itmes = center ==> perfect center*/
  align-items: center;
  background-color: #707070;
  padding: 30px 10%;
}

.logo {
  font-family: "Montserrat", sans-serif;
  font-weight: 800;
  cursor: pointer;
}

button {
  cursor: pointer;
  padding: 9px 25px;
  background-color: rgba(0, 136, 169, 1);    /* letzter ist alpha --> opacity, 1 = 100%*/
  border: none;
  border-radius: 50px;
  transition: all 0.3s ease 0s;
}

button:hover {
  background-color: rgba(0, 136, 169, 0.7);  /* alpha ändert sich beim hovern --> opacity nimmt ab, 0,7 = 70%*/
  text-decoration: none;
}

.btn a {
  text-decoration: none;
}

.nav-item {
  list-style: none;
}

.nav-item {
  display: inline-block;                    /* ul ist in reihe nicht untereinander. kann auch direkt an li gemacht werden*/
  padding: 0px 30px;
}

.navbar li a {
  transition: all 0.3s ease 0s;      /*letzter wert= delay, ease-in-out= vorwärts und rückwärts*/
}

.navbar li a:hover {
  color: #0088a9;
}


.nav-item a, button{
  text-decoration: none;
  color: #edf0f1;
  font-family: "Montserrat", sans-serif;
  font-size: 16px;
  font-weight: normal;
}

.hamburger {
  height:40px;
  cursor: pointer;
  position:relative;
}

.hamburger:hover {
  padding:2px;
  border: 2px solid;
  border-radius: 5px;
}

.hamburger-hide {
  display:none;
}

@media (max-width: 768px){
  .nav-list{
    display: none;
  }
  .cta {
    display: none;
  }

}

@media (min-width:769px){
  .hamburger{
    display:none;
  }
}

and this is the jQuery I tried, so that it hides on click.

        $(".hamburger").click(function(){
  $(".hamburger").toggleClass(".hamburger-hide");
})

Upvotes: 1

Views: 2130

Answers (2)

Anton Krug
Anton Krug

Reputation: 1781

Here you go:

https://jsfiddle.net/ap2rzb5x/1/

$("#hamburger").click(function(){
  $("#hamburger").toggleClass("hamburger-hide");
  $("#hamburger").toggleClass("hamburger");
})

Summary you toggled just that one class, didn't want you maybe switch them (toggle the original hamburger class away?). Just in case I matched on the ID instead of the class so I could toggle away the original hamburger and still be able to match it with the same code.

Another problem is that you toggled '.hamburger-hide' that's not the class name, it's called 'hamburger-hide' the dot is only used by jQuery as the dollar search. Same with #hamburger, it will find ID of hamburger not #hamburger-hide.

https://api.jquery.com/category/selectors/

Probably it's not exactly doing what you want, but I think it should unstuck you and you should be able to continue making what you intend to do.

Upvotes: 0

Adhitya
Adhitya

Reputation: 665

Solution with jQuery for build up Hamburger navbar responsive

For my example:

(function($) { // Begin jQuery
  $(function() { // DOM ready
    // If a link has a dropdown, add sub menu toggle.
    $('nav ul li a:not(:only-child)').click(function(e) {
      $(this).siblings('.nav-dropdown').toggle();
      // Close one dropdown when selecting another
      $('.nav-dropdown').not($(this).siblings()).hide();
      e.stopPropagation();
    });
    // Clicking away from dropdown will remove the dropdown class
    $('html').click(function() {
      $('.nav-dropdown').hide();
    });
    // Toggle open and close nav styles on click
    $('#nav-toggle').click(function() {
      $('nav ul').slideToggle();
    });
    // Hamburger to X toggle
    $('#nav-toggle').on('click', function() {
      this.classList.toggle('active');
    });
  }); // end DOM ready
})(jQuery);
@charset "UTF-8";
body{
 margin:0;
}
.navigation {
  height: 70px;
  background: #6d7993;
  font-family: montserrat, sans-serif;
  font-weight: 400;
  font-style: normal;
  opacity: 0.88;
}

.brand {
  position: absolute;
  padding-left: 20px;
  float: left;
  line-height: 70px;
  text-transform: uppercase;
  font-size: 1.4em;
}
.brand a,
.brand a:visited {
  color: #ffffff;
  text-decoration: none;
}

.nav-container {
  max-width: 1000px;
  margin: 0 auto;
}

nav {
  float: right;
}
nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
nav ul li {
  float: left;
  position: relative;
}
nav ul li a,
nav ul li a:visited {
  display: block;
  padding: 0 20px;
  line-height: 70px;
  background: #6d7993;
  color: #ffffff;
  text-decoration: none;
}
nav ul li a:hover,
nav ul li a:visited:hover {
  background: #4b5569;
  color: #ffffff;
}
nav ul li a:not(:only-child):after,
nav ul li a:visited:not(:only-child):after {
  padding-left: 4px;
  content: " ▾";
}
nav ul li ul li {
  min-width: 190px;
}
nav ul li ul li a {
  padding: 15px;
  line-height: 20px;
}

.nav-dropdown {
  position: absolute;
  display: none;
  z-index: 1;
  box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15);
}

/* Mobile navigation */
.nav-mobile {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  background: #6d7993;
  height: 70px;
  width: 70px;
}

@media only screen and (max-width: 798px) {
  .nav-mobile {
    display: block;
  }

  nav {
    width: 100%;
    padding: 70px 0 15px;
  }
  nav ul {
    display: none;
  }
  nav ul li {
    float: none;
  }
  nav ul li a {
    padding: 15px;
    line-height: 20px;
  }
  nav ul li ul li a {
    padding-left: 30px;
  }

  .nav-dropdown {
    position: static;
  }
}
@media screen and (min-width: 799px) {
  .nav-list {
    display: block !important;
  }
}
#nav-toggle {
  position: absolute;
  left: 18px;
  top: 22px;
  cursor: pointer;
  padding: 10px 35px 16px 0px;
}
#nav-toggle span,
#nav-toggle span:before,
#nav-toggle span:after {
  cursor: pointer;
  border-radius: 1px;
  height: 5px;
  width: 35px;
  background: #ffffff;
  position: absolute;
  display: block;
  content: "";
  transition: all 300ms ease-in-out;
}
#nav-toggle span:before {
  top: -10px;
}
#nav-toggle span:after {
  bottom: -10px;
}
#nav-toggle.active span {
  background-color: transparent;
}
#nav-toggle.active span:before, #nav-toggle.active span:after {
  top: 0;
}
#nav-toggle.active span:before {
  transform: rotate(45deg);
}
#nav-toggle.active span:after {
  transform: rotate(-45deg);
}

article {
  max-width: 1000px;
  margin: 0 auto;
  padding: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<section class="navigation">
  <div class="nav-container">
    <div class="brand">
      <a href="#!">Logo</a>
    </div>
    <nav>
      <div class="nav-mobile"><a id="nav-toggle" href="#!"><span></span></a></div>
      <ul class="nav-list">
        <li>
          <a href="#!">Home</a>
        </li>
        <li>
          <a href="#!">Contact Us</a>
        </li>
        <li>
          <a href="#!">Link</a>
        </li>
          </ul>        
      </ul>
    </nav>
  </div>
</section>

Updated

Solution 2, Using Pure CSS

body {
  margin: 0;
  font-family: Helvetica, sans-serif;
  background-color: #f4f4f4;
}

a {
  color: #000;
}

/* header */

.header {
  background-color: #fff;
  box-shadow: 1px 1px 4px 0 rgba(0,0,0,.1);
  position: fixed;
  width: 100%;
  z-index: 3;
}

.header ul {
  margin: 0;
  padding: 0;
  list-style: none;
  overflow: hidden;
  background-color: #fff;
}

.header li a {
  display: block;
  padding: 20px 20px;
  border-right: 1px solid #f4f4f4;
  text-decoration: none;
}

.header li a:hover,
.header .menu-btn:hover {
  background-color: #f4f4f4;
}

.header .logo {
  display: block;
  float: left;
  font-size: 2em;
  padding: 10px 20px;
  text-decoration: none;
}

/* menu */

.header .menu {
  clear: both;
  max-height: 0;
  transition: max-height .2s ease-out;
}

/* menu icon */

.header .menu-icon {
  cursor: pointer;
  display: inline-block;
  float: right;
  padding: 28px 20px;
  position: relative;
  user-select: none;
}

.header .menu-icon .navicon {
  background: #333;
  display: block;
  height: 2px;
  position: relative;
  transition: background .2s ease-out;
  width: 18px;
}

.header .menu-icon .navicon:before,
.header .menu-icon .navicon:after {
  background: #333;
  content: '';
  display: block;
  height: 100%;
  position: absolute;
  transition: all .2s ease-out;
  width: 100%;
}

.header .menu-icon .navicon:before {
  top: 5px;
}

.header .menu-icon .navicon:after {
  top: -5px;
}

/* menu btn */

.header .menu-btn {
  display: none;
}

.header .menu-btn:checked ~ .menu {
  max-height: 240px;
}

.header .menu-btn:checked ~ .menu-icon .navicon {
  background: transparent;
}

.header .menu-btn:checked ~ .menu-icon .navicon:before {
  transform: rotate(-45deg);
}

.header .menu-btn:checked ~ .menu-icon .navicon:after {
  transform: rotate(45deg);
}

.header .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:before,
.header .menu-btn:checked ~ .menu-icon:not(.steps) .navicon:after {
  top: 0;
}

/* 48em = 768px */

@media (min-width: 48em) {
  .header li {
    float: left;
  }
  .header li a {
    padding: 20px 30px;
  }
  .header .menu {
    clear: none;
    float: right;
    max-height: none;
  }
  .header .menu-icon {
    display: none;
  }
}
<header class="header">
  <a href="" class="logo">Your Logo</a>
  <input class="menu-btn" type="checkbox" id="menu-btn" />
  <label class="menu-icon" for="menu-btn"><span class="navicon"></span></label>
  <ul class="menu">
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Blog</a></li>
    <li><a href="#">Contact Me</a></li>
  </ul>
</header>

Upvotes: 1

Related Questions