博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取鼠标位置和手机触摸点位置
阅读量:6237 次
发布时间:2019-06-22

本文共 3067 字,大约阅读时间需要 10 分钟。

思路

获取鼠标位置和手机触摸位置的思路都是相同的:

1.是否可以获取到pageX和pageY,有直接取值
2.没有,获取clientX和clientY,这个值在不翻页的情况下是正确位置,如果翻页了还需要加上scrollLeft和scrollTop
3.减去offsetLeft和offetTop

获取鼠标和触摸事件的区别

1.鼠标光标会一直停留在屏幕上,而手指会从设备上按下、移动以及释放,所以某些时刻光标会从屏幕上消失(这就是为什么鼠标时间x,y的初始值是0,而触摸事件的初始值是null。而且需要在触摸和离开时改变状态)

2.不存在和mouseover(当鼠标指针位于元素上方时,会发生 mouseover 事件)等效的触摸事件,要么发生了一次触摸事件要么没发生,不存在手指悬停在触摸屏上的概念
3.同一时间可能发生多点触摸。某个触摸点的信息会保存在触摸事件的一个数组中。(代码中取event.touches[0]取第一个触摸点)

用到的监听事件

鼠标

  • mousemove

触摸

  • touchstart
  • touchmove
  • touchend

获取鼠标位置方法

function captureMouse(element) {        let mouse = {
x: 0, y: 0, event: null}, body_scrollLeft = document.body.scrollLeft,//见说明2 body_scrollTop = document.body.scrollTop, element_scrollLeft = document.documentElement.scrollLeft, element_scrollTop = document.documentElement.scrollTop, offsetLeft = element.offsetLeft,//见说明3 offsetTop = element.offsetTop; element.addEventListener('mousemove', function (event) { let x, y; if (event.pageX || event.pageY) {
//见说明1 x = event.pageX; y = event.pageY; } else { x = event.clientX + (body_scrollLeft || element_scrollLeft);//见说明4 y = event.clientY + (body_scrollTop || element_scrollTop); } x -= offsetLeft; y -= offsetTop; mouse.x = x; mouse.y = y; }, false); return mouse; }复制代码

说明

1.因为不是所有浏览器都支持pageX和pageY所以有步骤2

2.scrollLeft和scrollTop具体概念可以自行百度,简单说就是划出屏幕的偏移量
3.offsetLeft和offetTop具体概念可以自行百度,简单说就是当前容器距离整个文档的偏移量
4.scrollLet和scrollTop使用两种获取方式原因:
document.body.scrollTop在xhtml标准网页或者更简单的说是带标签的页面里得到的结果是0
在xhtml页面获得body的坐标使用document.documentElement来取代document.body

获取触摸事件位置方法

function captureTouch(element) {        let touch = {
x: null, y: null, isPressed: false}, offsetLeft = element.offsetLeft, offsetTop = element.offsetTop; element.addEventListener('touchstart', function (event) { touch.isPressed = true; }, false); element.addEventListener('touchend', function (event) { touch.x = null; touch.y = null; touch.isPressed = false; }, false); element.addEventListener('touchmove', function (event) { let x, y, touch_event = event.touches[0]; if (touch_event.pageX || touch_event.pageY) { x = touch_event.pageX; y = touch_event.pageY; } else { x = touch_event.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft); y = touch_event.clientY + (document.body.scrollTop || document.documentElement.scrollTop); } x -= offsetLeft; y -= offsetTop; touch.x = x; touch.y = y; }, false); return touch; }复制代码

说明

1.xy初始值为null和设置isPressed(是否触摸)属性原因参考"获取鼠标和触摸事件的区别"第一条

2.在访问x,y属性之前务必确保此时有触摸点按下,否则,他们的值将为null,影响后续操作

参考书籍

1.html5+javascript动画基础

2.javascript高级程序设计(第三版)

转载于:https://juejin.im/post/5bdae1e26fb9a0225063a76d

你可能感兴趣的文章
MySQL索引背后的数据结构及算法原理
查看>>
Eclipse SVN的更新地址是
查看>>
Intel XDK 跨平台 App 开发初体验
查看>>
Windows 下msvc2010编译 NSIS 2.46
查看>>
第三方授权登录(微博篇)
查看>>
苹果App Store审核指南中文翻译(2014.9.1更新)
查看>>
如何复制一个LIST
查看>>
说说我为什么看好Spring Cloud Alibaba
查看>>
RecyclerView 差异更新(diff)
查看>>
Android之ActionBar学习
查看>>
对于法线贴图的深入研究
查看>>
Linux操作
查看>>
并发编程之Operation Queue和GCD
查看>>
perl命令行批量修改文件内容
查看>>
zk服务器的构成,一个请求是如何处理的
查看>>
Webpack使用nodemon实时打包编译
查看>>
趣图:测试的时候一切ok,真正上线的时候……
查看>>
1:三维场景浏览
查看>>
文件的“打开”和“关闭”操作
查看>>
PlayScala 2.5.x - 关于Content-Type的注意事项
查看>>