transform-style
プロパティへpreserve-3d
を設定すると子要素を3D空間に配置することができる。
これを使用すると簡単なcssとスクリプトで視差回転アニメーションが実現できるので試してみた。
デモはこちら。
対応ブラウザでマウスかタッチしてぐりぐりしてみて欲しい。
.k3d { position: absolute; top: 50%; left: 50%; transform-style: preserve-3d; width: 600px; height: 600px; transform: translate(-50%, -50%) perspective(600px); } .k3d img { display: block; position: absolute; } .k3d__l0 { transform: translateZ(-30px); z-index: 1; opacity: 0.8; } .k3d__l1 { transform: translateZ(0px); z-index: 2; } .k3d__l2 { transform: translateZ(30px); z-index: 3; } .k3d__l3 { transform: translateZ(60px); z-index: 4; }index.html
<div class="k3d"> <img class="k3d__l0" src="kuma0.svg" /> <img class="k3d__l1" src="kuma1.svg" /> <img class="k3d__l2" src="kuma2.svg" /> <img class="k3d__l3" src="kuma3.svg" /> ... </div/>
k3d要素を画面中央に配置。この要素が回転アニメーションさせる面となる。
回転時に視差効果が出るよう4枚の画像をZ方向へずらしながら重ねて配置した。
var flip = false; var style = "translate(-50%, -50%) perspective(600px)"; var el = document.querySelector(".k3d"); var x = 0, y = 0; var render = function() { el.style.transform = style + " rotateY(" + (flip ? x + 180 : x) + "deg)" + " rotateX(" + y + "deg)"; }; document.addEventListener('pointermove', throttle(20, function(e) { x = -(window.innerWidth / 2 - e.clientX) * 0.03; y = (window.innerHeight / 2 - e.clientY) * 0.02; render(); }), false); document.addEventListener('click', function(e) { if (e.button == 0) { flip = !flip; render(); } }, false);
マウス移動(タッチ移動)をキャプチャして回転量を調整しながらtransform
プロパティを変化させてk3d
要素を回転させる。
translate
でマイナス方向へ移動させ、perspective
を指定しているので、回転の原点は画面中央且つ奥方向へ600pxとなる。
また、クリックで180度多く回転させて後ろ姿も見れるようにした。
※throttle
はイベントを間引く関数。
以上。かなりのお手軽さ。