Präzisere Steuerung von CSS-Transformationen mit individuellen Transformationseigenschaften

Elemente mit den Attributen translate, rotate und scale transformieren

Die CSS-Eigenschaft transform

Um Transformationen auf ein Element anzuwenden, verwenden Sie die CSS-transform-Eigenschaft. Die Property akzeptiert eine oder mehrere <transform-function>-Werte, die nacheinander angewendet werden.

.target {
  transform: translateX(50%) rotate(30deg) scale(1.2);
}

Das Zielelement wird um 50% auf der X-Achse verschoben, um 30 Grad gedreht und schließlich auf 120 % skaliert.

Die transform-Eigenschaft funktioniert zwar problemlos, es wird jedoch etwas mühsam, wenn Sie einen dieser Werte einzeln ändern möchten.

Wenn Sie die Skalierung beim Bewegen des Mauszeigers ändern möchten, müssen Sie alle Funktionen in der Transformationseigenschaft duplizieren, auch wenn ihre Werte unverändert bleiben.

.target:hover {
  transform: translateX(50%) rotate(30deg) scale(2); /* Only the value of scale() changed */
}

Die einzelnen Transformationsattribute

Der Versand mit Chrome 104 ist einzelne Eigenschaften für CSS-Transformationen. Die Attribute sind scale, rotate und translate, mit denen Sie diese Teile einer Transformation individuell definieren können.

So wird Chrome in Firefox und Safari integriert, da diese Eigenschaften bereits unterstützt werden.

Unterstützte Browser

  • 104
  • 104
  • 72
  • 14.1

Quelle

Wenn Sie das vorherige transform-Beispiel mit den einzelnen Attributen umformulieren, sieht Ihr Snippet so aus:

.target {
  translate: 50% 0;
  rotate: 30deg;
  scale: 1.2;
}

Rechtsangelegenheiten bestellen

Ein wesentlicher Unterschied zwischen der ursprünglichen CSS-Eigenschaft transform und den neuen Attributen ist die Reihenfolge, in der die deklarierten Transformationen angewendet werden.

Bei transform werden die Transformationsfunktionen in der Reihenfolge angewendet, in der sie geschrieben sind – von links (außerhalb) nach rechts (innen).

Bei den einzelnen Transformationsattributen entspricht die Reihenfolge nicht der Reihenfolge, in der sie deklariert werden. Die Reihenfolge ist immer gleich: zuerst translate (außerhalb), dann rotate und dann scale (innen).

Das bedeutet, dass die beiden folgenden Code-Snippets dasselbe Ergebnis liefern:

.transform--individual {
  translate: 50% 0;
  rotate: 30deg;
  scale: 1.2;
}

.transform--individual-alt {
  rotate: 30deg;
  translate: 50% 0;
  scale: 1.2;
}

In beiden Fällen werden die Zielelemente zuerst von 50% auf der X-Achse verschoben, dann um 30deg gedreht und schließlich um 1.2 skaliert.

Wenn eines der einzelnen Transformationsattribute zusammen mit einem transform-Attribut deklariert wird, werden zuerst die einzelnen Transformationen angewendet (translate, rotate und dann scale) und zuletzt das transform (innerhalb). Weitere Details finden Sie in der Spezifikation, die definiert, wie die Transformationsmatrix berechnet werden soll.

Animationen

Diese Eigenschaften wurden vor allem hinzugefügt, um Animationen zu vereinfachen. Angenommen, Sie möchten ein Element wie folgt animieren:

Keyframes-Diagramm.

transform verwenden

Um diese Animation mit transform zu implementieren, müssten Sie für alle definierten Transformationen alle dazwischenliegenden Werte berechnen und diese in jeden Keyframe einfügen. Um beispielsweise eine Rotation bei der 10-%-Marke durchzuführen, müssen auch die Werte für die anderen Transformationen berechnet werden, da das Attribut transform alle benötigt.

Keyframe-Diagramm mit berechneten Zwischenwerten

Der resultierende CSS-Code sieht so aus:

@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;
}

Einzelne Transformationsattribute verwenden

Mit einzelnen Transformationsattributen wird das Schreiben viel einfacher. Anstatt alle Transformationen von Keyframe zu Keyframe zu ziehen, können Sie jede Transformation einzeln ausrichten. Sie müssen auch nicht mehr alle dazwischenliegenden Werte berechnen.

@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;
}

Einzelne Transformationseigenschaften und mehrere Keyframes verwenden

Um Ihren Code modular zu gestalten, können Sie jede Subanimation in einen eigenen Satz von Keyframes aufteilen.

@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;
}

Durch diese Aufteilung können Sie die einzelnen Keyframes nach Belieben anwenden, weil sich die transform-Eigenschaften, die jetzt zu individuellen Eigenschaften wurden, nicht mehr überschreiben. Darüber hinaus können Sie für jede Transformation einen anderen Zeitpunkt festlegen, ohne alles neu schreiben zu müssen.

Leistung

Animationen mit diesen neuen Eigenschaften sind genauso effizient wie Animationen der vorhandenen transform-Eigenschaft.

Animationen von translate, rotate und scale werden im Compositor auf die gleiche Weise ausgeführt wie Animationen von transform. Sie eignen sich also genau wie transform für die Animationsleistung.

Diese neuen Properties funktionieren auch mit der Property will-change. Im Allgemeinen ist es empfehlenswert, will-change nicht zu sehr zu verwenden, indem Sie es für eine Mindestanzahl von Elementen und für einen möglichst kurzen Zeitraum einsetzen. Aber es ist auch gut, so konkret wie möglich zu sein. Wenn Sie beispielsweise will-change verwenden, um eine Animation mit den Attributen rotate und filter zu optimieren, sollten Sie dies mit will-change: rotate, filter deklarieren. In dem Fall, dass Sie rotate und filter animieren, ist dies etwas besser als die Verwendung von will-change: transform, filter, da einige Datenstrukturen, die Chrome im Voraus erstellt, wenn Sie will-change verwenden, für transform und rotate unterschiedlich sind.

Teil der Videoreihe „Neu interoperable“