Der WebKit-Blog beschreibt, wie man individuelle CSS-Transformations-Eigenschaften in der neuesten Version von Safari Technology Preview verwendet. Dies bringt den Browser in Einklang mit der CSS Transforms Module Level 2-Spezifikation, die die Funktionen translate(), rotate() und scale() aus der transform-Eigenschaft in eigene individuelle Eigenschaften aufteilt: translate, scale und rotate.
Anstatt diese drei Funktionen in der transform-Eigenschaft zu verketten,
.some-element {
transform: translate(50px 50px) rotate(15deg) scale(1.2);
}
…können wir sie einzeln als eigene Eigenschaften schreiben
.some-element {
translate: 50px 50px;
rotate: 15deg;
scale: 1.2;
}
Wenn Sie wie ich sind, springt Ihnen sofort die Frage in den Sinn: „Warum zum Teufel sollten wir MEHR Codezeilen schreiben?“ Ich meine, wir sind es gewohnt, dass einzelne Eigenschaften zu Untereigenschaften einer Kurzschreibweise werden, nicht umgekehrt, wie wir es bei background, border, font, margin, padding, place-items und so weiter gesehen haben.
Aber das WebKit-Team nennt einige gute Gründe, warum wir das tun wollen
- Es ist einfacher, eine einzelne Eigenschaft zu schreiben, wenn nur eine Funktion benötigt wird, wie z. B.
scale: 2;anstelle vontransform: scale(2);. - Es gibt deutlich weniger Sorge, versehentlich andere
transform-Eigenschaften zu überschreiben, wenn sie verkettet sind. - Es ist verdammt viel einfacher, eine Keyframe-Animation für eine einzelne Eigenschaft zu ändern, anstatt Zwischenwerte „vorab zu berechnen“ und „neu zu berechnen“, wenn sie mit
transformverkettet sind. - Wir erhalten eine feinere Kontrolle über das Timing und die Keyframes einzelner Eigenschaften.
Der Beitrag weist auch auf einige hilfreiche Tipps hin. So werden die neuen individuellen Transformations-Eigenschaften zuerst angewendet – translate, rotate und scale, in dieser Reihenfolge – bevor die Funktionen in der transform-Eigenschaft angewendet werden.
Oh, und wir dürfen die Browserunterstützung nicht übersehen! Sie ist zum Zeitpunkt der Erstellung extrem begrenzt… im Grunde nur auf Safari Technology Preview 117 und Firefox 72 und höher für mickrige 3,9 % globale Unterstützung
Der Beitrag schlägt vor, @supports zu verwenden, wenn Sie die Eigenschaften nutzen möchten
@supports (translate: 0) {
/* Individual transform properties are supported */
div {
translate: 100px 100px;
}
}
@supports not (translate: 0) {
/* Individual transform properties are NOT supported */
div {
transform: translate(100px, 100px);
}
}
Das ist das Codebeispiel, das direkt aus dem Beitrag übernommen wurde. Die Modifizierung dieses Beispiels kann uns helfen, die not-Operator zu vermeiden. Ich bin mir nicht sicher, ob das eine Verbesserung des Codes ist oder nicht, aber es fühlt sich eher wie progressive Enhancement an, etwas wie dieses zu tun
div {
transform: translate(100px, 100px);
}
@supports (translate: 0) {
/* Individual transform properties are supported */
div {
transform: none;
translate: 100px 100px;
}
}
Auf diese Weise bereinigen wir die Kurzschreibweisen und machen Platz für die individuellen Eigenschaften, aber nur, wenn sie unterstützt werden.
Die separaten Eigenschaften sind großartig, sie werden wahrscheinlich weniger Code produzieren, nicht mehr (denken Sie an Überschreibungen, die alles, was sie nicht überschreiben, reproduzieren mussten) und helfen, Code modularer zu machen. Warum sie noch eine Syntax brauchten, ist mir schleierhaft. Was wir ohne Doppelpunkte gewinnen, verlieren wir an kognitivem Aufwand.
Mein Königreich für eine Vereinheitlichung der CSS-Syntax. Listen sollten entweder durch Kommas getrennt sein oder nicht. Schrägstriche sind kein Listenpunktbegrenzer. Eigenschaften beginnen mit einem Namen und werden mit dem Wert nach einem Doppelpunkt definiert. Funktionen sind Funktionen und haben einen Namen und akzeptieren eine (regelkonform begrenzte) Liste von Parametern. Verschachtelte Strukturen haben geschweifte Klammern. Sobald all das existiert, folgt die Kurz-/Langform einer einfachen Regel: Kurzform ist Zucker für Langform.
Chrome unterstützt auch individuelle Transformations-Eigenschaften hinter dem Flag Experimental Web Platform features, das über
chrome://flagsaktiviert werden kann.Ich bin persönlich etwas zwiegespalten, was ihren Nutzen angeht. Ich würde sagen „in einigen Fällen wirklich nützlich, aber meistens keine Option“.
Mein größtes Problem ist, dass sie nur in einer bestimmten Reihenfolge angewendet werden können (und, mit wenigen Ausnahmen, die Reihenfolge der Transformationen zählt). Das ist nicht die Reihenfolge, in der ich Transformationsfunktionen am häufigsten anwende. Normalerweise verwende ich Transformationen, um Elemente in einem logischen Muster in 2D oder 3D zu verteilen. Das bedeutet, mit einer oder mehreren Rotationen zu beginnen und erst dann eine Translation anzuwenden. Und hier haben wir auch das Problem, dass ich, wenn ich Elemente in 3D verteile, normalerweise zuerst eine
rotatey()und dann einerotatex()habe, und dies nur eine einzelne Rotation zulässt. Und natürlich gibt es die Möglichkeit, die Matrizen auszufüllen, sie zu multiplizieren, die Spur zu berechnen und alles andere zu ermitteln, was notwendig ist, um sie zu einer einzigenrotate3d()zu kombinieren. Aber das ist eine Qual.Ein Fall, in dem ich sie jedoch nützlich finde, ist, wenn ich nur eine einzelne Rotation und eine einheitliche Skalierung habe, die ich animieren möchte, und für die beiden unterschiedliche Timing-Funktionen benötige. Wie im Fall dieser Würfelanimation oder für diese dreieckigen Öffnungen.