ホバーした場所に応じて傾くカード
ホバーJavaScriptカードタッチ操作可能
Card
カードの向きがホバーした場所に向けて傾きます。
実装のポイント
カード要素上のホバー位置をJavaScriptで取得し、その座標をもとにrotate
プロパティで傾けています。カード上の相対位置はevent.offsetX
やevent.offsetY
でも取得できますが、カード内に別の要素があるとその要素の相対位置になってしまいます。そのためgetBoundingClientRect()
でサイズと画面上の位置を取得しポインターの位置から算出しています。
中心からの度合いに応じて、rotate
プロパティのベクトル向きとを変更しています。また、ホバーが外れたらもとに戻す処理も忘れずにいれましょう。
今回はpointer
イベントで実装しているのでCSSのtouch-actiob
プロパティを適切に設定すればタッチ操作でも傾けられます。
コード例
HTML
<div class="sampleCard">
<div class="face front">
<p>Card</p>
</div>
</div>
CSS
.sampleCard {
perspective: 500px;
touch-action: pinch-zoom;
}
.face {
--ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1);
transition: rotate 0.2s var(--ease-out-cubic);
}
JavaScript
const cardElement = document.querySelector(".sampleCard");
const faceElement = cardElement.querySelector(".face");
const { width, height } = cardElement.getBoundingClientRect();
// カードの傾きの最大値(度)
const maxTilt = 20;
// カードの傾きを更新
const updateCardTilt = (x, y) => {
faceElement.style.rotate = `${-y} ${x} 0 ${maxTilt}deg`;
};
cardElement.addEventListener("pointermove", (event) => {
// 要素の幅と高さと位置を取得
const { width, height, left, top } = cardElement.getBoundingClientRect();
// 要素の中心位置を算出
const centerX = width / 2;
const centerY = height / 2;
// ポインターのカードの中心からの位置を算出
const offsetX = event.clientX - left;
const offsetY = event.clientY - top;
// ポインターのカードの中心からの度合い
const x = (offsetX - centerX) / centerX;
const y = (offsetY - centerY) / centerY;
updateCardTilt(x, y);
});
// ポインターがカードから離れたらもとに戻す
cardElement.addEventListener("pointerleave", () => {
updateCardTilt(0, 0);
});