You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CSS Grid中所有子元素触发鼠标移动的3D倾斜效果?

问题:让Grid容器所有子元素触发鼠标hover 3D倾斜效果

我用JavaScript实现鼠标hover时的3D倾斜效果,已经搭好CSS Grid布局,效果能运行,但目前仅作用于Grid容器的第一个div元素,怎么让所有子元素都触发该效果?


问题原因

你当前使用document.querySelector('.card > div')只会选中匹配选择器的第一个元素,所以只有第一个div能触发倾斜效果。要让所有子元素生效,需要选中所有目标元素并逐个绑定事件。

修改后的代码

JavaScript部分

// 选中所有.card下的div子元素
const cards = document.querySelectorAll('.card > div');

// 遍历每个元素,绑定鼠标事件
cards.forEach(card => {
  // 鼠标移动时触发倾斜效果
  card.addEventListener("mousemove", (e) => {
    rotateElement(e, card);
  });
  // 鼠标离开时重置元素状态(可选,提升交互体验)
  card.addEventListener("mouseleave", () => {
    card.style.transform = 'perspective(500px) rotateX(0deg) rotateY(0deg)';
  });
});

function rotateElement(e, card){
  const x = e.pageX;
  const y = e.pageY;

  const middleX = window.innerWidth / 2;
  const middleY = window.innerHeight / 2;

  const offsetX = (1 * ((x - middleX) / middleX) * 15).toFixed(2);
  const offsetY = (-1 * ((y - middleY) / middleY) * 15).toFixed(2);

  card.style.transform = `perspective(500px) rotateX(${offsetY}deg) rotateY(${offsetX}deg)`;
}

CSS和HTML部分(无需修改)

body {
  display: flex;
  width: 100%;
  min-height: 100vh;
  align-items: center;
  justify-content: space-evenly;
  background-color: #000;
}
.card {
  display: grid;
  border-radius: 10px;
  width: 400px;
  height: 500px;
  font-size: 1.75rem;
  background-color: #e84393;
  align-items: center;
  justify-content: center;
  gap: 2px;
  transform: perspective(1000px);
}

.card > div{
  position:relative;
  width: 150px;
  height: 150px;
  background-color: rgb(255, 247, 247);
  transform: perspective(500px);
  z-index: 9999;
}
<body>   
   <div class="card">
    <div class="ahaha"></div>
    <div class="ahaha"></div>
    <div class="ahaha"></div>
  </div>
 <script src="tilt.js"></script>
</body>

内容的提问来源于stack exchange,提问作者klob0t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:20:18