Faire son site 10 : Trucs et astuces 12 - Synchronisation
Menu trucs et astuces

Ça peut paraître bête à dire mais lorsque l'on veut faire une animation, il est bon de savoir exactement ce que l'on veut faire. Il faut déterminer le nombre d'éléments qui vont composer l'animation et quels sont ceux qui vont subir une transformation.

Dans notre exemple, nous avons six éléments :



La photo de l'hélico a été prise de ma fenêtre de cuisine le 14 juillet après le défilé. De tels passages font sortir les appareils photos.


<style>
.ciel {
  position: relative;
  background-color: #1e90ff;
  width: 640px;
  height: 480px;
  overflow: hidden;

  animation-name: ciel;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#mont1 {
  position: absolute;
  left: 0px;
  top: 0px;
  width: 600px;
  height: 400px;
  background-color: forestgreen;
  transform: skewx(10deg) rotate(45deg);
  margin-top: 633px;

  animation-name: mont1;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#mont2 {
  position: absolute;
  left: 0px;
  top: 0px;
  width: 240px;
  height: 240px;
  background-color: forestgreen;
  transform: rotate(45deg);
  margin-left: 240px;
  margin-top: 529px;

  animation-name: mont2;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#mont3 {
  position: absolute;
  left: 0px;
  top: 0px;
  height: 0px;
  width: 0px;
  border-right: 140px solid transparent;
  border-bottom: 360px solid forestgreen;
  border-left: 160px solid transparent;
  margin-left: 400px;
  margin-top: 480px;

  animation-name: mont3;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#soleil {
  position: absolute;
  left: 0px;
  top: 0px;
  width: 125px;
  height: 125px;
  border-radius: 50%;
  background: radial-gradient(orange, yellow);
  margin-left: 220px;
  margin-top: 480px;

  animation-name: soleil;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}
#helico {
  position: absolute;
  margin-left: -140px;
  margin-top: 480px;
  background-image: url(helico.gif);
  width: 140px;
  height: 50px;

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

@keyframes mont1 {
  from { margin-top: 633px; }
   15% { margin-top: 350px; }
    to { margin-top: 350px; }
}

@keyframes mont3 {
  from { margin-top: 480px; }
    5% { margin-top: 480px; }
   15% { margin-top: 145px; }
    to { margin-top: 145px; }
}

@keyframes mont2 {
  from { margin-top: 529px; }
   10% { margin-top: 529px; }
   15% { margin-top: 280px; }
    to { margin-top: 280px; }
}

@keyframes soleil {
  from { margin-top: 480px; }
   10% { margin-top: 480px; }
   25% { margin-top: 100px; }
    to { margin-top: 100px; }
}

@keyframes ciel {
  from { background-color: #191970; }
   10% { background-color: #191970; }
   25% { background-color: #1e90ff; }
    to { background-color: #1e90ff; }
}

@keyframes helico {
  from { margin-top: 180px; margin-left: -140px; }
    5% { margin-top: 180px; margin-left: -140px; }
   70% { margin-top: 180px; margin-left: 640px; }
    to { margin-top: 180px; margin-left: 640px; }
}
</style>

<div class="ciel">
  <div id="soleil"></div>
  <div id="mont3"></div>
  <div id="helico"></div>
  <div id="mont1"></div>
  <div id="mont2"></div>
</div>


ciel
soleil
mont3
helico
mont1
mont2

L'ordre dans lequel on pose les éléments est primordial. L'hélico qui passe derrière le soleil n'aurait pas forcément eu le même impact. Ça aurait été dommage car comme l'hélico est ouvert, on voit le soleil à travers lorsqu'il passe devant.

Cet ordre est définit dans le code HTML qui ne sert qu'à ça. Les objets s'empilent les uns sur les autres au fur et à mesure qu'ils sont déclarés. Le premier déclaré est le plus éloigné du spectateur. Comme on peut le constater, l'hélico passe devant le ciel et le soleil ainsi que devant le pic de droite et il passe derrière les deux pics de gauche.

Maintenant qu'on sait comment placer tous nos éléments, on va les dessiner. C'est là que le CSS entre en jeu. Le code est un peu long car il y a six objets à décrire mais il n'est pas bien compliqué et surtout il est répétitif. Il ne nous reste plus qu'à mettre tout notre petit monde en piste. Nous avons six animations qui fonctionnent en même temps mais qui ne commencent pas forcément au même moment et qui ne durent pas le même temps. Pour l'exemple, j'ai tout englobé dans une durée de 20 secondes dont les 6 dernières servent d'intervale entre chaque exécution. Une bonne base pour arriver à synchroniser nos animations est de faire un petit tableau qui va nous permettre de nous repérer facilement.

Duréemont1mont3mont2soleilcielhelico
0% ~ 5%
5% ~ 10%
10% ~ 15%
15% ~ 20%
20% ~ 25%
25% ~ 30%
30% ~ 35%
35% ~ 40%
40% ~ 45%
45% ~ 50%
50% ~ 55%
55% ~ 60%
60% ~ 65%
65% ~ 70%
70% ~ 100%Rrrr...!

Ce système a le mérite de nous permettre de visualiser la cohérence de ce que nous écrivons. Si par exemple le ciel avait continué à s'éclaircir après ue le soleil soit arrivé à destination, il aurait fallu corriger la règle @keyframes ciel. Sur la page Mongolfière, tout ceci a moins d'importance car il n'y a qu'un objet qui bouge. Vous trouverez un autre exemple d'animation sur laquelle la synchronisation des objets est essentielle sur la page de la règle @keyframes.