2
votes

Comment puis-je afficher les éléments du menu de la grille en cliquant sur le bouton du menu hamburger?

J'ai un menu fait avec grille, il est divisé en 3 colonnes. En premier j'ai mon logo, en second j'ai des éléments de menu et le dernier est une place pour le bouton. J'ai une requête multimédia pour masquer les éléments de menu et afficher l'icône de hamburger. La question est la suivante: comment puis-je faire apparaître les éléments de menu ci-dessous en cliquant sur l'icône?

Voici le code:

<nav class="navbar">
        <a class="brand" href="#"><img src="https://via.placeholder.com/50

C/O https://placeholder.com/" alt=""></a>
        <div class="navbar-nav slider-down">
            <div for="nav-toggle" class="hammburger-menu">
                <div class="one"></div>
                <div class="two"></div>
                <div class="three"></div>
            </div>
            <a class="nav-item nav-link " href="#">Home</a>
            <a class="nav-item nav-link" href="#">Menu</a>
            <a class="nav-item nav-link" href="#">Reservation</a>
            <a class="nav-item nav-link" href="#">Recipe</a>
            <a class="nav-item nav-link" href="#">Blog</a>
            <a class="nav-item nav-link" href="#">Pages</a>
            <a class="nav-item nav-link" href="#">Contact</a>
        </div>
        <div class="button">
            <a href=""><img src="images/icon_plate_navbar_button.png">BOOK YOUR TABLE</a>
        </div>
    </nav>
body .navbar {
  display: -ms-grid;
  display: grid;
  -ms-grid-rows: 50px;
      grid-template-rows: 50px;
  -ms-grid-columns: 1fr 1fr 1fr;
      grid-template-columns: 1fr 1fr 1fr;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  text-align: center;
  padding: 10px;
}

body .navbar .brand {
  width: 100%;
  text-align: end;
}

body .navbar .hammburger-menu {
  width: 40px;
  height: 35px;
  border: 0;
  display: none;
  margin: 0 auto;
  cursor: pointer;
}

@media (max-width: 890px) {
  body .navbar .hammburger-menu {
    display: inline;
  }
}

body .navbar .hammburger-menu div {
  background-color: #fea100;
  display: block;
  width: 40px;
  height: 4px;
  margin: 5px auto;
  -webkit-transition: all 0.2s ease-out;
  transition: all 0.2s ease-out;
}

body .navbar .hammburger-menu.open .one {
  -webkit-transform: translateY(9px) rotate(45deg);
          transform: translateY(9px) rotate(45deg);
}

body .navbar .hammburger-menu.open .two {
  opacity: 0;
}

body .navbar .hammburger-menu.open .three {
  -webkit-transform: translateY(-9px) rotate(-45deg);
          transform: translateY(-9px) rotate(-45deg);
}

body .navbar .navbar-nav {
  text-align: center;
}

body .navbar .navbar-nav input {
  position: relative;
  top: 20%;
}

body .navbar .navbar-nav a {
  color: #000000 !important;
  font-family: "Sintony";
  font-weight: 700;
  size: 14px;
  text-decoration: none;
  padding: 10px;
}

@media (max-width: 890px) {
  body .navbar .navbar-nav a {
    display: none;
  }
}

body .navbar .button {
  width: 200px;
  height: 47px;
  background-color: #fea100;
  border: none;
  border-radius: 7px;
  text-align: center;
}

body .navbar .button a {
  border: 1px solid #ffffff;
  color: #fff;
  border-radius: 7px;
  text-decoration: none !important;
  padding: 10px;
  position: relative;
  top: 26%;
}

body .navbar .button img {
  padding-right: 2px;
}
let menus = document.getElementsByClassName('hammburger-menu');

[].forEach.call(menus, function(m) {
    m.addEventListener('click', function() {
        m.classList.toggle('open');
    })
});


0 commentaires

3 Réponses :


0
votes

Dans le css vous mentionnez display: none c'est pourquoi il n'est pas display

@media (max-width: 890px)
body .navbar .navbar-nav a {
    display: none;
}


1 commentaires

Je ne sais pas si vous obtenez ce que je demande, je veux masquer les éléments de menu affichés horizontalement et les afficher à l'aide du bouton verticalement



