CSSのTransformsにおけるtranslateZ()関数:奥行きのある動きを操る


translateZ() の書き方

transform: translateZ(n);
  • 負の値を指定すると、要素は閲覧者から遠ざかります。
  • 正の値を指定すると、要素は閲覧者に近づきます。
  • n は、要素を Z 軸方向に移動する距離をピクセル単位で指定します。

translateZ() の実用例

  • 疑似3D回転
    perspective() プロパティと組み合わせて使用することで、疑似的な3D回転を実現できます。これは、要素を回転させるのではなく、回転しているように見せかける視覚効果です。
  • 3D ホバーエフェクト
    要素にホバーイベントを検知させた際に、translateZ() で要素を Z 軸方向に移動させて、奥行きのあるホバーエフェクトを作成できます。
  • カードのめくり効果
    カードを積み重ねたように並べ、それぞれに translateZ() で異なる Z 軸方向のオフセットを設定することで、めくったように見える効果を作成できます。

translateZ() を使用する際の注意点

  • translateZ() は、古いブラウザーではサポートされていない場合があります。必要に応じて、ベンダープレフィックスを付加することを検討してください。
  • translateZ() は、他の transform プロパティと組み合わせて使用することができますが、順番によって効果が異なる場合があります。詳細は MDN Web Docs のドキュメントを参照してください。
  • 創造的に使用することで、ユーザーのインタラクションをより魅力的にしたり、デザインをより洗練させたりすることができます。
  • translateZ() 関数は、Web ページに奥行きと立体感を追加するための強力なツールです。


カードのめくり効果

<div class="card-container">
  <div class="card card-1">カード1</div>
  <div class="card card-2">カード2</div>
  <div class="card card-3">カード3</div>
</div>
.card-container {
  perspective: 800px; /* 奥行きを設定 */
}

.card {
  position: absolute;
  width: 200px;
  height: 150px;
  background-color: #ccc;
  text-align: center;
  line-height: 150px;
  margin: 10px;
  transform-style: preserve-3d; /* 3D スタイルを保持 */
}

.card-1 {
  transform: translateZ(40px); /* カード1を40px手前に移動 */
}

.card-2 {
  transform: translateZ(20px); /* カード2を20px手前に移動 */
}

.card-3 {
  /* カード3はデフォルトの位置 */
}

この例では、3枚のカードを積み重ねて表示し、それぞれに translateZ() で異なる Z 軸方向のオフセットを設定することで、めくったように見える効果を作成しています。

3D ホバーエフェクト

<div class="button">ボタン</div>
.button {
  width: 100px;
  height: 50px;
  background-color: #007bff;
  color: #fff;
  text-align: center;
  line-height: 50px;
  margin: 20px auto;
  border: none;
  cursor: pointer;
  transform-style: preserve-3d; /* 3D スタイルを保持 */
  transition: transform 0.2s ease; /* トランジションを設定 */
}

.button:hover {
  transform: translateZ(-10px); /* ホバー時に10px奥に移動 */
}

この例では、ボタンにホバーイベントを検知させた際に、translateZ() でボタンを Z 軸方向に移動させて、奥行きのあるホバーエフェクトを作成しています。

<div class="cube">
  <div class="face face-1">前面</div>
  <div class="face face-2">背面</div>
  <div class="face face-3">右面</div>
  <div class="face face-4">左面</div>
  <div class="face face-5">上面</div>
  <div class="face face-6">下面</div>
</div>
.cube {
  width: 150px;
  height: 150px;
  perspective: 400px; /* 奥行きを設定 */
  transform-style: preserve-3d; /* 3D スタイルを保持 */
}

.face {
  position: absolute;
  width: 100%;
  height: 100%;
  background-color: #ccc;
  text-align: center;
  line-height: 150px;
}

.face-1 {
  transform: translateZ(50px); /* 正面を50px手前に移動 */
}

.face-2 {
  transform: translateZ(-50px); /* 背面を50px奥に移動 */
}

.face-3 {
  transform: rotateY(90deg) translateZ(50px); /* 右面を90度回転させて50px手前に移動 */
}

.face-4 {
  transform: rotateY(-90deg) translateZ(50px); /* 左面を90度回転させて50px手前に移動 */
}

.face-5 {
  transform: rotateX(90deg) translateZ(50px); /* 上面を90度回転させて50px手前に移動 */
}

.face-6 {
  transform: rotateX(-90deg) translateZ(50px); /* 下面を90度回転させて50px手


    • transform-origin で回転の中心点を設定し、perspective で奥行きを指定することで、疑似的な3D回転を実現できます。
    • translateZ()よりも柔軟性が高く、複雑なアニメーションにも適しています。
    • 欠点として、古いブラウザーではサポートされていない場合があります。
    .element {
        transform-origin: 50% 50%;
        perspective: 400px;
        transform: rotateY(45deg); /* Y軸方向に45度回転 */
    }
    
  1. calc()関数を使用した相対的な移動

    • 親要素のサイズなどを基準とした相対的な移動量を指定できます。
    • レスポンシブデザインに適しており、様々な画面サイズで適切な動きを表現できます。
    • 計算が必要になるため、記述が煩雑になる場合があります。
    .element {
        transform: translate(0, calc(50% - 50px)); /* 親要素の高さの50%から50pxの位置に移動 */
    }
    
  2. CSSフレームワークやライブラリの利用

    • GreenSockAnime.js などのライブラリは、translateZ()以外にも様々なアニメーション機能を提供しています。
    • より複雑な動きや高度なエフェクトを作成したい場合に有効です。
    • 導入や学習コストがかかる場合があります。
    // GreenSockを使ったtranslateZの代替例
    const element = document.querySelector('.element');
    
    // Z軸方向に100px移動
    TweenLite.to(element, 1, { transform: { translateZ: 100 } });
    

「translateZ()」の代替方法を選択する際のポイント

  • パフォーマンス
    アニメーションのパフォーマンスも考慮する必要があります。
  • コードの複雑性
    複雑なコードはメンテナンスが難しくなるため、できるだけシンプルなコードを心がけましょう。
  • ブラウザサポート
    古いブラウザーへの対応が必要かどうかを考慮する必要があります。
  • 実現したい動き
    どのような動きを実現したいのかを明確にすることが重要です。