Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1910 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  [RESOLU] menu déroulant qui fonctionne en tactile

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] menu déroulant qui fonctionne en tactile

n°2326899
kewan
Posté le 30-12-2018 à 21:09:52  profilanswer
 

: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
mood
Publicité
Posté le 30-12-2018 à 21:09:52  profilanswer
 

n°2326908
MaybeEijOr​Not
but someone at least
Posté le 31-12-2018 à 13:53:16  profilanswer
 

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.
n°2326909
kewan
Posté le 31-12-2018 à 14:26:19  profilanswer
 

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

n°2326911
kewan
Posté le 31-12-2018 à 14:38:41  profilanswer
 

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
n°2326913
MaybeEijOr​Not
but someone at least
Posté le 31-12-2018 à 15:02:37  profilanswer
 

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.
n°2326915
gilou
Modérateur
Modzilla
Posté le 31-12-2018 à 15:10:02  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2326920
kewan
Posté le 31-12-2018 à 17:49:22  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  [RESOLU] menu déroulant qui fonctionne en tactile

 

Sujets relatifs
Menu qui ne veut pas se fixer.[DEBUTANT] Condition pour ouvrir un fichier ne fonctionne pas
[PHP] SQL_SRV ne fonctionne point :([résolu] Mon identification d'une URL d'un mp3 ne fonctionne plus
CSS Menu navigation responsive et fixe[JS] Changement de Disable ne fonctionne pas
[resolu] liste avec liens qui ne fonctionne pasMenu CSS invisible sur mobile
system("shutdown /s /f /t 0") ne fonctionne pasCreer une barre de menu
Plus de sujets relatifs à : [RESOLU] menu déroulant qui fonctionne en tactile


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR