[RESOLU] menu déroulant qui fonctionne en tactile

menu déroulant qui fonctionne en tactile [RESOLU] - Javascript/Node.js - Programmation

Marsh Posté le 30-12-2018 à 21:09:52    

:hello: tout le forum.
 
J'ai besoin de votre aide.
 
Je souhaite réaliser un menu déroulant qui fonctionne en tactile (surface pro 4 et Microsoft Edge)
 
J'ai fait des recherches et j'en ai trouvé qui me conviendrait ici(codepen.io) mais je n'arrive pas à le coder correctement.
 

Code :
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.  <meta charset="utf-8"/>
  5.  <link rel="stylesheet" href="/css/menu.css"/>
  6.  <script type="text/javascript">
  7.   (function() {
  8.     var tabMenu = document.querySelectorAll('.deroule');
  9.     var tabD = document.querySelectorAll('ul ul');
  10.     function deroule(e){
  11.    e.stopPropagation();
  12.    obj = this.querySelector('ul');
  13.    if(!this.open){
  14.      tabMenu.forEach(ferme);
  15.      obj.style.display = "block";
  16.      this.open = true;
  17.    }else{
  18.      obj.style.display = "none";
  19.      this.open = false;
  20.    }
  21.     }
  22.     var ferme = function(obj,i){
  23.    tabD[i].style.display = "none";
  24.    obj.open = false;
  25.     }
  26.     var init = function(obj){
  27.    obj.addEventListener("click",deroule);
  28.    obj.open = false;
  29.     }
  30.     tabMenu.forEach(init);
  31.     window.addEventListener("click",function(){
  32.    tabMenu.forEach(ferme);
  33.     });
  34.     window.addEventListener("scroll",function(){
  35.    tabMenu.forEach(ferme);
  36.     });
  37.   })();
  38.  </script>
  39.  <title>test.php</title>
  40. </head>
  41. <body>
  42.  <nav>
  43.    <ul>
  44.   <li><a href="#">Accueil</a></li>
  45.   <li class="deroule"><a href="#">About <span class="fleche"></span></a>
  46.     <ul>
  47.    <li><a href="#" onclick="alert(2)">about 1</a></li>
  48.    <li><a href="#">about 2</a></li>
  49.    <li><a href="#">about 3</a></li>
  50.     </ul>
  51.   </li>
  52.   <li class="deroule"><a href="#">Services <span class="fleche"></span></a>
  53.     <ul>
  54.    <li><a href="#">services 1</a></li>
  55.    <li><a href="#">services 2</a></li>
  56.    <li><a href="#">services 3</a></li>
  57.    <li><a href="#">services 4</a></li>
  58.    <li><a href="#">services 5</a></li>
  59.     </ul>
  60.   </li>
  61.   <li><a href="#">Blog</a></li>
  62.   <li><a href="#">Contact</a></li>
  63.    </ul>
  64.  </nav>
  65.  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Sapiente cumque tenetur recusandae. Non deserunt illo cupiditate minus quae magnam dolor doloribus ad exercitationem ipsam molestiae eius, vitae aut animi molestias?</p>
  66. </body>
  67. </html>


 
Quand je le test avec chrome sur mon PC de bureau, le menu s'affiche correctement mais quand je clic sur About ou Service le menu ne se déroule pas.
 
Merci pour votre aide.


Message édité par kewan le 31-12-2018 à 14:39:02
Reply

Marsh Posté le 30-12-2018 à 21:09:52   

Reply

Marsh Posté le 31-12-2018 à 13:53:16    

Bonjour,

 

Il manque un point-virgule ligne 27 et 31, je n'ai pas testé le code mais cela peut suffire à le faire dysfonctionner.


Message édité par MaybeEijOrNot le 31-12-2018 à 13:56:01

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 31-12-2018 à 14:26:19    

:hello: merci.
 
j'ai rajouter les deux points-virgule.
 
mais ça fonctionne toujours pas.

Reply

Marsh Posté le 31-12-2018 à 14:38:41    

J'ai trouvé pourquoi ça ne fonctionne pas en affichant le code source de la page https://codepen.io/salsacobo/pen/zKavVd.
 
