はじめに
Webサイトの表現力を高める手段として、3Dアニメーションの導入が注目されています。
「3D」と聞くとJavaScriptやWebGLなどの難しい技術を連想しがちですが、HTMLとCSSだけでも、意外と手軽に3D表現を実現できます。
今回は、CSSのtransform
プロパティやperspective
を使った基本的な3Dアニメーションの作り方と、実際の活用例・応用テクニックを紹介します。
まずは要素を簡単に回転させてみよう
例:立方体の回転アニメーション
<div class="cube">
<div class="face front">Front</div>
<div class="face back">Back</div>
<div class="face right">Right</div>
<div class="face left">Left</div>
<div class="face top">Top</div>
<div class="face bottom">Bottom</div>
</div>
.cube {
background-color: lightgreen;
width: 200px;
position: relative;
transform-style: preserve-3d;
transform: rotateX(30deg) rotateY(30deg);
animation: spin 5s linear infinite;
perspective: 600px;
}
@keyframes spin {
0% { transform: rotateX(30deg) rotateY(0deg); }
100% { transform: rotateX(30deg) rotateY(360deg); }
}
要素がぐるぐる回転します。
3Dアニメーションの使いどころ
- CSS3Dアニメーションの主な活用場面例:
- アイキャッチなローディングアニメーション
- カードやパネルのフリップ(めくり)表現
- メニューやボタンのインタラクション強化
- ポートフォリオやLPなど、印象に残るWebページ
本格的な3Dアニメーション
CSSで本格的な3D効果を作るためには、以下のプロパティを理解することです。
transform: rotateX(), rotateY(), rotateZ(), translateZ()
perspective
transform-style: preserve-3d
-
transition
やanimation
との組み合わせ
この4つについて詳しく説明します。
1. transform: rotateX(), rotateY(), rotateZ(), translateZ()
これらはCSSの3D変形を行うためのプロパティで、要素を三次元空間上で回転・移動させるために使います。
1-1. rotateX(angle)
X軸(横軸)を中心に要素を回転させます。
正の値で「奥に倒れる」、負の値で「手前に倒れる」動きになります。
例:45度回転させる
.box {
transform: rotateX(45deg);
}
この場合、要素は奥に向かって90度回転します。
1-2. rotateY(angle)
Y軸(縦軸)を中心に要素を回転させます。
正の値で「左側が奥へ」、負の値で「右側が奥へ」動きになります。
例:45度回転させる
.box {
transform: rotateY(45deg);
}
この場合、要素は時計回りの動きになります。
1-3. rotateZ(angle)
Z軸(画面に垂直な軸)を中心に要素を回転させます。
いわゆる「平面上での回転」(2Dのrotate()と同じ)です。
例:45度回転させる
.box {
transform: rotateZ(45deg);
}
この場合、要素が時計回りに45度回転します。
1-4. translateZ(length)
要素をZ軸方向(奥行き方向)に移動させます。
正の値で「手前に近づく」、負の値で「奥に遠ざかる」動きになります。
例:奥に20px遠ざかさせる
<div class="container">
<div class="box">hello</div>
</div>
.container {
perspective: 600px; /* 遠近感の強さ。小さいほど3Dが強調される */
}
.box {
width: 100px; height: 100px;
background: #3af;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
transition: transform 0.3s;
}
.box:hover {
transform: translateZ(-20px);
}
2. perspective
rotateX()
やrotateY()
、translateZ()
など3D変形を体感するには親要素にperspective
プロパティを設定するのがコツです。
これを設定しないと、3D感が分かりづらくなります。
3. transform-style: preserve-3d
transform-style
は、子要素に対して3D変形(transform
)を適用した時の「奥行き効果」をどう扱うかを決めるCSSプロパティです。
たとえば、「立方体」など複数の要素を3D空間で組み立てたい時に必須です。
transform-styleには主に2つの値があります。
- flat(初期値):
→ 子要素の3D効果を無視し、すべての子要素を2D平面上に並べる - preserve-3d:
→ 親要素内の子要素の3D効果を「そのまま立体的に」維持する
<div class="cube">
<div class="face front">Front</div>
<div class="face back">Back</div>
<div class="face right">Right</div>
<div class="face left">Left</div>
<div class="face top">Top</div>
<div class="face bottom">Bottom</div>
</div>
.cube {
width: 100px;
height: 100px;
position: relative;
transform-style: preserve-3d; /* 重要! */
transform: rotateX(-20deg) rotateY(30deg); /* 回転させて立体感を見せる */
margin: 100px auto;
animation: spin 6s linear infinite;
}
@keyframes spin {
to { transform: rotateX(-20deg) rotateY(390deg); }
}
.face {
position: absolute;
width: 100px;
height: 100px;
background: rgba(100, 200, 250, 0.7);
border: 2px solid #333;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 18px;
}
/* 各面を3D空間に配置 */
.front { transform: translateZ(50px); }
.back { transform: rotateY(180deg) translateZ(50px); }
.right { transform: rotateY(90deg) translateZ(50px); }
.left { transform: rotateY(-90deg) translateZ(50px); }
.top { transform: rotateX(90deg) translateZ(50px); }
.bottom { transform: rotateX(-90deg) translateZ(50px); }
4. transition
やanimation
との組み合わせ
4-1. transitionとの組み合わせ(インタラクション向き)
transition
は「状態が変わったときになめらかに変化させる」プロパティです。
たとえばマウスホバーやクリック時に「カードをひっくり返す」などの動きによく使います。
例:カードのフリップアニメーション
<div class="card">
<div class="card__face card__face--front">Front</div>
<div class="card__face card__face--back">Back</div>
</div>
.card {
width: 200px; height: 120px;
perspective: 600px;
position: relative;
}
.card__face {
width: 100%; height: 100%;
position: absolute; left: 0; top: 0;
backface-visibility: hidden;
display: flex; align-items: center; justify-content: center;
font-size: 2em;
transition: transform 0.6s cubic-bezier(0.4, 2, 0.6, 1);
}
.card__face--front {
background: #29a; color: #fff;
}
.card__face--back {
background: #fa3; color: #222;
transform: rotateY(180deg);
}
.card:hover .card__face--front {
transform: rotateY(180deg); /* ホバーで前面を裏返す */
}
.card:hover .card__face--back {
transform: rotateY(360deg); /* 360degだとまた表になる */
}
hoverするとウラオモテが入れ替わります。
4-2. animationとの組み合わせ(自動/ループ向き)
animationは「キーフレーム通りに自動でアニメーション」させたい場合に使います。
たとえば立方体を自動回転させたり、3Dローディングアニメを作ったりするのに最適です。
例:3D立方体を自動回転
<div class="cube">
<div class="face front">F</div>
<div class="face back">B</div>
<div class="face right">R</div>
<div class="face left">L</div>
<div class="face top">T</div>
<div class="face bottom">D</div>
</div>
.cube {
width: 100px; height: 100px;
position: relative;
transform-style: preserve-3d;
animation: cube-spin 5s linear infinite;
margin: 60px auto;
perspective: 600px;
}
@keyframes cube-spin {
0% { transform: rotateX(0deg) rotateY(0deg); }
100% { transform: rotateX(360deg) rotateY(360deg); }
}
.face {
position: absolute;
width: 100px;
height: 100px;
background: rgba(100, 200, 250, 0.7);
border: 2px solid #333;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 18px;
}
/* 各面を3D空間に配置 */
.front { transform: translateZ(50px); }
.back { transform: rotateY(180deg) translateZ(50px); }
.right { transform: rotateY(90deg) translateZ(50px); }
.left { transform: rotateY(-90deg) translateZ(50px); }
.top { transform: rotateX(90deg) translateZ(50px); }
.bottom { transform: rotateX(-90deg) translateZ(50px); }
3Dキューブを作成するためのポイント
- 各
.face
のtransformプロパティで3D空間上の位置と向きを決めている - translateZ(50px)は「要素の中心から50px手前」=立方体の半分の厚み(サイズ/2)
- rotateY()やrotateX()で面の向きを調整してから、translateZ()で移動させている
4-3. transitionとanimationの違い・使い分け
使う場面 | transition | animation |
---|---|---|
きっかけ | 状態変化(hover, activeなど) | 自動で動かしたいとき |
アニメーション制御 | 開始/終了のみ | 複数の動き・繰り返しもOK |
簡単なインタラクション | ◎ | △(工夫すれば可) |
複雑なシーン | △ | ◎ |
Tips
- パフォーマンス:複雑すぎる3D表現や要素数が多いと、モバイルではカクつくことがあるため注意
- ブラウザ対応:主要ブラウザは対応していますが、念のため検証を
-
backface-visibility
:めくるアニメーション時は裏面表示制御が必須 -
perspective
の調整:値が小さいほど3D感が強く、大きいと遠近感が薄れる -
transform
のorigin
調整:回転軸を意識して使うと自由度が増す
最後に
CSSだけでも「おっ」と思わせる3Dアニメーションを作ることが可能です。
まずは簡単なものからトライして、自分なりの表現を広げてみてください。