Faire son site 10 : Trucs et astuces 2 - On se bouge
Menu trucs et astuces


On a vu, page précédente, comment améliorer un peu la présentation des conteneurs. Maintenant, on va les rendre moins statiques en les faisant bouger un peu, toujours sans programmation.

 On se bouge 


Balise <marquee>

Avant l'arrivée de HTML 5 et de CSS 3, la seule façon de faire bouger un objet sans avoir recours à la programmation était la balise <marquee>.


<center>
<marquee loop="-1" width="400" direction="right" scrollamount="10">
<img src="hélico.jpg" width="120" height="62">
</marquee><br>
<marquee loop="-1" width="400" direction="left" scrollamount="10">
Balise <b>&lt;marquee&gt;</b>
</marquee>
</center>


Nous avons vu le plus facile,

passons aux choses sérieuses.






C'est OK


<style>
#carre {
  width: 100px;
  height: 100px;
  background-color: red;
  -webkit-animation-name: exemple;
  -webkit-animation-duration: 4s;
  -webkit-animation-iteration-count: infinite;
  -ms-animation-name: exemple;
  -ms-animation-duration: 4s;
  -ms-animation-iteration-count: infinite;
  animation-name: exemple;
  animation-duration: 4s;
  animation-iteration-count: infinite;
}

@-webkit-keyframes exemple {
  from {background-color: red;}
  to {background-color: blue;}
}
@-ms-keyframes exemple {
  from {background-color: red;}
  to {background-color: blue;}
}
@keyframes exemple {
  from {background-color: red;}
  to {background-color: blue;}
}
</style>

<div id="carre" style="color:yellow; font-weight:bold; text-align:center;"><br><br>C'est OK</div>


On va s'attaquer maintenant à la propriété animation qui, comme son nom l'indique, va nous permettre à donner un peu de vie à notre page. Ne vous souciez pas de la longueur du code, c'est beaucoup plus simple qu'il parait à première vue. Nous sommes obligés d'utiliser les préfixes vendeurs en particulier pour Internet Explorer qui dans sa version 11 fait encore des siennes.

La majeure partie du code est dans la feuille de style.

width et height définissent la taille du carré.
background-color donne la couleur de fond pour les navigateurs qui ignorent la propriété animation
animation-name: donne un nom de référence à notre animation
animation-duration: indique le temps que durera l'animation. La durée est indiquée en secondes (s) ou en millisecondes (ms)
animation-iteration-count: indique le nombre de fois que l'animation va être exécutée. Vous devez donner une valeur entière positive. Si vous mettez infinite, l'animation tournera en boucle.

A ce stade, nous savons comment va fonctionner notre animation. Il ne reste plus qu'à lui dire ce qu'elle va faire. C'est ce que va expliquer la règle @keyframes à laquelle on donne le nom attribué à animation-name. Dans notre exemple, il y a deux étapes. Le point de départ et le point d'arrivée spécifiés par from et to. Notre carré va donc passer du rouge au bleu en 4 secondes. Ce qu'il faut noter, c'est la syntaxe utilisée. Nous avons une première paire d'accolades pour le @keyframes et, une autre paire d'accolades pour chaque étape.



C'est OK


<style>
#carre2 {
  position: relative;
  width: 100px;
  height: 100px;
  background-color: red;
  -webkit-animation-name: exemple2;
  -webkit-animation-duration: 4s;
  -webkit-animation-iteration-count: infinite;
  -webkit-animation-direction: alternate;
  -ms-animation-name: exemple2;
  -ms-animation-duration: 4s;
  -ms-animation-iteration-count: infinite;
  -ms-animation-direction: alternate;
  animation-name: exemple2;
  animation-duration: 4s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

@-webkit-keyframes exemple2 {
  from {background-color: red;}
  to {background-color: blue; margin-left: 400px}
}
@-ms-keyframes exemple2 {
  from {background-color: red;}
  to {background-color: blue; margin-left: 400px}
}
@keyframes exemple2 {
  from {background-color: red;}
  to {background-color: blue; margin-left: 400px}
}
</style>

<div id="carre2" style="color:yellow; font-weight:bold; text-align:center;"><br><br>C'est OK</div>



Lorsque l'on compare le déplacement de notre carré avec le déplacement obtenu avec la balise <marquee>, il n'y a pas photo. Le CSS est beaucoup plus souple et fluide d'où l'intérêt d'utiliser la deuxième méthode. Il n'y a que deux choses qui changent dans le code du premier exemple et dans celui du deuxième. Tout d'abord il y a animation-direction: alternate; qui permet à l'animation de faire des allers-retours. On peut remplacer alternate par reverse pour que l'animation débute à la position finale. On peut également mettre les deux en les séparant par une virgule.

La deuxième chose qui change, c'est margin-left: 400px qui "pousse" le carré vers la droite de 400 pixels. On va voir dans l'exemple suivant l'intérêt d'utiliser margin-left plutôt que left. En fait, cela va nous permettre de mieux gérer la mise en place de notre animation.



C'est OK

On retrouve notre carré pour la troisième fois. Cette fois, j'ai mis une bordure afin de mieux percevoir le déplacement.


<style>
#carre3 {
  position: relative;
  margin: 0px;
  top: -100px;
  width: 100px;
  height: 100px;
  background-color: red;
  -webkit-animation-name: exemple3;
  -webkit-animation-duration: 6s;
  -webkit-animation-iteration-count: infinite;
  -webkit-animation-direction: alternate;
  -ms-animation-name: exemple3;
  -ms-animation-duration: 6s;
  -ms-animation-iteration-count: infinite;
  -ms-animation-direction: alternate;
  animation-name: exemple3;
  animation-duration: 6s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

@-webkit-keyframes exemple3 {
  from {background-color: red;}
  to {background-color: blue; margin-top: 500px;}
}
@-ms-keyframes exemple3 {
  from {background-color: red;}
  to {background-color: blue; margin-top: 500px;}
}
@keyframes exemple3 {
  from {background-color: red;}
  to {background-color: blue; margin-top: 500px;}
}
</style>

<div style="
  float: left;
  margin-right: 8px;
  height: 400px;
  width: 100px;
  padding: 0px;
  border-style: solid;
  overflow: hidden;
">
  <div id="carre3" style="color:yellow; font-weight:bold; text-align:center;"><br><br>C'est OK</div>
</div>


La grosse différence qu'il y a par rapport à l'exemple précédent c'est le fait que l'on utilise deux balises <div> pour notre carré. La première sert de conteneur pour le carré. Les deux premières propriétés float et margin-right ne sont là que pour me permettre de placer du texte à droite. Après avoir donné la taille du cadre, padding supprime les marges internes afin que le carré s'ajuste à la balise div. border-style fixe la bordure de div à la valeur par défaut. Enfin, overflow: hidden; masque le carré dès qu'il déborde du conteneur.

Cette fois encore, les différences par rapport à l'exemple précédent sont mineures. La première différence, top: -100px;, place le point dé départ de l'animation en dehors du conteneur. Les 100 pixels correspondent à la hauteur du carré. La deuxième différence, c'est le sens de déplacement. Cette fois on joue sur la propriété margin-top qui permet un déplacement vertical. Les 500 pixels correspondent aux 400 piwels du div conteneur plus les 100 pixels du point de départ.

Il existe une propriété dont je n'ai pas parlé mais qui a son importance. Il s'agit de animation-timing-function. Elle s'utilise avec les préfixes vendeurs. C'est elle qui gère le comportement de l'animation, du moins qui règle la vitesse d'exécution de l'animation. Si l'on n'utilise pas cette propriété, c'est ease qui est utilisé comme argument par défaut. les valeurs directement reconnues sont: Nous avons vu notre carré fixe, en déplacement horizontal puis vertical. On va le voir une quatrième et dernière fois sur cette page. Cette fois, nous allons le déplacer en diagonale.



C'est OK

Comme d'habitude, on ne va pas changer grand chose afin de ne pas trop se prendre la tête. Pour cet exemple, j'ai fait essentiellement du copier-coller. Le gros du code est celui du déplacement horizontal. J'ai pris le fond sur la page formulaires et l'ombre vient de la page Restons à l'ombre.



<style>
#carre4 {
  position: relative;
  width: 100px;
  height: 100px;
  background-color: red;
  -webkit-animation-name: exemple4;
  -webkit-animation-duration: 4s;
  -webkit-animation-iteration-count: infinite;
  -webkit-animation-direction: alternate;
  -ms-animation-name: exemple4;
  -ms-animation-duration: 4s;
  -ms-animation-iteration-count: infinite;
  -ms-animation-direction: alternate;
  animation-name: exemple4;
  animation-duration: 4s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

@-webkit-keyframes exemple4 {
  from {background-color: red;}
  to {background-color: blue; margin-left: 400px; margin-top: 200px;}
}
@-ms-keyframes exemple4 {
  from {background-color: red;}
  to {background-color: blue; margin-left: 400px; margin-top: 200px;}
}
@keyframes exemple4 {
  from {background-color: red;}
  to {background-color: blue; margin-left: 400px; margin-top: 200px;}
}
</style>

<div style="
  background: linear-gradient(135deg, lawngreen, gray 60%);
  width: 500px;
  height: 300px;
  float:left;
  margin-right: 12px;
  border-style: solid;
  border-width: 1px;
  box-shadow: 6px 6px 10px #000000;">
  <div id="carre4" style="color:yellow; font-weight:bold; text-align:center;"><br><br>C'est OK</div>
</div>


Dans la première partie du style, carre2 devient carre4 et exemple2 devient exemple4. On ne peut pas mettre deux fois le même nom d'id dans une page, le navigateur se mélangerait les pinceaux. Dans la partie @keyframes, j'ai juste rajouté le déplacement vertical. Le carré va donc se déplacer de 400 pixels horizontalement et de 200 pixels verticalement. Enfin, les dimensions de la balise div font 500 et 300 pixels afin que le carré n'en sorte pas.