Transforms 3D CSS
Optional Advanced vient de régler pointeur, caret et chrome natif. Cette dernière session optionnelle est une autre boîte : transforms 3D. Vous donnez à une carte un point de fuite et vous l’inclinez en profondeur. Vous ne refaites pas la leçon 2D translate / scale au survol, et vous ne choisissez ni curseur ni poignée de resize.
Réponse directe
Les transforms 3D CSS utilisent la même propriété transform qu’en 2D, plus la profondeur. Placez perspective sur un parent pour que les enfants partagent un point de fuite (perspective-origin le déplace). rotateX et rotateY inclinent autour des axes horizontal et vertical ; rotateZ est la rotation plate déjà connue. translateZ s’approche ou s’éloigne du spectateur. transform-style: preserve-3d garde les enfants dans une scène au lieu de les aplatir. backface-visibility: hidden masque une face quand elle se détourne — utile pour une carte à deux faces. L’emplacement de mise en page reste, comme en 2D. Angles modestes. Respectez prefers-reduced-motion.
Pourquoi ce n’est ni du mouvement 2D ni du chrome d’UI
La leçon transforms 2D a enseigné le mouvement dans le plan : translate, rotate, scale, skew et transform-origin comme charnière. Cela reste valable. La 3D ajoute une perspective façon caméra et des axes en plus. Le CSS interface était du chrome d’interaction (cursor, resize, caret-color, appearance). Une carte tournée n’a pas besoin d’une main menteuse, et la poignée d’un textarea n’est pas un point de fuite. Pour un lift de 2 px, restez en 2D.
Perspective — la caméra sur le parent
perspective est une longueur : plus petite, plus proche et dramatique ; plus grande, plus plate. Mettez-la sur la scène, pas sur chaque face, pour que les frères partagent un point de fuite.
.stage {
perspective: 800px;
perspective-origin: 50% 40%;
}
.card-3d {
transform: rotateY(18deg);
transform-origin: center;
}
Vous pouvez aussi écrire transform: perspective(800px) rotateY(18deg) sur un élément. Cette caméra n’appartient qu’à cette boîte. Pour un cube ou une rangée de tuiles, perspective sur le parent est plus calme. perspective-origin est le cousin point de fuite de transform-origin — il ne remplace pas le pivot de la face qui tourne.
Axes — rotateX, rotateY, rotateZ
Pensez à un livre. rotateY ouvre la couverture gauche–droite. rotateX la penche vers vous ou loin. rotateZ tourne sur la page — le rotate() 2D que vous connaissez.
.tile-y {
transform: rotateY(-22deg);
}
.tile-x {
transform: rotateX(12deg);
}
.tile-z {
transform: rotateZ(8deg);
}
Enchaînez avec des fonctions 2D au besoin : rotateY(16deg) translateZ(24px). L’ordre compte — les suivantes s’exécutent dans l’espace local des précédentes. Une seule liste transform, comme en 2D. Un rotateX(80deg) énorme sur tout un article, c’est une fête foraine, pas une UI.
translateZ — distance, pas une poussée de layout
Avec perspective, un translateZ positif vient souvent vers le spectateur. Les voisins du document ne s’écartent pas ; seule la peinture bouge, comme translate 2D.
.stage {
perspective: 900px;
}
.pop-face {
transform: translateZ(40px) rotateY(-8deg);
}
.back-face {
transform: translateZ(-28px);
}
Servez-vous de translateZ pour séparer les faces d’une scène, pas pour imiter margin ou un z-index ordinaire. z-index range encore les boîtes qui se chevauchent en layout 2D ; la distance 3D est un autre bouton. Si le travail est « soulever un jeton de 2 px », le translateY de la leçon 2D suffit.
preserve-3d — garder une scène, ne pas aplatir
Par défaut, un parent aplatit les enfants transformés (transform-style: flat). La relation 3D disparaît. Pour un cube, une couverture empilée ou une carte à deux faces, mettez preserve-3d sur l’enveloppe qui tourne.
.scene {
perspective: 700px;
}
.rig {
transform-style: preserve-3d;
transition: transform 0.45s ease;
}
.rig.is-flipped {
transform: rotateY(180deg);
}
.face {
position: absolute;
inset: 0;
backface-visibility: hidden;
}
Chaque ancêtre qui doit garder la profondeur a besoin de preserve-3d — un parent flat oublié tamponne le cube en affiche. Courant : perspective sur la scène extérieure, preserve-3d sur l’armature intérieure : caméra dehors, articulations dedans.
backface-visibility — cacher le verso
Quand une face dépasse 90°, vous verriez son miroir. backface-visibility: hidden enlève ce verso. Deux faces : avant rotateY(0), arrière rotateY(180deg), les deux position: absolute sur la même armature.
.card-rig {
position: relative;
transform-style: preserve-3d;
}
.card-front,
.card-back {
position: absolute;
inset: 0;
backface-visibility: hidden;
}
.card-back {
transform: rotateY(180deg);
}
Sans versos cachés, un fantôme de l’avant transparaît. Ce n’est ni user-select: none ni appearance: none. Vous cachez une face peinte en 3D, vous n’ôtez pas la peau d’une case à cocher.
3D vs transform 2D vs chrome d’UI
📊 3D vs 2D transform vs UI chrome
| Tool | Job | Poor fit |
|---|---|---|
perspective + rotateX / rotateY / translateZ |
Scène de profondeur : inclinaison, distance, point de fuite partagé | Survol quotidien de 2 px ; forme du pointeur |
2D translate / rotate / scale / skew |
Mouvement dans le plan ; charnière d’origin | Cube sans preserve-3d |
transform-style / backface-visibility |
Faces 3D imbriquées ; cacher le verso | Couleur du caret ; resize de textarea |
UI (cursor, resize, appearance…) |
Chrome d’interaction sur les contrôles | Points de fuite ; retournement de carte |
Optional Advanced a déjà stylé les contrôles. Effects & Motion a déjà enseigné le mapping 2D. Ici, c’est la couche profondeur sur transform. Un cursor: pointer sur un titre parce qu’il a rotateY ne le rend pas 3D. perspective sur un login ne remplace pas resize sur un champ notes.
Habitudes calmes
Gardez la perspective en centaines de pixels pour les cartes d’UI (600px–1200px est une bande saine). Ne mettez pas perspective: 40px sur body. Couplez :hover ou une classe avec un transition court sur transform — comme en 2D. Coupez le fioriture avec prefers-reduced-motion: reduce (none ou un petit coup 2D). Le focus clavier a toujours besoin d’un anneau visible ; un retournement n’est pas un style de focus.
.preview {
perspective: 1000px;
}
.preview .plate {
transition: transform 0.3s ease;
}
.preview:hover .plate {
transform: rotateY(-10deg) rotateX(4deg);
}
@media (prefers-reduced-motion: reduce) {
.preview .plate,
.preview:hover .plate {
transition: none;
transform: none;
}
}
Ce survol est une inclinaison, pas le lift 2D translateY(-0.15rem) du jeton, ni resize: vertical sur un champ. Si les gens en mouvement réduit veulent une carte fixe, croyez-les.
À essayer vous-même
- Enveloppez une carte dans
.stage { perspective: 800px; }et mettezrotateY(20deg)sur l’enfant — puis déplacezperspectivedans letransformde l’enfant et comparez les tuiles sœurs. - Montez une carte à deux faces :
preserve-3dsur l’armature,backface-visibility: hiddensur les deux, versorotateY(180deg). - Ajoutez
translateZ(32px)sur le plan avant ; vérifiez que les voisins de layout ne bougent pas. - Retournez avec une classe +
transition: transform— puis aplatissez avecprefers-reduced-motion. - Ne résolvez pas ça avec
cursor,resizeou un survol seulement 2DtranslateY.
Erreurs fréquentes
perspective: 50pxsurbodyjusqu’à tordre toute la page- Oublier
preserve-3dsur l’enveloppe puis s’étonner d’un cube plat - Prendre le lift 2D du jeton (
translateY) pour une leçon 3D - Utiliser le chrome d’UI (
cursor,resize,appearance) à la place de la profondeur backface-visibilitysur la scène plutôt que sur les faces- Ignorer
prefers-reduced-motionsur de grands retournementsrotateY - S’attendre à ce que la 3D change le flux du document comme
margin
Résumé
- Les transforms 3D ajoutent de la profondeur à
transform: perspective,rotateX/rotateY,translateZ - perspective sur la scène parente ; preserve-3d pour que les faces imbriquées restent dans cet espace
- backface-visibility: hidden masque une face qui s’est détournée
- Ni leçon de survol 2D ni chrome d’interface
- Angles modestes ; respecter le mouvement réduit
- Dernière session CSS de ce cours — Optional Advanced s’arrête ici ; pas d’autre slug CSS sur la carte
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut