Accueil    Codes    CSS3 cube
 



CSS3 cube  CSS3 tourniquet d'images


  • Compatibilité avec les navigateurs :
  • Google Chrome 20.0 et plus
  • Firefox 14.0.1 et plus
  • IE 9 et plus
  • Opera 12 et plus
  • Safari 5.1.7 et plus



Introduction



Voici une application des styles css3 pour la mise en place d'un tourniquet affichant des images. Cet exemple permet de stopper et reprendre l'animation au survol des images.




Mise en place



La partie html se compose d'un conteneur global sur lequel on définit la perspective, d'un conteneur parent sur lequel est appliquer l'animation globale, et enfin les huit différentes <div> affichant les images et positionnées spécifiquement par une transformation CSS.

Le code html est le suivant :

<div id="conteneur">
   <div class="parent" onmouseover="PauseAnim();" onmouseout="LectureAnim();">
      <div class="diapositive diapo1"></div>
      <div class="diapositive diapo2"></div>
      <div class="diapositive diapo3"></div>
      <div class="diapositive diapo4"></div>
      <div class="diapositive diapo5"></div>
      <div class="diapositive diapo6"></div>
      <div class="diapositive diapo7"></div>
      <div class="diapositive diapo8"></div>
   </div>
</div>

Au niveau de la parie CSS, le containeur global est l'endroit adéquat dans lequel définir la notion de perspective pour des transformations 3D. Elle est initialisée avec les styles CSS perspective et perspective-origin.

#conteneur{
   width:550px;
   height:300px;
   border:solid 1px black;
   position:absolute;
   perspective:800px;
   perspective-origin:10% 50%;
   -webkit-perspective:600px;
   -webkit-perspective-origin:10% 50%;
   -moz-perspective:800px;
   -moz-perspective-origin:10% 50%;
   -o-perspective:800px;
   -o-perspective-origin:10% 50%;
}

Une fois la perspective déterminée, on peut définir le style des diapositives sur lesquelles sont appliquées les rotations autour de l'axe Y. Dans notre exemple, chaque diapositive subie une rotation de 45 degrés de plus que la précédente. La transformation a comme origine sur l'axe Y la valeur 0, c'est à dire que le centre de la rotation se situe au niveau du bord gauche des éléments <div> (alors que par défaut l'origine de la transformation est valorisée à 50%, c'est à dire au centre de l'élément).

Remarque : pour la transformation -moz-transform (Firefox), on ajoute une très faible translation sur l'axe Z. La gestion de la propriété z-index étant mal gérée par Firefox pour les rotations 3D (la propriété transform-style:preserve-3D devant permettre cette gestion), le positionnement distinct des éléments sur l'axe Z corrige ce mauvais comportement.

.diapositive{
   position:absolute;
   height:150px;
   width:180px;
   opacity:0.9;
   border:solid 1px black;
   border-radius:8px;
   top:75px;
   left:250px;
   background-size:cover;

   transform-origin:0% 50%;
   -webkit-transform-origin:0% 50%;
   -moz-transform-origin:0% 50%;
   -o-transform-origin:0% 50%;
}

.diapo1{
   transform:rotateY(0deg);
   -webkit-transform:rotateY(0deg);
   -moz-transform:rotateY(0deg) translateZ(1px);
   -o-transform:rotateY(0deg);
   background-image:url(fond5.jpg);
}
.diapo2{
   transform:rotateY(45deg);
   -webkit-transform:rotateY(45deg);
   -moz-transform:rotateY(45deg) translateZ(2px);
   -o-transform:rotateY(45deg);
   background-image:url(fond1.jpg);
}
...

Finalement, on déclare pour l'élément <div> parent l'animation qui sera appliquée : une rotation continue sur l'axe Y. On applique également le style CSS transform-style:preserve:3d pour préserver les éléments enfants dans un espace en 3 dimensions.

#parent{
   position:absolute;
   animation:tourne 8s linear infinite;
   transform-origin:250px 50%;
   transform-style: preserve-3d;
   -webkit-animation:tourne 8s linear infinite;
   -webkit-transform-origin:250px 50%;
   -webkit-transform-style: preserve-3d;
   -moz-animation:tourne 8s linear infinite;
   -moz-transform-origin:250px 50%;
   -moz-transform-style: preserve-3d;
   -o-animation:tourne 8s linear infinite;
   -o-transform-origin:250px 50%;
   -o-transform-style: preserve-3d;
}

Un code javascript a également été ajouté pour arrêter et reprendre l'animation sur les évènements onmouseover et onmouseout de l'élément parent.

function PauseAnim() {
   document.getElementById('parent').style.animationPlayState='paused';
   document.getElementById('parent').style.MozAnimationPlayState='paused';
   document.getElementById('parent').style.WebkitAnimationPlayState='paused';
   document.getElementById('parent').style.OAnimationPlayState='paused';
}

function LectureAnim() {
   document.getElementById('parent').style.animationPlayState='running';
   document.getElementById('parent').style.MozAnimationPlayState='running';
   document.getElementById('parent').style.WebkitAnimationPlayState='running';
   document.getElementById('parent').style.OAnimationPlayState='running';
}