Comment faire un menu accordion ?

Le 31-10-2023 13:33

Comment faire un menu accordion en JavaScript

Accordéon

Les accordéons sont utiles lorsque vous souhaitez basculer entre masquer et afficher une grande quantité de contenu :

Créer un accordéon

 

Étape 1) Ajoutez du HTML :
          
            <button class="accordion">Section 1</button>
            <div class="panel">
              <p>Lorem ipsum...</p>
            </div>
            
            <button class="accordion">Section 2</button>
            <div class="panel">
              <p>Lorem ipsum...</p>
            </div>
            
            <button class="accordion">Section 3</button>
            <div class="panel">
              <p>Lorem ipsum...</p>
            </div>
          
        

 

Étape 2) Ajoutez du CSS :

Stylisez l'accordéon :


          /* Style the buttons that are used to open and close the accordion panel */
          .accordion {
            background-color: #eee;
            color: #444;
            cursor: pointer;
            padding: 18px;
            width: 100%;
            text-align: left;
            border: none;
            outline: none;
            transition: 0.4s;
          }
          
          /* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
          .active, .accordion:hover {
            background-color: #ccc;
          }
          
          /* Style the accordion panel. Note: hidden by default */
          .panel {
            padding: 0 18px;
            background-color: white;
            display: none;
            overflow: hidden;
          }  
        
Étape 3) Ajoutez JavaScript :


          var acc = document.getElementsByClassName("accordion");
          var i;
          
          for (i = 0; i < acc.length; i++) {
            acc[i].addEventListener("click", function() {
              /* Toggle between adding and removing the "active" class,
              to highlight the button that controls the panel */
              this.classList.toggle("active");
          
              /* Toggle between hiding and showing the active panel */
              var panel = this.nextElementSibling;
              if (panel.style.display === "block") {
                panel.style.display = "none";
              } else {
                panel.style.display = "block";
              }
            });
          }       
        

Accordéon animé (glisser vers le bas)

Pour créer un accordéon animé, ajoutez max-height: 0overflow: hiddenet a transitionpour la propriété max-height, à la panelclasse.

Ensuite, utilisez JavaScript pour faire glisser le contenu vers le bas en définissant un calcul max-height, en fonction de la hauteur du panneau sur différentes tailles d'écran :

          
            <style>
            .panel {
              padding: 0 18px;
              background-color: white;
              max-height: 0;
              overflow: hidden;
              transition: max-height 0.2s ease-out;
            }
            </style>
            
            <script>
            var acc = document.getElementsByClassName("accordion");
            var i;
            
            for (i = 0; i < acc.length; i++) {
              acc[i].addEventListener("click", function() {
                this.classList.toggle("active");
                var panel = this.nextElementSibling;
                if (panel.style.maxHeight) {
                  panel.style.maxHeight = null;
                } else {
                  panel.style.maxHeight = panel.scrollHeight + "px";
                }
              });
            }
            </script>
          
        

 

Ajouter des icônes

Ajoutez un symbole à chaque bouton pour indiquer si le contenu réductible est ouvert ou fermé :

          
            .accordion:after {
              content: '\02795'; /* Unicode character for "plus" sign (+) */
              font-size: 13px;
              color: #777;
              float: right;
              margin-left: 5px;
            }
            
            .active:after {
              content: "\2796"; /* Unicode character for "minus" sign (-) */
            }