Transformer des éléments avec les propriétés translate
, rotate
et scale
Propriété CSS transform
Pour appliquer des transformations à un élément, utilisez la propriété CSS transform
. La propriété accepte une ou plusieurs <transform-function>
qui sont appliquées les unes après les autres.
.target {
transform: translateX(50%) rotate(30deg) scale(1.2);
}
L'élément ciblé est déplacé de 50% sur l'axe X, pivoté de 30 degrés et enfin mis à l'échelle de 120%.
Bien que la propriété transform
fonctionne parfaitement, elle devient un peu fastidieuse lorsque vous souhaitez modifier l'une de ces valeurs individuellement.
Pour modifier l'échelle lorsque vous pointez sur l'élément, vous devez dupliquer toutes les fonctions de la propriété "transform", même si leurs valeurs restent inchangées.
.target:hover {
transform: translateX(50%) rotate(30deg) scale(2); /* Only the value of scale() changed */
}
Les propriétés de transformation individuelles
Les propriétés individuelles pour les transformations CSS sont disponibles avec Chrome 104. Les propriétés sont scale
, rotate
et translate
, que vous pouvez utiliser pour définir individuellement ces parties d'une transformation.
Chrome rejoint ainsi Firefox et Safari, qui sont déjà compatibles avec ces propriétés.
Si vous réécrivez l'exemple transform
précédent avec les propriétés individuelles, votre extrait devient le suivant:
.target {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
De l'importance de l'ordre des modificateurs
Une différence clé entre la propriété CSS transform
d'origine et les nouvelles propriétés est l'ordre dans lequel les transformations déclarées sont appliquées.
Avec transform
, les fonctions de transformation sont appliquées dans l'ordre dans lequel elles sont écrites, de gauche (extérieur) à droite (intérieur).
Avec les propriétés de transformation individuelles, l'ordre n'est pas celui dans lequel elles sont déclarées. L'ordre est toujours le même: d'abord translate
(extérieur), puis rotate
, puis scale
(intérieur).
Cela signifie que les deux extraits de code suivants donnent le même résultat:
.transform--individual {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
.transform--individual-alt {
rotate: 30deg;
translate: 50% 0;
scale: 1.2;
}
Dans les deux cas, les éléments ciblés sont d'abord traduits de 50%
sur l'axe X, puis pivotés de 30deg
et enfin mis à l'échelle de 1.2
.
Si l'une des propriétés de transformation individuelles est déclarée avec une propriété transform
, les transformations individuelles sont appliquées en premier (translate
, rotate
, puis scale
), et transform
en dernier (à l'intérieur). Pour en savoir plus, consultez la spécification qui définit la méthode de calcul de la matrice de transformation.
Animations
La principale raison de l'ajout de ces propriétés est de faciliter les animations. Supposons que vous souhaitiez animer un élément comme suit:
transform
utilisé(s)
Pour implémenter cette animation à l'aide de transform
, vous devez calculer toutes les valeurs intermédiaires pour toutes les transformations définies, et les inclure dans chaque image clé. Par exemple, pour effectuer une rotation à 10 %, les valeurs des autres transformations doivent également être calculées, car la propriété transform
en a besoin.
Le code CSS obtenu se présente comme suit:
@keyframes anim {
0% { transform: translateX(0%); }
5% { transform: translateX(5%) rotate(90deg) scale(1.2); }
10% { transform: translateX(10%) rotate(180deg) scale(1.2); }
90% { transform: translateX(90%) rotate(180deg) scale(1.2); }
95% { transform: translateX(95%) rotate(270deg) scale(1.2); }
100% { transform: translateX(100%) rotate(360deg); }
}
.target {
animation: anim 2s;
animation-fill-mode: forwards;
}
Utiliser des propriétés de transformation individuelles
Avec des propriétés de transformation individuelles, l'écriture devient beaucoup plus facile. Au lieu de faire glisser toutes les transformations d'une image clé à l'autre, vous pouvez cibler chaque transformation individuellement. Vous n'avez plus besoin de calculer toutes ces valeurs intermédiaires.
@keyframes anim {
0% { translate: 0% 0; }
100% { translate: 100% 0; }
0%, 100% { scale: 1; }
5%, 95% { scale: 1.2; }
0% { rotate: 0deg; }
10%, 90% { rotate: 180deg; }
100% { rotate: 360deg; }
}
.target {
animation: anim 2s;
animation-fill-mode: forwards;
}
Utiliser des propriétés de transformation individuelles et plusieurs clés-images
Pour rendre votre code modulaire, vous pouvez diviser chaque sous-animation en son propre ensemble d'images clés.
@keyframes move {
0% { translate: 0% 0; }
100% { translate: 100% 0; }
}
@keyframes scale {
0%, 100% { scale: 1; }
5%, 95% { scale: 1.2; }
}
@keyframes rotate {
0% { rotate: 0deg; }
10%, 90% { rotate: 180deg; }
100% { rotate: 360deg; }
}
.target {
animation: move 2s, scale 2s, rotate 2s;
animation-fill-mode: forwards;
}
Grâce à cette division, vous pouvez appliquer chaque ensemble de clés-images distinct comme vous le souhaitez, car les propriétés transform
(qui sont désormais des propriétés individuelles) ne s'écrasent plus les unes les autres. Au-delà, vous pouvez attribuer un délai différent à chaque transformation sans avoir à tout réécrire.
Performances
Les animations utilisant ces nouvelles propriétés sont tout aussi efficaces que les animations de la propriété transform
existante.
Les animations de translate
, rotate
et scale
s'exécutent sur le compositeur de la même manière que les animations de transform
. Elles sont donc efficaces pour les performances d'animation, tout comme transform
.
Ces nouvelles propriétés fonctionnent également avec la propriété will-change
. En règle générale, il est préférable d'éviter d'utiliser will-change
de manière excessive en l'appliquant au nombre minimal d'éléments nécessaire et pendant une durée aussi courte que possible. Toutefois, il est également recommandé d'être aussi précis que possible. Par exemple, si vous utilisez will-change
pour optimiser une animation avec les propriétés rotate
et filter
, vous devez la déclarer à l'aide de will-change: rotate, filter
. Cette approche est légèrement meilleure que l'utilisation de will-change: transform, filter
lorsque vous animez rotate
et filter
, car certaines des structures de données que Chrome crée à l'avance lorsque vous utilisez will-change
sont différentes pour transform
et rotate
.
Partie de la série "Nouveaux interopérabilités"