Les transformations 3D en CSS3 permettent de manipuler les éléments d'une page dans un véritable espace à trois dimensions, directement dans le navigateur, sans plugin ni image. Avec une poignée de propriétés (perspective, transform, transform-style) vous faites pivoter, reculer ou retourner un élément comme s'il flottait devant l'écran. Ce guide pose les bases, puis construit une carte qui se retourne entièrement en CSS.
Le principe
En 2D, une page web vit sur un plan plat décrit par deux axes : l'axe X (horizontal, vers la droite) et l'axe Y (vertical, vers le bas). Les transformations 3D ajoutent un troisième axe, l'axe Z, qui sort de l'écran vers vous. Un élément peut donc s'avancer vers l'utilisateur, reculer dans la profondeur, ou tourner autour de n'importe lequel de ces trois axes.
Tout passe par la propriété transform, déjà utilisée pour les transformations 2D, à laquelle on ajoute des fonctions dédiées à la 3D. Ces fonctions ne modifient ni le flux du document ni la place réservée à l'élément : visuellement il bouge, mais sa boîte d'origine reste comptée dans la mise en page.
.boite {
/* déplacement simple sur l'axe Z, vers l'utilisateur */
transform: translateZ(50px);
}
Une transformation 3D seule, sans perspective, ne produit souvent aucun effet visible (un objet qui s'avance vers vous garde la même taille apparente). C'est la perspective, vue juste après, qui donne la sensation de profondeur.
La perspective
La perspective définit la distance entre l'observateur et le plan de l'écran. Plus la valeur est faible, plus la déformation 3D est marquée (effet grand-angle, déformation forte). Plus elle est grande, plus l'effet est doux et réaliste. On l'applique de préférence sur l'élément parent, avec la propriété perspective, pour que tous les enfants partagent le même point de vue.
.scene {
perspective: 800px; /* point de vue commun aux enfants */
perspective-origin: 50% 50%; /* position du point de fuite */
}
La propriété perspective-origin déplace le point de fuite : par défaut au centre, vous pouvez le placer en haut à gauche, à droite, etc., ce qui change l'angle sous lequel on regarde la scène. Il existe aussi la fonction perspective() à l'intérieur de transform, qui applique la perspective à un seul élément plutôt qu'à un groupe.
perspective: 800pxsur le parent : tous les enfants partagent un point de vue cohérent, idéal pour une scène.transform: perspective(800px) rotateY(40deg): perspective propre à un élément isolé.- Valeurs typiques : entre
500px(effet prononcé) et1500px(effet subtil).
Les rotations 3D
Trois fonctions font tourner un élément autour de chacun des axes. rotateX bascule l'élément vers l'avant ou l'arrière (comme une trappe), rotateY le fait pivoter sur lui-même de gauche à droite (comme une porte), et rotateZ le tourne dans le plan de l'écran (équivalent du rotate classique en 2D).
.carte:hover {
transform: rotateX(25deg); /* bascule vers l'arrière */
}
.porte:hover {
transform: rotateY(45deg); /* pivote comme une porte */
}
.label {
transform: rotateZ(15deg); /* rotation dans le plan */
}
La fonction rotate3d combine les trois axes en un seul appel : ses trois premiers arguments donnent le vecteur de rotation (les axes concernés), le quatrième l'angle. C'est utile pour des rotations obliques difficiles à exprimer autrement.
/* rotation de 60deg autour d'un axe diagonal X+Y */
.objet {
transform: rotate3d(1, 1, 0, 60deg);
}
Pensez à associer ces rotations à une transition (transition: transform .4s;) pour obtenir un mouvement fluide plutôt qu'un saut brutal. Combinez aussi ces effets avec les ombres box-shadow pour renforcer l'impression de relief.
Déplacements et échelle en 3D
Les déplacements 3D se font avec translate3d(x, y, z), qui combine en une seule fonction les trois directions. La composante Z est la plus intéressante : translateZ() rapproche ou éloigne l'élément de l'observateur. Couplée à une perspective, elle agrandit visuellement l'élément qui s'avance et rétrécit celui qui recule.
.scene { perspective: 1000px; }
.avant { transform: translate3d(0, 0, 200px); } /* paraît plus grand */
.arriere { transform: translateZ(-300px); } /* paraît plus loin */
Pour l'échelle, scale3d(sx, sy, sz) redimensionne sur les trois axes. En pratique sz n'a d'effet visible que lorsque l'élément contient lui-même des enfants positionnés en profondeur. Pour la plupart des cas, on combine simplement translateZ et les rotations.
translate3d(x, y, z): déplacement combiné, performant car traité par le GPU.translateZ(z): profondeur seule, l'effet de taille dépend de la perspective.scale3d(sx, sy, sz): mise à l'échelle sur les trois axes.
Plusieurs fonctions peuvent se cumuler dans une même déclaration transform, séparées par des espaces. L'ordre compte : une rotation suivie d'une translation ne donne pas le même résultat que l'inverse, car chaque opération s'applique dans le repère déjà transformé.
.combo {
transform: rotateY(30deg) translateZ(120px);
}
Un exemple concret : la carte qui se retourne
La flip card est l'exemple emblématique de la 3D en CSS. Elle s'appuie sur deux propriétés clés. transform-style: preserve-3d indique au conteneur de garder ses enfants dans le même espace 3D au lieu de les aplatir. backface-visibility: hidden masque la face arrière d'un élément quand elle est tournée vers l'observateur, ce qui évite de voir le verso à l'envers.
Le principe : un conteneur avec perspective, à l'intérieur un élément pivotant qui contient deux faces superposées. La face arrière est pré-tournée de 180 degrés. Au survol, on fait pivoter l'ensemble de 180 degrés, ce qui révèle le verso.
.flip-scene {
perspective: 1000px;
width: 280px;
height: 360px;
}
.flip-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.6s;
transform-style: preserve-3d; /* garde les faces en 3D */
}
.flip-scene:hover .flip-inner {
transform: rotateY(180deg); /* retourne la carte */
}
.flip-face {
position: absolute;
inset: 0;
border-radius: 12px;
backface-visibility: hidden; /* cache la face tournée vers l'arrière */
display: flex;
align-items: center;
justify-content: center;
}
.flip-recto {
background: #2d5bff;
color: #fff;
}
.flip-verso {
background: #1b1f29;
color: #fff;
transform: rotateY(180deg); /* verso déjà retourné */
}
Côté HTML, la structure reste simple : un conteneur de scène, un élément pivotant, et deux faces.
<div class="flip-scene">
<div class="flip-inner">
<div class="flip-face flip-recto">Recto</div>
<div class="flip-face flip-verso">Verso</div>
</div>
</div>
Pour rendre la carte accessible au clavier et au tactile, déclenchez aussi le retournement sur le focus (.flip-scene:focus-within .flip-inner) en plus du survol. Un fond en dégradé CSS3 sur chaque face rend le rendu plus vivant.
Performance et accélération GPU
Les transformations 3D sont parmi les animations les plus performantes du web car elles sont déléguées au GPU (la carte graphique). Les propriétés transform et opacity ne déclenchent ni recalcul de mise en page (reflow) ni repeinture coûteuse : le navigateur compose les couches déjà rendues. Animer une position avec top ou left, à l'inverse, force un recalcul à chaque image et provoque des saccades.
La propriété will-change permet de prévenir le navigateur qu'un élément va être animé, afin qu'il prépare une couche GPU à l'avance. Elle est puissante mais à utiliser avec parcimonie : appliquée à trop d'éléments, elle consomme de la mémoire et peut dégrader les performances au lieu de les améliorer.
.flip-inner {
will-change: transform; /* uniquement sur l'élément réellement animé */
}
- Privilégiez
transformetopacitypour toute animation fluide. - Évitez d'animer
width,height,topouleft. - Réservez
will-changeaux quelques éléments vraiment animés, puis retirez-le une fois l'animation terminée si elle est ponctuelle.
Dernier point pratique : en 2026, les préfixes -webkit- ne sont plus nécessaires pour les transformations 3D. Les propriétés standard (transform, perspective, transform-style, backface-visibility) sont prises en charge par tous les navigateurs modernes. Vous pouvez donc écrire un CSS propre, sans la double déclaration préfixée qui encombrait les feuilles de style des années 2010.