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

如何获取相对于目标元素的光标位置且忽略子元素及干扰元素?

解决鼠标位置计算不受子元素/其他元素干扰的问题

方案1:通过坐标计算直接获取相对于目标元素的位置

核心思路是利用getBoundingClientRect()获取目标元素的视口位置,结合鼠标的视口坐标clientX/Y计算出相对于目标元素的位置,完全不受子元素影响:

document.querySelectorAll(".parallax").forEach((parallax) => {
  document.addEventListener("mousemove", (e) => {
    // 获取.parallax元素在视口中的边界信息
    const elementRect = parallax.getBoundingClientRect();
    
    // 计算鼠标相对于元素左上角的坐标(无视子元素)
    const xFromElementLeft = e.clientX - elementRect.left;
    const yFromElementTop = e.clientY - elementRect.top;
    
    // 转换为相对于元素中心的坐标
    const x = xFromElementLeft - parallax.innerWidth / 2;
    const y = yFromElementTop - parallax.innerHeight / 2;
    
    // 这里执行你的视差逻辑
    console.log("相对于中心的坐标:", x, y);
  });
});

补充:仅在鼠标悬停目标元素时计算

如果只需要在鼠标落在.parallax元素上时才计算位置,可以添加范围判断:

document.querySelectorAll(".parallax").forEach((parallax) => {
  document.addEventListener("mousemove", (e) => {
    const elementRect = parallax.getBoundingClientRect();
    
    // 判断鼠标是否在目标元素范围内
    const isMouseOverElement = 
      e.clientX >= elementRect.left && 
      e.clientX <= elementRect.right && 
      e.clientY >= elementRect.top && 
      e.clientY <= elementRect.bottom;
    
    if (!isMouseOverElement) return;
    
    const xFromElementLeft = e.clientX - elementRect.left;
    const yFromElementTop = e.clientY - elementRect.top;
    const x = xFromElementLeft - parallax.innerWidth / 2;
    const y = yFromElementTop - parallax.innerHeight / 2;
    
    console.log("相对于中心的坐标:", x, y);
  });
});

方案2:利用CSS事件穿透简化代码

给.parallax的所有子元素设置pointer-events: none,让鼠标事件直接穿透子元素触发在父元素上,此时使用offsetX/Y就能直接得到相对于.parallax的位置:

第一步:添加CSS样式

.parallax > * {
  pointer-events: none;
}

第二步:修改JS代码

直接给.parallax元素绑定事件,此时offsetX/Y不会受子元素干扰:

document.querySelectorAll(".parallax").forEach((parallax) => {
  parallax.addEventListener("mousemove", (e) => {
    const x = e.offsetX - parallax.innerWidth / 2;
    const y = e.offsetY - parallax.innerHeight / 2;
    
    console.log("相对于中心的坐标:", x, y);
  });
});

方案对比

  • 坐标计算法:无需修改页面样式,灵活度高,适合不能改动现有CSS的场景。
  • CSS穿透法:代码更简洁直观,适合允许修改子元素样式的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:34:59