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

如何解决页面滚动后鼠标点击生成文本位置偏移问题

问题分析

你遇到的滚动后位置偏移问题,根源是**clientX/clientY的坐标参考系不匹配**:

  • clientX/clientY是相对于当前浏览器视口的左上角计算的,页面滚动后,文档的左上角已经移出视口,但position: absolute的元素是相对于body(文档根节点)的左上角定位的,两者原点不一致,就会导致位置偏移。
修复方案

改用**pageX/pageY**获取点击坐标,这两个属性是相对于文档左上角的位置,不管页面是否滚动,都能和body绝对定位的原点完美匹配。

另外,原代码中直接给div.classList赋值字符串的写法不规范,应该用classList.add()方法添加多个类名,避免破坏默认的类列表行为。

修改后的完整代码
const texts = [
  "Paragraph: 1",
  "Paragraph: 2",
  "Paragraph: 3",
  "Paragraph: 4",
  "Paragraph: 5",
  "Paragraph: 6",
  "Paragraph: 7",
  "Paragraph: 8",
  "Paragraph: 9",
  "Paragraph: 10"
];
const classes = [
  "red gray-bg font-1",
  "blue font-2",
  "red",
  "blue",
  "red",
  "blue",
  "red",
  "blue",
  "red",
  "blue",
];
// Keeps Track of Current Text
let currentParaIdx = 0;

document.addEventListener("click", (e) => {
  // Stop once All Texts are Displayed
  if (currentParaIdx === texts.length) return;

  // 改用pageX/pageY获取相对于文档的坐标
  const { pageX, pageY } = e;

  //create the div
  const div = document.createElement("div");

  //set its text
  div.innerText = texts[currentParaIdx];

  // 正确添加类名
  div.classList.add(...classes[currentParaIdx].split(' '));
  div.style.position = "absolute";
  div.style.left = pageX + "px";
  div.style.top = pageY + "px";
  
  currentParaIdx++;
  document.body.append(div); //add div to the page
});
兼容补充

如果需要兼容非常旧的浏览器(不支持pageX/pageY),也可以手动计算坐标:

const x = e.clientX + window.scrollX;
const y = e.clientY + window.scrollY;

效果和pageX/pageY完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:45:32