Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Dans le chapitre précédent j'ai présenté le principe d'une zone 3D et j'ai abordé les transformations 3D.
Dans cette page je traite des transformations 3D avec transitions.
Survolez successivement chaque image 5 secondes, le temps de la transition.
Si survol d'une image de la colonne de gauche, celle-ci grandit et bascule complètement, l'image apparait à l'envers.
Si survol d'une image de la colonne du milieu, celle-ci se reduit et pivote vers la droite.
Si survol d'une image de la colonne de droite, celle-ci grandit et pivote complèment, l'image apparait tel son reflet dans un miroir.
Notez bien qu'à chaque image est affecté deux classes : classe "petite" et classe "gauche" ou "centre" ou "droite".
img.petite {display : inline-block ; margin : 1% ; width :30%;
vertical-align : top ; transition : transform 5s; }
img.gauche:hover{transform : translateZ(200px) rotateX(180deg);}
img.centre:hover{transform : translateZ(-200px) rotateZ(45deg); }
img.droite:hover{transform : translateZ(200px) rotateY(180deg);}
La classe "petite" définit la mise en forme avant transformation.
La transformation (avec transition) s'applique qu'en cas de survol de l'image.
Dans ce deuxième exemple j'introduis une nouvelle propriété CSS backface-visibility ...
Survolez 5 secondes chaque carte, le temps de la transition !
Si survol sur une carte de la rangée du haut, celle-ci bascule de 180 degrés (rotationX) et la carte apparait retournée.
Si survol sur une carte de la rangée du bas, celle-ci pivote de 180 degrés (rotationY) et alors la carte apparait inversée
tel son reflet dans un miroir.
Par défaut le point de fuite est le milieu de la zone 3D si la propriété perspective-origine n'est pas renseignée.
Notez qu'à chaque carte est associée deux classes : la classe "petite" et la classe "haut" ou "bas".
img.petite {display : inline-block ; margin : 1% ; width :30%;
vertical-align : top ; transition : transform 5s; }
img.haut:hover{transform : rotateX(180deg);
backface-visibility : visible; }
img.bas:hover{transform : rotateY(180deg);
backface-visibility : visible; }
Emploi de la propriété CSS backface-visibility. La valeur par défaut de cette propriété est "visible".
Il suffit via un script d'appliquer une nouvelle classe à cette collection ; classe qui prévoit une transformation 3D avec transition ;
c'est plus "fun" qu'une tansformation instantanée.
Attention la transformation ne doit pas s'appliquer à toutes les images de la page mais seulement celles qui sont contenues dans
la boite 3D.
img {display : inline-block ; margin : 5% ; width : 20%;
height : 150px ; object-fit: contain; ;
border : 1px solid red; }
.transformer {transform : translateZ(200px) rotateY(180deg);
transition : transform 5s; }
Observez la règle de style qui s'applique aux images ! Toutes les images doivent être affichées dans un emplacement de 18% par 150px
avec une bordure rouge.
Or elles n'ont pas toutes le même ratio largeur/hauteur. Il faut donc utiliser la propriété object-fit pour qu'il n'y ait
pas de déformation de l'image. Si la valeur de cette propriété vaut "contain" il n'y aura pas rognage mais toute la largeur ne sera
pas forcément occupée.
La boite définie par la balise ARTICLE est une zone 3D : avec une perspective et un point de fuite.
document.querySelector("button").onclick = function()
{
let transformables = document.querySelectorAll("article img");
for (let i in transformables)
{
transformables[i].classList.toggle("transformer");
}
} // fin fonction
Notez la classe "transformer" qui prévoit une transformation 3D avec transition.
Cette classe est appliquée à toutes les images de la zone 3D via le script.
"transformables" est un tableau indicé qui ne référence que les objet IMG contenu dans le conteneur ARTICLE.
Notez bien que les images ont toutes la même hauteur mais pas la même largeur (bandes blanches entre image et bordure plus ou moins larges).
Elles ne sont pas rognées ; ce qui aurait êté le cas éventuellement avec object-fit : cover
Survole ma photo et tu me verras nue !
Vieux cochon !
Un exemple coquin pour un problème très sérieux. Si survol de la photo initiale, une nouvelle photo apparait.
L'élément .zone3d sert d'environnement 3D. pour l'objet div class ="carte" qui contient à son tour deux éléments :
les DIV classés "recto" et "verso".
Ces deux enfants de "carte" ont pour "background" une image.
background-size : cover : l'image de fond occupe toute la boite sans déformation de l'image mais au prix d'un éventuel rognage.
.zone3d {width: 300px; height: 400px; perspective: 1000px;}
.carte {position: relative; width: 100%;
height :100%; transition: transform 2s;
transform-style: preserve-3d;}
.zone3d:hover .carte{transform: rotateY(180deg);}
.recto, .verso {position: absolute; width: 100%; height: 100%;
backface-visibility: hidden;}
.verso {transform: rotateY(180deg);}
Notez l'emploi de la propriété transform-style avec la valeur "preserve-3d" dans la règle de style concernant l'élément "carte". Ainsi les "enfants" de l'élément "carte" sont aussi positionnés en 3D.
Grâce à position : absolute les éléments "recto" et "verso" se superposent parfaitement telles les deux faces de la même carte.