aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Frontend & UI

CSS Transform : guide des effets 2D et 3D

La propriété css transform permet de déplacer, faire pivoter, mettre à l'échelle et incliner visuellement un élément sans changer la place qu'il occupe. Agrandir légèrement une carte au survol, faire glisser un menu depuis le côté ou retourner un élément en 3D : presque tous ces effets reposent sur cette seule propriété. Et surtout, bien utilisées, ces transformations ne déclenchent pas le recalcul de la mise en page du navigateur, ce qui en fait l'outil de référence pour des animations fluides à 60 fps.

Que fait réellement transform ?

Quand tu appliques transform à un élément, le navigateur déplace son image rendue. Sa boîte d'origine dans le flux du document reste en place : les éléments voisins ne bougent pas, la page ne se réorganise pas. C'est fondamentalement différent d'un repositionnement avec margin ou top, qui forcent un recalcul de la mise en page, alors que transform ne touche qu'à l'étape de composition.

Tu peux enchaîner plusieurs fonctions sur une seule ligne, séparées par des espaces. L'ordre compte, car chaque fonction modifie le système de coordonnées de la suivante :

.carte {
  transform: translateX(20px) rotate(8deg) scale(1.1);
}

translate : le décalage

translate() décale un élément sur les axes horizontal et vertical. Il existe translateX(), translateY() et la forme à deux valeurs translate(x, y). Les valeurs en pourcentage sont relatives à la taille propre de l'élément, ce qui est très pratique pour centrer :

.centre {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

Ici, l'élément est d'abord positionné pour que son coin supérieur gauche soit au centre, puis translate(-50%, -50%) le ramène de la moitié de sa largeur et de sa hauteur pour le centrer parfaitement. Un grand classique toujours très utile.

rotate et scale

rotate() fait pivoter un élément autour de son centre par défaut ; tu donnes la valeur en deg, rad ou turn (1turn = 360 degrés). Les valeurs positives tournent dans le sens horaire.

scale() agrandit ou réduit un élément. scale(1.2) agrandit les deux axes de 20 % ; scale(2, 0.5) double la largeur et divise la hauteur par deux. La valeur 1 correspond à la taille d'origine, 0 fait totalement disparaître l'élément.

.bouton {
  transition: transform 0.2s ease;
}
.bouton:hover {
  transform: scale(1.05);
}

Il y a aussi skew(), qui incline l'élément le long des axes. En pratique, on l'utilise moins souvent que translate, rotate et scale, mais il est utile pour des bandes décoratives et des effets façon italique.

transform-origin : l'ancre de la transformation

Toutes ces fonctions opèrent par rapport à un point d'origine. La valeur par défaut est 50% 50%, soit le centre de l'élément. Tu peux la modifier avec transform-origin :

.drapeau {
  transform-origin: left center;
  transform: rotate(15deg);
}

Dans cet exemple, l'élément oscille depuis son bord gauche comme un drapeau. Définir transform-origin est indispensable pour faire grandir un menu déroulant depuis un coin ou faire pivoter une aiguille autour de sa base.

Transformations 3D et perspective

Cela devient intéressant dès qu'on ajoute un troisième axe. rotateX(), rotateY(), rotateZ() et translateZ() déplacent l'élément dans la profondeur. Mais pour que la 3D paraisse vraiment « profonde », il faut définir une perspective ; sinon la transformation semble plate.

perspective se déclare de deux façons : comme propriété CSS sur l'élément parent qui contient les éléments 3D, ou comme fonction à l'intérieur de transform. La placer sur le parent est préférable pour que les éléments frères partagent la même scène :

.scene {
  perspective: 800px;
}
.scene:hover .face {
  transform: rotateY(180deg);
}

C'est exactement l'effet « flip card » qui révèle le dos d'une carte au survol. Ajouter transform-style: preserve-3d au conteneur maintient les enfants imbriqués dans l'espace 3D au lieu de les aplatir. Et backface-visibility: hidden masque l'arrière d'une surface, gardant les effets de retournement nets.

Performance : pourquoi privilégier transform ?

Pour dessiner une image, le navigateur passe par plusieurs étapes : layout (calcul de la géométrie), paint (remplissage des pixels), composite (combinaison des couches). Animer width, top ou margin redéclenche le layout à chaque image, ce qui est coûteux et provoque des saccades. À l'inverse, animer transform et opacity ne s'exécute qu'à l'étape de composition et peut généralement être délégué au GPU.

  • Pour les animations de position, utilise translate au lieu de left/top.
  • Pour les animations de taille, utilise scale au lieu de width/height.
  • Ajoute will-change: transform pour prévenir le navigateur qu'une nouvelle couche arrive — mais seulement sur un nombre limité d'éléments réellement animés ; en abuser gonfle la mémoire.

Pour l'accessibilité, pense aux utilisateurs sensibles aux troubles vestibulaires et atténue ou désactive les grands mouvements dans @media (prefers-reduced-motion: reduce).

Questions fréquentes

Pourquoi animer transform est-il plus fluide que left/top ?

Parce que transform saute l'étape de layout et souvent celle de paint du navigateur, en travaillant directement sur la couche de composition où le GPU peut l'accélérer. left/top, lui, recalcule la mise en page à chaque image, ce qui entraîne un faible fps.

L'ordre de plusieurs fonctions transform est-il important ?

Oui. Les fonctions sont appliquées de gauche à droite, et chacune modifie le système de coordonnées. rotate puis translate donne un résultat différent de translate puis rotate ; teste l'ordre jusqu'à obtenir l'effet souhaité.

Que faut-il pour que translateZ soit visible ?

Une valeur de perspective. Sans perspective définie, le mouvement sur l'axe Z se projette à plat sur l'écran et aucune profondeur n'apparaît. Place la perspective sur le conteneur parent et appuie-la avec transform-style: preserve-3d.

Tu veux une interface fluide et performante ? Je mets en place CSS transform et les techniques d'animation modernes correctement dans ton projet. Contacte-moi pour travailler ensemble.

Bu kategorideki tüm yazılar →

Devamı için