JSFiddle - React, Tailwind, and code Playground

by HDL52

HTML

<div class="card">
  <img
    src="https://raw.githubusercontent.com/Hongda-OSU/PicGo-2.3.1/master/imgied0v0dgsgyqeoh7804b0ca54buj0qd.jpg"
  />
</div>

CSS

body {
  margin: 0;
  border-radius: 16px;
  min-height: 100vh;
  display: grid;
  place-content: center;
}

.card {
  display: block;
  border-radius: inherit;
  overflow: hidden;
  height: 370px;
  width: 592px;
  transition: transform 0.1s;
  transform: perspective(400px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
}

img {
  border-radius: inherit;
  height: 100%;
  width: 100%;
}

JavaScript

// https://juejin.cn/post/7394073179484110848

const card = document.querySelector(".card")
const img = document.querySelector("img")

// range: 最大的幅度,value:当前鼠标的位置,maxValue: 鼠标所在方向图片长度
const RANGE = [-5, 5]
const getRotate = (value, maxValue) => {
  return (value / maxValue) * (RANGE[1] - RANGE[0]) + RANGE[0]
}

const offsetWidth = card.offsetWidth
const offsetHeight = card.offsetHeight

card.addEventListener("mousemove", (e) => {
  const { offsetX, offsetY } = e
  console.log(offsetX)
  const rx = -getRotate(offsetY, offsetHeight)
  const ry = getRotate(offsetX, offsetWidth)
  card.style.setProperty("--rx", `${rx}deg`)
  card.style.setProperty("--ry", `${ry}deg`)
})

card.addEventListener("mouseleave", (e) => {
  card.style.setProperty("--rx", `0deg`)
  card.style.setProperty("--ry", `0deg`)
})