Dimanche 14 avril 2019
Je déteste javascript autant que je honnis css. Mais il faut en passer par eux parfois.
Deux objectifs indépendants :
Intentionnellement tout est dans le même fichier : html, css, et javascript. Beurk !
Volontairement le code sera minimaliste dépouillé de toute fioriture, afin de se concentrer sur l'essentiel
Le résultat souhaité est dans le fichier hamburger
<div id="header"><span class="hamburger">☰<div class="dropdown"><a href="#">Acceuil</a><a href="#">Rubrique 1</a><a href="#">Rubrique 2</a><a href="#">Rubrique 3</a></div></span>Hamburguer menu</div>
La div id="header est la barre du titre de la page.
La div dropdown est un conteneur positionné.
Puis viennent le bouton et les rubriques du menu. J'aurais pu ou dû faire des <li> ... </li>. Ça marche bien sans ...
Tout se joue dans le css.
Le sélecteur #header définit un conteneur de la barre menu-titre
#header {display: inline-block;width: 100%;}
La classe hamburger contiendra le hamburger ☰. Elle a pour fonction d'être positionnée.
.hamburger {position: relative;}
La classe dropdown conviendra pour le menu déroulant, qui sera invisible (display: none;)
.dropdown {position: relative;display: none;}
Viennent ensuite les styles des items du menu déroulant. C'est cosmétique.
.dropdown a {display: block;text-decoration: none;}.dropdown a:hover {background-color: black;color: white;}
Le nerf de la guerre est ici. Le survol du bouton ☰ rend le menu déroulant visible.
.hamburger:hover .dropdown {display: block;}
Le but est donc de faire une boîte dans laquelle on peut faire défiler les images une à une, en cliquant dedans. Comme dans la boîte suivante.
Remarque : Les images n'ont d'intérêt que d'être disponibles dans ce site
Le code se résume à un identifiant slideshow qui contient des balises <img ... de classe sldimg.
<div id="<slideshow"><img class="sldimg" src="../img/eglise.jpg" style="display: block" alt="église"/><img class="sldimg" src="../img/leibniz.png" alt="graphe leibniz"/><img class="sldimg" src="../img/splineFig1_2.jpg" alt="graphe spline"/><img class="sldimg" src="../img/splineFig3.jpg" alt="graphe spline 2"/></div>
Sauf la première elles sont toutes invisibles, par défaut.
Le choix d'un identifiant et non d'une class sera utile pour le javascript. Sinon c'est banal.
#slideshow {width: 300px; height: 200px;margin: 0; padding: 0;border: 2px solid grey;overflow: hidden;}
Quand à la classe sldimg, son rôle est de permettre de la déclarer avec un display: none pour l'empêcher de s'afficher.
.sldimg {float: none;margin: 0 auto;height: 200px; max-width: 300px;display: none;}
Seule la première image sera forcée dans le code html à l'affichage.
C'est un code simpliste, où on ne détecte de clic que dans la boîte.
var slideshow = document.getElementById("slideshow");var slides = slideshow.getElementsByClassName("sldimg");slideshow.addEventListener("click", function(event) {var i;var len = slides.length;if(slides[len - 1].style.display == "block") { // cycleslides[0].style.display = "block";slides[len- 1].style.display = "none";} else {for(i=0; i<len-1; i++) { // set nextif(slides[i].style.display == "block") {slides[i].style.display = "none";slides[i + 1].style.display = "block";break;}}}});
La variable slideshow sélectionne l'identifiant slideshow.
La variable sldimg est un tableau contenant les images.
La fonction addEventListener crée un écouteur de clics de souris qui bascule l'image visible en invisible et rend l'image suivante visible. Cette fonction boucle, c'est à dire qu'à la fin elle revient au début.
Le code js fourni dans le fichier d'exemple slides est un peu plus élaboré. On teste la position du clic. S'il est dans la moitié droite de la boite on avance d'une image, sinon on recule.
Pour javascript j'utilise esprima
Et pour css j'utilise le service de W3C.
C'est très utile car les erreurs sont quatre fois sur cinq des coquilles : un deux-points en place d'un point-virgule, un caractère qui traine, etc.