获取鼠标指针坐标

358 阅读1分钟

获取鼠标指针坐标

适合人群

需要用到的知识点:

  • pageX
  • offsetX
  • scrollLeft
  • getContext("2d")
  • addEventListener("mousemove", e => {})
  • querySelector()

如果以上知识都掌握,那么就开始吧~

正文

创建函数

window.tools.getMouse = element => {
    // 保存 x 轴坐标和 y 轴坐标
    const mouse = { x: 0, y: 0 };
    // ...
}

创建监听器

鼠标移动事件: mousemove


element.addEventListener("mousemove", event => {
    const e = event || window.event;
})

获取鼠标在页面上的坐标

e.pageX

element.addEventListener("mousemove", event => {
    const e = event || window.event;
    
    let x,y;
    
    // 确保浏览器支持: e.pageX
    if (e.pageX || e.pageY) {
        x = e.pageX;
        y = e.pageY;
    }
})

浏览器不支持 pageX

那么可以选择下面的计算方式:

e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;

e.clientX 返回的是鼠标光标相对于浏览器窗口左上角的横向坐标位置。

image.png

如果元素存在横向滚动(相对于视口),采取 document.body.

如果页面文档存在横向滚动,即浏览器宽度小出现横向滚动条,采取 document.documentElement.

将三者相加,才是鼠标相对于页面(0,0)处的 pageX。


补充完整吧:

element.addEventListener("mousemove", event => {
    const e = event || window.event;
    
    let x,y;
    
    // 确保浏览器支持: e.pageX
    if (e.pageX || e.pageY) {
        x = e.pageX;
        y = e.pageY;
    } else {
        // 兼容
        x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }
})

改变原点坐标

有时候我们计算鼠标坐标的原点,不想从页面(0,0)处算起,而是从某个元素内部的鼠标位置。

比如: canvas 内部鼠标位置。

获取 canvas 偏移量: offsetX & offsetY;

只需要 pageX 减去 offsetX 即可。

image.png

从图中我们可以清晰地了解到计算某个元素内部的鼠标的坐标值。

x -= element.offsetX;
y -= element.offsetY;

正文结束,实践开始!

创建 html 结构:

<div class="box">
    <canvas id="canvas" width="200" height="150"></canvas>
    <p id="txt"></p>
</div>

创建 css 代码:

.box {
    text-align: center;
    margin: 100px auto;
}

canvas {
    border: 1px solid gray;
}

创建 js 文件:

window.tools = {};

window.tools.getMouse = element => {
    const mouse = {x: 0, y: 0};
    
    element.addEventListener("mousemove", event => {
        const e = event || window.event;
        let x,y;
        
        if (e.pageX || e.pageY) {
            x = e.pageX;
            y = e.pageY;
        } else {
            x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
            y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
        }
        
        x -= element.offsetLeft;
        y -= element.offsetTop;
        
        mouse.x = x;
        mouse.y = y;
    });
    
    return mouse;
}

const cnv = document.querySelector("#canvas");
const txt = document.querySelector("#txt");
const mouse = tools.getMouse(cnv);

cnv.addEventListener("mousemove", () => {
    txt.innerHTML = `鼠标坐标:(${mouse.x}, ${mouse.y})`;
}, false);