gpt4 book ai didi

javascript - 嘿!我试图让十字准线跟随我的鼠标,但 e.mouseX 和 e.mouseY 无法准确工作

转载 作者:行者123 更新时间:2023-12-02 17:43:13 25 4
gpt4 key购买 nike

这是我的代码:

const canv = document.getElementById('canvas');
const ctxt = canv.getContext('2d');
const w = canv.width;
const h = canv.height;
canv.addEventListener('mousemove', e => {
ctxt.clearRect(0, 0, canvas.width, canvas.height);
drawLine(e.clientX, 0, e.clientX, h);
drawLine(0, e.clientY, w, e.clientY);
})
function drawLine(x1, y1, x2, y2) {
ctxt.beginPath();
ctxt.moveTo(x1, y1);
ctxt.lineTo(x2, y2);
ctxt.stroke();
}
canvas {
border: 1px solid black;
width: 100%;
height: 100%;
}
<canvas id='canvas'></canvas>

e.clientX 和 e.clientY 无法正常工作(运行代码)。我该如何解决这个问题?

最佳答案

首先,您不应该使用 CSS 来设置 Canvas 的大小,而应该使用属性 widthheight

其次,您应该使用相对鼠标位置(相对于 Canvas ),以便十字准线准确。为此,我们将使用 other SO answer 中的代码.

具体做法如下:

const canv = document.getElementById('canvas');
const ctxt = canv.getContext('2d');
const w = canv.width;
const h = canv.height;

const rect = canv.getBoundingClientRect();

canv.addEventListener('mousemove', e => {

const x = e.pageX - rect.left;
const y = e.pageY - rect.top;

ctxt.clearRect(0, 0, canvas.width, canvas.height);
ctxt.beginPath();
ctxt.moveTo(0, y);
ctxt.lineTo(w, y);
ctxt.moveTo(x, 0);
ctxt.lineTo(x, h);
ctxt.stroke();
});

/* drawLine is really not necessary */
canvas {
border: 1px solid black;
/* no sizing here */
}
<canvas id='canvas' width="640" height="480"></canvas>

注意:使用 pageXpageY 而不是 clientXclientY,这样如果涉及滚动,您仍然可以获得准确的跟踪。 clientXclientY 不考虑滚动,而 pageXpageY 则考虑滚动。

关于javascript - 嘿!我试图让十字准线跟随我的鼠标,但 e.mouseX 和 e.mouseY 无法准确工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59706762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com