個別の変換プロパティで 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 に統合されます。

対応ブラウザ

  • 104
  • 104
  • 72
  • 14.1

ソース

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

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

順序の重要性

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

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

個々の変換プロパティを使用する場合、宣言の順序とは逆の順序ではありません。順序は常に同じで、最初に translate(外側)、rotatescale(内側)の順になります。

つまり、以下のどちらのコード スニペットでも結果は同じになります。

.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 プロパティとともに宣言されている場合、個々の変換が最初に適用され(translaterotate、次に scale)、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 で異なるためです。

Newly interoperable シリーズの一部