はじめに:なぜ rotateZ() をわざわざ学ぶ必要があるのか?
CSSで要素を回転させる方法はいくつかあります。最もよく使われる rotate() 関数、そして3D変換用の rotateX()、rotateY()、rotateZ() があります。しかし、rotate() と rotateZ() は画面上では まったく同じ見た目 になります。どちらも要素を時計回り/反時計回りに回転させるからです。
では、なぜCSS仕様に2つが存在するのでしょうか? 🤔
実務では、この2つを明確に使い分けるべき状況があります。特に:
- 3D変換と組み合わせる場合(例:アイソメトリックカード、キューブアニメーション)
- GPUアクセラレーションを活用してスムーズなアニメーションを作る場合
- ブラウザのレイアウト計算負荷を減らしたい場合
この記事では、rotateZ() の構文、2D rotate() との違い、そして現場ですぐに使える実例を紹介します。

rotateZ() の基本構文と単位
rotateZ() 関数は1つの引数(角度)のみを受け取ります。正の値で時計回り、負の値で反時計回りに回転します。
/* 角度単位ごとの使用例 */
.element {
/* 度(deg) - 最も一般的 */
transform: rotateZ(90deg); /* 時計回り90度 */
transform: rotateZ(-180deg); /* 反時計回り180度 */
/* 回転数(turn) - 直感的 */
transform: rotateZ(0.25turn); /* 1/4回転 = 90度 */
transform: rotateZ(1turn); /* 1回転 = 360度 */
/* ラジアン(rad) - 数学/アニメーションに便利 */
transform: rotateZ(1.57rad); /* 約90度 */
transform: rotateZ(6.28rad); /* 1回転 */
/* グラジアン(grad) - あまり使われない */
transform: rotateZ(100grad); /* 90度 */
}
ポイント: 実務では
degかturnが最もよく使われます。turnはアニメーションのキーフレームで「1回転、2回転」と表現したいときに直感的です。

rotate() vs rotateZ():いつどちらを使うべきか?
見た目の違いはない? — その通り、しかし内部処理は異なる
両関数の視覚的な結果は同じです。しかし ブラウザの処理方法 が違います。
| 特徴 | rotate() | rotateZ() |
|---|---|---|
| 変換行列 | 2D行列 (3x3) | 3D行列 (4x4) |
| GPUアクセラレーション | ❌ (メインスレッド) | ✅ (コンポジットレイヤー) |
| 3D変換との組み合わせ | ⚠️ 非推奨 (計算誤差の可能性) | ✅ 推奨 |
| パフォーマンス (複雑なDOM) | 普通 | よりスムーズ |
実践例1:GPUアクセラレーションを活用したスムーズなローディングスピナー
/* ❌ 2D rotate使用 - DOMが複雑だとカクつく可能性 */
.spinner-bad {
animation: spin-bad 1s linear infinite;
}
@keyframes spin-bad {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ✅ rotateZ使用 - GPUレイヤーに昇格してスムーズ */
.spinner-good {
animation: spin-good 1s linear infinite;
}
@keyframes spin-good {
from { transform: rotateZ(0deg); }
to { transform: rotateZ(360deg); }
}
注意:
rotateZ()を使うとブラウザは該当要素を別のGPUコンポジットレイヤーに昇格させます。ただし、あまりに多くの要素に乱用するとGPUメモリが不足する可能性があるので、必要な箇所(アニメーション対象、スクロール時に固定する要素など)に限定して使いましょう。
実践例2:アイソメトリックカード(3D変換との組み合わせ)
/* 3D効果のための親コンテナ */
.isometric-container {
perspective: 1000px; /* 遠近感:値が小さいほど劇的な3D効果 */
}
/* カード本体:X軸60度傾け、Z軸で-45度回転 */
.isometric-card {
transition: transform 0.5s ease;
transform: rotateX(60deg) rotateZ(-45deg);
/* ⚠️ rotate(-45deg) を使うと3D行列計算が狂う可能性あり */
}
/* ホバー時に正面に戻る */
.isometric-card:hover {
transform: rotateX(0deg) rotateZ(0deg) scale(1.1);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
}
重要: 3D変換(
rotateX、rotateY)と併用する場合は必ずrotateZ()を使ってください。rotate()は2D行列にマッピングされるため、3D関数と混ざるとブラウザが行列計算を誤る可能性があります。
実践例3:コインを弾くアニメーション(3軸回転)
.stage {
perspective: 800px;
}
.tumbling-coin {
animation: tumble 3s infinite linear;
}
@keyframes tumble {
0% {
transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);
}
100% {
transform: rotateX(360deg) rotateY(180deg) rotateZ(360deg);
}
}
この例では rotateZ() がコインがテーブル上で回転する効果を生み出します。rotate() ではこのように3軸を同時に制御できません。

まとめと実務適用のポイント
いつ rotateZ() を使うべきか?
- 3D変換と一緒に使う場合 —
rotateX()、rotateY()と組み合わせるなら迷わずrotateZ() - パフォーマンスが重要なアニメーション — ローディングスピナー、無限回転、スクロールベースの効果など
- GPUコンポジットレイヤーが必要な場合 — 複雑なDOMツリーの中で特定の要素だけスムーズに動かしたいときに
注意点
- すべての回転に
rotateZ()を使うのはオーバーエンジニアリングです。単純な2D回転(アイコンを回すなど)はrotate()で十分です。 rotateZ()を過剰に使うとGPUメモリ使用量が増える可能性があります。モバイル端末では特に注意してください。transform-style: preserve-3dと併用する際、子要素の3D空間が維持されるか必ず確認しましょう。
次のステップとしての学習方向
perspectiveとperspective-originの関係を理解するtransform-style: preserve-3dで3D空間を維持するwill-change: transformを活用したさらなるパフォーマンス最適化
参考資料: 本記事は CSS-Tricks の rotateZ() アルマナック をベースに、実務経験を加えて再構成しました。