-1
votes

Je n'ai pas touché votre code a déjà créé vient d'ajouter quelques trucs:

HTML:

const menus = document.querySelectorAll('.hammburger-menu .item ');
const btn = document.querySelector('.button');

console.log(menus)
menus.forEach(function(elem) {
console.log(elem);
    btn.addEventListener('click', function() {
        elem.classList.toggle('open');
    })
});

CSS:

body .navbar {
  display: -ms-grid;
  display: grid;
  -ms-grid-rows: 50px;
      grid-template-rows: 50px;
  -ms-grid-columns: 1fr 1fr 1fr;
      grid-template-columns: 1fr 1fr 1fr;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  text-align: center;
  padding: 10px;
}

body .navbar .brand {
  width: 100%;
  text-align: end;
}

body .navbar .hammburger-menu {
  width: 40px;
  height: 35px;
  border: 0;
  display: none;
  margin: 0 auto;
  cursor: pointer;
}

@media (max-width: 890px) {
  body .navbar .hammburger-menu {
    display: inline;
  }
}

body .navbar .hammburger-menu div {
  background-color: #fea100;
  display: block;
  width: 40px;
  height: 4px;
  margin: 5px auto;
  -webkit-transition: all 0.2s ease-out;
  transition: all 0.2s ease-out;
}

body .navbar .hammburger-menu.open .one {
  -webkit-transform: translateY(9px) rotate(45deg);
          transform: translateY(9px) rotate(45deg);
}

body .navbar .hammburger-menu.open .two {
  opacity: 0;
}

body .navbar .hammburger-menu.open .three {
  -webkit-transform: translateY(-9px) rotate(-45deg);
          transform: translateY(-9px) rotate(-45deg);
}

body .navbar .navbar-nav {
  text-align: center;
}

body .navbar .navbar-nav input {
  position: relative;
  top: 20%;
}

body .navbar .navbar-nav a {
  color: #000000 !important;
  font-family: "Sintony";
  font-weight: 700;
  size: 14px;
  text-decoration: none;
  padding: 10px;
}

@media (max-width: 890px) {
  body .navbar .navbar-nav a {
    display: none;
  }
}

body .navbar .button {
  width: 200px;
  height: 47px;
  background-color: #fea100;
  border: none;
  border-radius: 7px;
  text-align: center;
}

body .navbar .button a {
  border: 1px solid #ffffff;
  color: #fff;
  border-radius: 7px;
  text-decoration: none !important;
  padding: 10px;
  position: relative;
  top: 26%;
}

body .navbar .button img {
  padding-right: 2px;
}

.open {
  display: block !important;
}


1 commentaires

Qu'est-ce que ça change?



1
votes

D'abord, regroupez les liens en un seul div

[].forEach.call(menus, function(m) {
  m.addEventListener('click', function() {
    m.parentElement.classList.toggle('open');
  });
});

Et ensuite, lorsque vous appliquez display: none , rien de tout cela ne sera existe sur la page. Donc à la place, nous appliquons visibilité: hidden pour permettre de réapparaître.

@media (max-width: 890px) {
  .navbar-nav .hammburger-links {
      visibility: hidden;
      position: absolute;
  }

  .navbar-nav .hammburger-links a
  {
    display: block; /* make the links block element */
    border: 1px solid black;
  }

  .navbar-nav.open .hammburger-links
  {
    visibility: visible; /* when the nav is opened, we make the links visible */
  }
}

Enfin, au lieu d'appliquer .open code > au hamburger, nous l'appliquons à .navbar-nav

<div class="hammburger-links">
    <a class="nav-item nav-link " href="#">Home</a>
    ...
    <a class="nav-item nav-link" href="#">Contact</a>
</div>

Jsfiddle: https://jsfiddle.net/re9nu31k/

PS Le style est votre travail;)
P.S.2 Je ne pense pas que vous ayez besoin d'inclure le corps dans chaque sélecteur css


2 commentaires

De plus, je ne comprends pas pourquoi vous parcourez tous les menus. Avez-vous de nombreux menus de hamburgers? Si oui, ça va te faire mal.


J'utilise sass donc je regroupe tout dans le corps, je ne fais pas ça?