個別の変換プロパティで CSS 変換をより詳細に制御

translaterotatescale プロパティを使用して要素を変換する

CSS transform プロパティ

要素に変換を適用するには、CSS transform プロパティを使用します。このプロパティは、1 つ以上の <transform-function> を受け取り、それらを順番に適用します。

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

ターゲット エレメントは、X 軸で 50% 移動され、30 度回転され、最後に 120% に拡大されます。

transform プロパティは問題なく機能しますが、これらの値を個別に変更する場合は少し面倒です。

ホバー時にスケールを変更するには、値が変更されていなくても、transform プロパティ内のすべての関数を複製する必要があります。

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

個々の変換プロパティ

Chrome 104 では、CSS 変換の個々のプロパティがリリースされます。プロパティは scalerotatetranslate です。これらのプロパティを使用して、変換の各部分を個別に定義できます。

これにより、Chrome は、すでにこれらのプロパティをサポートしている Firefox と Safari に加わります。

対応ブラウザ

  • Chrome: 104。
  • Edge: 104。
  • Firefox: 72.
  • Safari: 14.1。

ソース

上記の transform の例を個々のプロパティで書き換えると、スニペットは次のようになります。

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

順序の重要性

元の CSS transform プロパティと新しいプロパティの主な違いの 1 つは、宣言された変換が適用される順序です。

transform を使用すると、変換関数は記述された順序で左(外側)から右(内側)に適用されます。

個々の変換プロパティの順序は、宣言された順序とは異なります。順序は常に同じです。まず translate(外側)、次に rotate、最後に scale(内側)です。

つまり、次の 2 つのコード スニペットは同じ結果になります。

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

どちらの場合も、対象の要素はまず X 軸方向に 50% だけ移動され、次に 30deg だけ回転され、最後に 1.2 だけ拡大されます。

個々の変換プロパティのいずれかが transform プロパティとともに宣言されている場合、個々の変換が最初に適用され(translaterotatescale)、最後に transform が適用されます(内部)。詳細については、変換行列の計算方法を定義する仕様をご覧ください。

アニメーション

これらのプロパティが追加された主な理由は、アニメーションを簡単にするためです。次のように要素をアニメーション化するとします。

キーフレーム グラフ。

transform の使用

transform を使用してこのアニメーションを実装するには、定義されたすべての変換のすべての中間値を計算し、各キーフレームに含める必要があります。たとえば、10% の時点で回転を行うには、transform プロパティにすべての変換値が必要になるため、他の変換の値も計算する必要があります。

中間値が計算されたキーフレーム グラフ。

生成された CSS コードは次のようになります。

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

個々の変換プロパティを使用する

個々の変換プロパティを使用すると、記述が大幅に簡単になります。すべての変換をキーフレームからキーフレームにドラッグする代わりに、各変換を個別にターゲットに設定できます。また、中間の値をすべて計算する必要もありません。

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

個々の変換プロパティと複数のキーフレームを使用する

コードをモジュラー化するには、各サブアニメーションを一連のキーフレームに分割します。

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

この分割により、個別のプロパティになった transform プロパティが互いにオーバーライドされなくなるため、各キーフレーム セットを自由に適用できるようになります。上記の処理では、すべてを書き換えることなく、各変換に異なるタイミングを指定できます。

パフォーマンス

これらの新しいプロパティを使用するアニメーションは、既存の transform プロパティのアニメーションと同じくらい効率的です。

translaterotatescale のアニメーションは、transform のアニメーションと同じようにコンポーザで実行されるため、transform と同じようにアニメーションのパフォーマンスに適しています。

これらの新しいプロパティは、will-change プロパティでも機能します。一般的に、will-change の使用を避けるには、必要な最小数の要素で、可能な限り短い時間だけ使用します。できるだけ具体的に記入することもできます。たとえば、will-change を使用して rotate プロパティと filter プロパティでアニメーションを最適化する場合は、will-change: rotate, filter を使用して宣言する必要があります。これは、rotatefilter をアニメーション化する場合に will-change: transform, filter を使用する場合よりも少し優れています。これは、will-change を使用するときに Chrome が事前に作成するデータ構造の一部が、transformrotate で異なるためです。

相互運用性に関する新シリーズの一部