在没有鼠标移动事件的情况下跟踪鼠标的相对位置
Tracking relative mouse position without a mousemove event
我需要跟踪鼠标相对于应用程序中<canvas>
元素的位置。目前,我在<canvas>
上附加了一个mousemove
事件侦听器,每当它启动时,它都会更新我的鼠标位置,在可用时使用offsetX
/offsetY
,在offsetX/Y
不可用时使用layerX
/layerY
。使用offsetX/Y
或layerX/Y
可以得到相对于<canvas>
的鼠标坐标,这正是我想要的。随着我的应用程序发挥其魔力,各种CSS三维转换被应用于<canvas>
,即使<canvas>
经过了非常大的转换,offsetX/Y
仍然在<canvas>
的局部转换坐标空间中为我提供了准确的坐标。
这有点令人困惑,所以我试着举一个例子。如果我的<canvas>
的宽度和高度都是100px,并且相对于浏览器视口位于(0,0),并且我单击(50,50)(在视口坐标中),这对应于<canvas>
中的(50,50),50是通过offsetX
和offsetY
(正确)返回的值。如果我将transform: translate3d(20px,20px,0px)
应用于我的<canvas>
,并单击(50,50)(在视口坐标中),由于我的画布已向下移动了20像素,向右移动了20个像素,这实际上对应于相对于<canvas>
的(30,30),30是通过offsetX
和offsetY
(正确)返回的值。
我面临的问题是,当用户没有实际移动鼠标,但<canvas>
正在转换时,该怎么办。我只是在mousemove
事件上更新鼠标的位置,那么当没有mousemove
时该怎么办?
例如。我的鼠标位于(50,50),并且没有对<canvas>
应用任何变换。我的this.mouseX
和this.mouseY
都等于50;当我将鼠标移动到(50,50)时,它们在最后的mousemove
事件中被保存。在完全不移动鼠标的情况下,我将上述转换(transform: translate3d(20px,20px,0px)
)应用于我的<canvas>
。现在,我需要this.mouseX
和this.mouseY
分别等于30,因为这是我的鼠标相对于<canvas>
的当前变换的新位置。但CCD_ 37和CCD_。由于我从未移动过鼠标,因此没有触发mousemove
事件,并且那些保存的coords也从未更新过。
我该怎么处理?我想过创建一个新的jQuery事件,根据我以前/以前的鼠标位置手动分配一些属性(pageX
和pageY
?),然后触发该事件,但我不认为这会导致浏览器重新计算offsetX
和offsetY
属性。我也一直在考虑取已知的旧/以前的鼠标位置,并将其乘以我的变换矩阵,但这会变得非常复杂,因为我的鼠标坐标在二维空间中,但我应用于<canvas>
的变换都是三维变换。
我想真的,我想做的是取我已知的二维页面位置,并将其光线投射到三维空间中,找出我在哪里找到转换后的<canvas>
,所有这些都是javascript(jQuery可用)。
这可能吗?这有道理吗?
适用于所有浏览器
var mouseX=0;
var mouseY=0;
var canvas = document.querySelector('#canvas');
var rect = canvas.getBoundingClientRect();
document.onmousemove = function(e) {
mouseX=e.clientX-rect.left;
mouseY=e.clientY-rect.top;
};
function updateCoords() {
mouseX=e.clientX-mouseX;
mouseY=e.clientY-mouseY;
setTimeout(updatecoords,10);
}
现在我们可以调用updateCoords()
函数一次,反复检查新位置。
updateCoords();
你可以在updateCoords()
函数中添加你的代码,它将每10毫秒执行一次
概念:mouseX
和mouseY
变量在mousemove
事件中更新,也在画布位置发生任何变化时更新。
即使不移动鼠标,看起来也要刷新鼠标位置值。你应该试试这样的东西:
var event = '';
var counter = 1;
$(function(e){
event = e;
window.setInterval(refresh, 10);
});
$(document).mousemove(function(e){
event = e;
refresh;
});
function refresh(){
counter++;
$('#mousepos').val("event.pageX: " + event.pageX + ", event.pageY: " + event.pageY + ", counter: " + counter)
}
计数器只是用于刷新的可视化。您可以将间隔设置为所需的一切(10=10ms=0.01s)。只需将.mousemove()事件中的所有内容移动到此refresh()函数中,并正确调用它,即使您不移动鼠标,您的鼠标位置也应该更新。
看看这把小提琴的生活例子:http://jsfiddle.net/82cmxw8L/1
编辑:
因为我的小提琴不适合询问者,我更新了它:http://jsfiddle.net/82cmxw8L/8/
新的是,鼠标位置现在每0.1秒设置一次,而不是只在鼠标移动时更新。
- jQuery悬停在没有鼠标悬停的情况下启动
- Javascript如何在不使用画布的情况下获取鼠标位置
- html输入获胜't在不按住鼠标左键的情况下进行输入
- 我想在不使用额外插件的情况下使用鼠标拖动来创建图像滑块
- 在不影响布局的情况下降低鼠标悬停元素周围的灵敏度的简单方法是什么
- 在没有 jQuery 移动版的情况下在移动设备上使用鼠标关闭事件
- 是否可以在不中断单击事件的情况下对子级鼠标按下重新排序
- 在没有鼠标的情况下暂停 HTML 选框的最有效方法
- 如何在没有 CSS 的情况下将鼠标悬停在标题上时使缩略图消失
- 如何在不悬停元素的情况下使用 javascript 更改鼠标光标
- 织物.js - 在不按住鼠标按钮的情况下移动对象
- jQuery UI-在没有鼠标干预的情况下将Resizable()动画应用于块元素
- 如何在没有JQuery的情况下使用JavaScript正确获取鼠标坐标
- 在不更改鼠标位置的情况下从JS执行mouseover()
- 在没有鼠标移动事件的情况下跟踪鼠标的相对位置
- Javascript:在没有Jquery或插件的情况下放大鼠标悬停
- Dart HTML-在不释放鼠标按钮的情况下更改输入范围
- 如何在不丢失鼠标行为的情况下使用DIV覆盖层
- 如何在按住鼠标左键的情况下获取鼠标位置以在web中选择和拖动文本
- 在嵌入表的情况下,删除鼠标悬停事件问题