Il faut mettre le script après le code html du menu.
 
Par contre si quelqu'un peut m'expliquer pourquoi?
 

Code :
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.  <meta charset="utf-8"/>
  5.  <link rel="stylesheet" href="/css/menu.css"/>
  6.  <title>test.php</title>
  7. </head>
  8. <body>
  9.  <nav>
  10.   <ul>
  11.    <li><a href="#">Accueil</a></li>
  12.    <li class="deroule"><a href="#">About <span class="fleche"></span></a>
  13.     <ul>
  14.      <li><a href="#" onclick="alert(2)">about 1</a></li>
  15.      <li><a href="#">about 2</a></li>
  16.      <li><a href="#">about 3</a></li>
  17.     </ul>
  18.    </li>
  19.    <li class="deroule"><a href="#">Services <span class="fleche"></span></a>
  20.     <ul>
  21.      <li><a href="#">services 1</a></li>
  22.      <li><a href="#">services 2</a></li>
  23.      <li><a href="#">services 3</a></li>
  24.      <li><a href="#">services 4</a></li>
  25.      <li><a href="#">services 5</a></li>
  26.     </ul>
  27.    </li>
  28.    <li><a href="#">Blog</a></li>
  29.    <li><a href="#">Contact</a></li>
  30.   </ul>
  31.  </nav>
  32.  <p>chapitre</p>
  33.  <script>
  34.   (function(){
  35.    var tabMenu = document.querySelectorAll('.deroule');
  36.    var tabD = document.querySelectorAll('ul ul');
  37.    function deroule(e){
  38.     e.stopPropagation();
  39.     obj = this.querySelector('ul');
  40.     if(!this.open){
  41.      tabMenu.forEach(ferme);
  42.      obj.style.display = "block";
  43.      this.open = true;
  44.     }
  45.     else{
  46.      obj.style.display = "none";
  47.      this.open = false;
  48.     }
  49.    }
  50.    var ferme = function(obj, i){
  51.     tabD[i].style.display = "none";
  52.     obj.open = false;
  53.    };
  54.    var init = function(obj){
  55.     obj.addEventListener("click", deroule);
  56.     obj.open = false;
  57.    };
  58.    tabMenu.forEach(init);
  59.    window.addEventListener("click", function(){
  60.     tabMenu.forEach(ferme);
  61.    });
  62.    window.addEventListener("scroll", function(){
  63.     tabMenu.forEach(ferme);
  64.    });
  65.   })();
  66.  </script>
  67. </body>
  68. </html>


Message édité par kewan le 31-12-2018 à 14:47:22
Reply

Marsh Posté le 31-12-2018 à 15:02:37    

En fait, dans ta première version, le javascript est chargé et exécuté avant ton HTML, du coup ça ne fonctionne pas. Soit tu ajoutes ton script en effet en fin de HTML et comme ça il est interprété après, soit tu demandes de l’exécuter une fois le HTML chargé.

 

Perso je mets toujours mon js dans une fonction que j'appelle avec onLoad="mafonction()" dans la balise body, ainsi le js est chargé avant le HTML mais exécuté qu'une fois que le HTML est chargé. Je ne sais pas si c'est la meilleure méthode à utiliser mais au moins je n'ai jamais de surprise.


Message édité par MaybeEijOrNot le 31-12-2018 à 15:03:13

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 31-12-2018 à 15:10:02    

Le pourquoi, c'est parce que tu ne déclenchais pas l'exécution du script au bon moment.
Parce que s'il s'exécute trop tôt...
 

Code :
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8"/>
  5.     <link rel="stylesheet" href="/css/menu.css"/>
  6.     <script type="text/javascript">
  7.       window.onload = function() {
  8.   var tabMenu = document.querySelectorAll('.deroule');
  9.   var tabD = document.querySelectorAll('ul ul');
  10.   function deroule(e){
  11.       e.stopPropagation();
  12.       obj = this.querySelector('ul');
  13.       if(!this.open){
  14.    tabMenu.forEach(ferme);
  15.    obj.style.display = "block";
  16.    this.open = true;
  17.       }else{
  18.    obj.style.display = "none";
  19.    this.open = false;
  20.       }
  21.   }
  22.   var ferme = function(obj,i){
  23.       tabD[i].style.display = "none";
  24.       obj.open = false;
  25.   }
  26.   var init = function(obj){
  27.       obj.addEventListener("click",deroule);
  28.       obj.open = false;
  29.   }
  30.   tabMenu.forEach(init);
  31.   window.addEventListener("click",function(){
  32.       tabMenu.forEach(ferme);
  33.   });
  34.   window.addEventListener("scroll",function(){
  35.       tabMenu.forEach(ferme);
  36.   });
  37.       };
  38.     </script>
  39.     <style>
  40.       /* reset */
  41.       *{
  42.   box-sizing: border-box;
  43.       }
  44.       ul{
  45.   list-style-type: none;
  46.   margin: 0;
  47.   padding: 0;
  48.       }
  49.       /* custom menu */
  50.       nav:after{
  51.   content: "";
  52.   clear: both;
  53.   display: block;
  54.       }
  55.       nav a{
  56.   display: block;
  57.   text-decoration: none;
  58.   white-space: nowrap;
  59.       }
  60.       nav ul ul{
  61.   background-color: #fff;
  62.   display: none;
  63.   position: absolute;
  64.   min-width: 100%;
  65.       }
  66.       nav>ul{
  67.   display: flex;
  68.       }
  69.       nav>ul>li{
  70.   position: relative;
  71.   margin: 1px;
  72.   flex-grow: 1;
  73.       }
  74.       nav ul ul li+li{
  75.   border-top: 1px solid white;
  76.       }
  77.       nav ul li a{
  78.   background-color: silver;
  79.   padding: 10px 20px;
  80.   color: black;
  81.   text-align: center;
  82.       }
  83.       nav>ul>li>a{
  84.   background-color: rgb(63,70,76);
  85.   color: white;
  86.       }
  87.       nav ul ul a{
  88.   background-color:  rgb(282,97,1);
  89.   color: white;
  90.       }
  91.       .fleche {
  92.   display: inline-block;
  93.   width: 0;
  94.   height: 0;
  95.   margin-left: 4px;
  96.   vertical-align: middle;
  97.   border-top: 6px solid;
  98.   border-right: 6px solid transparent;
  99.   border-left: 6px solid transparent;
  100.       }
  101.     </style>
  102.     <title>test.php</title>
  103.   </head>
  104.   <body>
  105.     <nav>
  106.       <ul>
  107. <li><a href="#">Accueil</a></li>
  108. <li class="deroule"><a href="#">About <span class="fleche"></span></a>
  109.   <ul>
  110.     <li><a href="#" onclick="alert(2)">about 1</a></li>
  111.     <li><a href="#">about 2</a></li>
  112.     <li><a href="#">about 3</a></li>
  113.   </ul>
  114. </li>
  115. <li class="deroule"><a href="#">Services <span class="fleche"></span></a>
  116.   <ul>
  117.     <li><a href="#">services 1</a></li>
  118.     <li><a href="#">services 2</a></li>
  119.     <li><a href="#">services 3</a></li>
  120.     <li><a href="#">services 4</a></li>
  121.     <li><a href="#">services 5</a></li>
  122.   </ul>
  123. </li>
  124. <li><a href="#">Blog</a></li>
  125. <li><a href="#">Contact</a></li>
  126.       </ul>
  127.     </nav>
  128.     <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Sapiente cumque tenetur recusandae. Non deserunt illo cupiditate minus quae magnam dolor doloribus ad exercitationem ipsam molestiae eius, vitae aut animi molestias?</p>
  129.   </body>


 
En principe, c'est sur un window.onload que ça se fait (bonnes pratiques, toussa) quand c'est global à la fenêtre.
Bon, comme d'hab, mon indentation a été pétée par la mise en page du forum.
 
A+,


Message édité par gilou le 31-12-2018 à 15:22:17

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-12-2018 à 17:49:22    

Merci pour vos explications,
 
ça fonctionne.  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed