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
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><marquee></b>
</marquee>
</center>
- behavior="scroll/slide/alternate" : Indique comment se déplace la bannière. Je ne vois pas de différence entre les 2 premières valeurs. Alternate permet à la bannière de faire des allers-retours.
- bgcolor="couleur" : Couleur de fond de la bannière. Par défaut le fond est transparent.
- height="valeur" : Hauteur de la bannière en pixels.
- width="valeur" : Largeur de la bannière en pixels.
- direction="left/right/up/down" : Indique le sens de défilement, vers la gauche, la droite, le haut ou vers le bas.
- scrollamount="valeur" : Longueur de chaque déplacement en pixels (plus la valeur est élevée plus la vitesse est grande.
- scrolldelay="valeur" : Temps écoulé entre chaque déplacement en ms.
- loop="valeur" : Indique le nombre de fois que la bannière va défiler. Une valeur négative indique que la bannière ne s'arrête pas.
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.
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:
- ease Accélère au départ, ralentit à la fin
- linear Garde une vitesse constante
- ease-in Accélère au début
- ease-out Ralentit à la fin
- ease-in-out Accélère au début, a une vitesse constante et ralentit à la fin.
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.