Faire son site 10 : Trucs et astuces 13 - Menu tourniquet
Menu trucs et astuces


On a déjà vu comment faire un menu et, comme exemple, j'avais pris celui des trucs et astuces (on n'est jamais aussi bien servi que par soi-même). Cette fois, on va en voir un autre un peu plus amusant. Je l'ai limité à quatre options afin de ne pas avoir l'impression de réécrire le Bottin. Il est composé de deux parties distinctes qui peuvent être utilisées indépendamment l'une de l'autre.



<!-- Les quatre images qui tournent -->
<div id="bloc1">
  <a class="lien2" href="trucs8.html" target=_blank"><img id="im3" src="im3.jpg"></a>
  <a class="lien2" href="trucs11.html" target=_blank"><img id="im2" src="im2.jpg"></a>
  <a class="lien2" href="refCSS/keyframes.html" target=_blank"><img id="im4" src="im4.jpg"></a>
  <a class="lien2" href="trucs12.html" target=_blank"><img id="im1" src="im1.jpg"></a>
</div>

<!-- Le texte qui défile sous les images -->
<div id="legende">
  <div id="leg1"><a class="lien" href="trucs12.html" target=_blank">Un petit tour en hélicoptère</a></div>
  <div id="leg2"><a class="lien" href="refCSS/keyframes.html" target=_blank">Quelques mots sur la règle @keyframes</a></div>
  <div id="leg3"><a class="lien" href="trucs8.html" target=_blank">Derrière le mur, la plage</a></div>
  <div id="leg4"><a class="lien" href="trucs11.html" target=_blank">Une mongolfière en ville</a></div>
</div>


On va commencer par la partie HTML qui est quand même plus courte que la feuille de style. Comme je vous le disais, il y a deux blocs distincts. Le premier bloc contient les images qui sont des liens vers des pages du site et le deuxième bloc contient des bouts de texte associés aux images. Ce sont également des liens qui pointent vers les mêmes pages que les images.

Les quatre images sont des copies d'écran recadrées afin d'obtenir une taille raisonnable. Elles font chacune 280*210 pixels, le changement de taille se fait par les styles CSS afin de donner l'effet de profondeur. Les images sont positionnées sur trois plans. Au premier plan, l'image a sa taille normale et est nette. Au deuxième plan, il y a l'image de gauche et l'image de droite. Ces deux images reçoivent un léger effet de flou afin d'accroître l'effet de profondeur. Tant pis pour les utilisateurs d'Internet Explorer car une fois de plus, ce navigateur ne reconnait pas la chose. Ça devient lassant à la fin. Enfin, au troisième plan, on a l'image du fond qui elle, reçoit un effet de flou plus marqué.


<style>
#bloc1 {
  position: relative;
  width: 660px;
  height: 300px;
  overflow: hidden;
}
/* Photo du fond */
#im3 {
  position: absolute;
  width: 180px;
  height: 144px;
  margin-left: 240px;
  margin-top: 0px;
  filter: blur(3px);
  z_index: 1;
  animation-name: im3;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
/* Photo de gauche */
#im2 {
  position: absolute;
  width: 200px;
  height: 150px;
  margin-left: 0px;
  margin-top: 50px;
  filter: blur(2px);
  z_index: 3;
  animation-name: im2;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
/* Photo de droite */
#im4 {
  position: absolute;
  width: 200px;
  height: 150px;
  margin-left: 460px;
  margin-top: 50px;
  filter: blur(2px);
  z_index: 3;
  animation-name: im4;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
/* Photo de devant */
#im1 {
  position: absolute;
  width: 280px;
  height: 210px;
  margin-left: 190px;
  margin-top: 90px;
  filter: blur(0px);
  z_index: 5;
  animation-name: im1;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

/* Le texte qui défile */
/* ------------------- */

#legende {
  position: relative;
  width: 660px;
  height: 30px;
  background-color: dodgerblue;
  color: white;
  font-weight: bold;
  line-height: 30px;
  font-size: 20px;
  font-family: Arial;
  text-align: center;
  margin-top: 15px;
  border-radius: 6px;
  overflow: hidden;
}

/* Les quatre messages */

#leg1 {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 660px;
  height: 30px;
  visibility: hidden;
  margin-left: 660px;
  margin-top: 0px;

  animation-name: leg1;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#leg2 {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 660px;
  height: 30px;
  visibility: hidden;
  margin-left: 660px;
  margin-top: 0px;

  animation-name: leg2;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#leg3 {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 660px;
  height: 30px;
  visibility: hidden;
  margin-left: 660px;
  margin-top: 0px;

  animation-name: leg3;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#leg4 {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 660px;
  height: 30px;
  visibility: hidden;
  margin-left: 660px;
  margin-top: 0px;

  animation-name: leg4;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

/* Les règles @keyframes pour le texte */

@keyframes leg1 {
    0% { margin-left: 0px; margin-top: 0px; visibility: visible; }
   19% { margin-left: 0px; }
   25% { margin-left: -660px; margin-top: 0px; }
   26% { visibility: hidden; }
   27% { margin-left: 660px; margin-top: -100px; }
   93% { visibility: visible; }
   94% { margin-left: 660px; }
  100% { margin-left: 0px; }
}
@keyframes leg2 {
    0% { margin-left: 660px; margin-top: 0px; visibility: visible; }
   19% { margin-left: 660px; margin-top: 0px; visibility: visible; }
   25% { margin-left: 0px; margin-top: 0px; }
   44% { margin-left: 0px; }
   50% { margin-left: -660px; margin-top: 0px; }
   51% { visibility: hidden; }
   52% { margin-top: -100px; }
  100% { margin-left: 660px; margin-top: 0px; }
}

@keyframes leg3 {
    0% { margin-left: 660px; margin-top: 0px; visibility: visible; }
   44% { margin-left: 660px; margin-top: 0px; visibility: visible; }
   50% { margin-left: 0px; margin-top: 0px; }
   69% { margin-left: 0px; }
   75% { margin-left: -660px; margin-top: 0px; }
   76% { visibility: hidden; }
   77% { margin-top: -100px; }
  100% { margin-left: 660px; margin-top: 0px; }
}

@keyframes leg4 {
    0% { margin-left: 660px; margin-top: 0px; visibility: visible; }
   69% { margin-left: 660px; margin-top: 0px; visibility: visible; }
   75% { margin-left: 0px; margin-top: 0px; }
   94% { margin-left: 0px; }
  100% { margin-left: -660px; margin-top: 0px; }
}

/* Les règles @keyframes pour les photos */

@keyframes im1 {
    0% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   19% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   25% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   44% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   50% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   69% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   75% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   94% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
  100% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
}
@keyframes im2 {
    0% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   19% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   25% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   44% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   50% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   69% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   75% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   94% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
  100% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
}
@keyframes im4 {
    0% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   19% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   25% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   44% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   50% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   69% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   75% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   94% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
  100% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
}
@keyframes im3 {
    0% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   19% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
   25% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   44% { width: 200px; height: 150px; margin-left: 460px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   50% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   69% { width: 280px; height: 210px; margin-left: 190px; margin-top: 90px; filter: blur(0px); z-index: 5; }
   75% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
   94% { width: 200px; height: 150px; margin-left:   0px; margin-top: 50px; filter: blur(2px); z-index: 3; }
  100% { width: 180px; height: 144px; margin-left: 240px; margin-top:  0px; filter: blur(3px); z-index: 1; }
}

/* Les liens */

.lien {
  display: block;
  width: 660px;
  text-decoration: none;
  color: white;
}
.lien:visited {
  text-decoration: none;
  color: white;
}
.lien2 {
  text-decoration: none;
}
</style>


C'est long hein! C'est normal, il y a deux animations qui fonctionnent en même temps et il faut bien décrire les deux. Le principe est simple. L'animation se déroule en quatre temps ce qui nous donne 25% du temps pour chaque phase. Comme nous disposons de 20 secondes pour faire un tour complet, cela nous donne cinq secondes par phase. J'ai pris 19 et 6% pour faire une phase soit 3.8 et 1.2 secondes. Au final, nous avons :

Entre 0 et 19%l'image est fixe
Entre 19 et 25%l'image se déplace
Entre 25 et 44%l'image est fixe
Entre 44 et 50%l'image se déplace
Entre 50 et 69%l'image est fixe
Entre 69 et 75%l'image se déplace
Entre 75 et 94%l'image est fixe
Entre 94 et 100%l'image se déplace et revient à son point de départ

Dans les règles @keyframes des images (im1, im2, im3 et im4), nous nous retrouvons avec, chaque fois que l'image est fixe, deux fois la même ligne de code.

Sur chaque ligne, nous définissons six propriétés :
Lors de la description des images (#im1, #im2, #im3 et #im4), nous retrouvons nos six propriétés avec leurs valeurs respectives au point de départ de l'animation. Notez la position avec la valeur absolute. Les positions sont calculées par rapport à #bloc1 qui lui a la valeur relative afin de le placer dans le contexte de la page. Je viens de me rendre compte que j'avais mis la propriété overflow: hidden; alors que celle-ci est totalement superflue car tout se passe au sein de #bloc1.

On passe maintenant au texte qui défile sous les images. Le bloc qui contient ces bouts de texte s'appelle #legende et sa description mérite quelques remarques. La propriété line-height a une valeur égale à la hauteur du bloc. Comme le texte est plus petit, cela permet de le centrer verticalement. En contrepartie, cela nous limite à un texte sur une ligne unique. La propriété overflow avec la valeur hidden trouve ici toute sa place car les textes sont situés en dehors du bloc et ne sont visibles que lorsqu'il y a besoin d'eux.

La propriété visibility des textes est à hidden car nous allons jouer avec lors du déplacement de ceux-ci.

Dans les règles @keyframes on retrouvent les mêmes étapes que pour les images soit 0%, 19%, 25%, 44%, 50%, 69%, 75%, 94% et 100% afin de synchroniser le texte avec les images.

A ces valeurs, il a fallu en rajouter d'autres. Une fois que le texte a été affiché et qu'il est ressorti du bloc, pour assurer le retour au point de départ, on rend le texte invisible, on le positionne 100 pixels au dessus du bloc et retour au point de départ.