Menu

CSS transform の使い方: translate、scale、skew、transform-origin

transform プロパティは、周りのレイアウトを変えずに要素を移動、拡大縮小、回転、傾斜させます。すべての transform 関数、関数の順番が重要な理由、transform-origin、個別の translate、scale、rotate プロパティ、translate(-50%, -50%) で中央に置くテクニックを解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

transform の役割

transform は要素の 描き方 を変えます。移動、拡大縮小、回転、傾斜です。下の点線の枠は、transform がなければ各ボックスがあるはずの場所を示しています:

translate(20px, 10px) は青いボックスを右に 20px、下に 10px 動かします。scale(1.3) は緑のボックスを中心から 30% 大きくします。rotate(20deg) は琥珀色のボックスを時計回りに回転させ、skewX(-20deg) は暗い色のボックスを傾けます。どの場合も、点線の枠 (要素がレイアウトで取る場所) はそのままです。

transform の関数

関数働き例
translate(x, y)移動translate(20px, -10px)、translate(-50%, -50%)
translateX(x) / translateY(y)1 つの軸で移動translateY(-4px)
scale(s) / scale(x, y)拡大縮小 (1 = 元のサイズ、0.5 = 半分、負の値で反転)scale(1.1)、scale(-1, 1)
scaleX(s) / scaleY(s)1 つの軸で拡大縮小scaleX(0.5)
rotate(angle)時計回りに回転 (負の値で反時計回り)rotate(45deg)、rotate(0.25turn)
skew(x, y) / skewX(a) / skewY(a)傾斜skewX(-15deg)
matrix(a, b, c, d, e, f)上のすべてを 1 つの行列で。主にブラウザが返す形
nonetransform なし

translate() のパーセントは、親ではなく要素 自身 のサイズが基準です。回転には、度、回転数、回転し続けるアニメーションを扱う専用のページがあります: CSS rotate。

transform プレイグラウンド

スライダーを動かしてください。1 行目は組み立てた transform の値、2 行目はそこからブラウザが計算した行列で、どんな transform でも getComputedStyle が返すのはこの形です:

transform はレイアウトを動かさない

transform した要素は別の場所に描かれますが、ページは transform がないかのように配置されます。隣の要素は位置を保ちます。これが transform がホバーの効果やアニメーションに向いている理由で、周りの何も配置し直されません。

真ん中の 2 つのボックスは、どちらも 1.5 倍に見えます。scale したほうは隣と重なり、C はそのままです。width と height で大きくしたほうは、C を 40px 先に押し出します。

複数の transform とその順番

1 つの transform に、空白で区切って複数の関数を書きます。順番で結果が変わります。左から右に読んで、各関数はそれより前の関数が残した座標系の中で働くからです:

青いボックスはまっすぐ 120px 動いてから、その場で回転しました。緑のボックスは先に回転したので「x 軸」が斜めを向いていて、translateX(120px) で斜め下に動きます。同じ関数で、違う場所です。

もう 1 つの落とし穴: 2 つ目の transform の宣言は 1 つ目を 置き換え ます。カードに transform: rotate(-2deg) があり、ホバーのルールが transform: scale(1.05) だと、ホバーしたときに回転が消えます。両方を書く (rotate(-2deg) scale(1.05)) か、下の個別のプロパティを使いましょう。

transform-origin

拡大縮小、回転、傾斜は、固定点である transform の原点 を中心に行われ、初期値は中央です。キーワード、長さ、パーセントで変えられます:

3 つのボックスはどれも 25 度回転します。1 つ目は真ん中を軸にし、2 つ目は左上の角を枠の角に固定したまま、3 つ目は右下の角を固定したまま回転します。ボタンから広がるドロップダウンメニューには、scale() と transform-origin: top を使います。

translate、scale、rotate プロパティ

現在のブラウザには、関数と同じ働きをしつつ、それぞれ独立して指定やアニメーションができる 3 つの個別のプロパティもあります:

.card {
  rotate: -2deg;
  transition: scale 0.2s ease-out;
}
.card:hover {
  scale: 1.05;   /* the rotation stays, because it is a different property */
}

宣言した順番に関係なく、常に transform の値の前に transform: translate(...) rotate(...) scale(...) と書いたかのように組み合わされます。書き方に注意しましょう。translate: 10px 20px と scale: 1.2 は、関数のかっこなしで値を書きます。

translate(-50%, -50%) で中央に置く

translate() のパーセントは要素自身のサイズが基準なので、top: 50%; left: 50%; transform: translate(-50%, -50%) で、absolute で配置したどんなサイズの要素でも親の中央に置けます。flexbox や grid との比較は div の中央寄せのページ にあります。

よくある間違い

  • transform の宣言が 2 つ。 後のほうが完全に勝ちます。関数をまとめるか、rotate、scale、translate のプロパティを使いましょう。
  • インライン要素に transform を付ける。 普通の <span> や <a> は transform を無視します。inline-block にしましょう。
  • 隣の要素が動くと思う。 transform はレイアウトを変えません。スペースを作るには width、margin、gap を変えます。
  • 関数の順番の間違い。 translate() の前に rotate() を書くと、回転した軸に沿って動きます。
  • position: fixed の子要素で起きる思わぬ動き。 transform した要素は fixed の子孫要素の包含ブロックになるので、中の固定ヘッダーが一緒にスクロールします。z-index のための新しいスタッキングコンテキストも作ります。

よくある質問

CSS の transform は何をしますか?

要素の描き方を変えます。移動 (translate)、拡大縮小 (scale)、回転 (rotate)、傾斜 (skew) です。要素はレイアウトの中の元の場所を保つので、周りの要素は動きません。

CSS で複数の transform を指定するには?

1 つの transform の値に空白で区切って並べます: transform: translateX(50px) rotate(20deg) scale(1.2);。2 つ目の transform の宣言を書くと、追加されるのではなく 1 つ目が置き換えられます。

transform の関数の順番は重要ですか?

重要です。左から右に読んで、各関数はそれより前の関数が残した軸の上で働きます。そのため rotate(45deg) translateX(100px) は回転した軸に沿って要素を動かし、translateX(100px) rotate(45deg) はまっすぐ動かしてから回転させます。

transform-origin とは何ですか?

拡大縮小、回転、傾斜の中心になる固定点です。初期値は中央 (50% 50%) です。transform-origin: top left にすると、要素は左上の角から大きくなったり、左上の角を中心に回転したりします。

span に transform が効かないのはなぜですか?

transform は、普通の <span> や <a> のような非置換インライン要素には適用されません。要素に display: inline-block か block を指定すると、transform が効きます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める