咱们在做页面元素拖动性能的时候会思考到pc端和挪动端的适配,那么pc端咱们用mousedown,mousemove,mouseup组合,挪动端会用到touchstart,touchmove,touchend组合也能动起来,
如果两端兼容,那么咱们能够同时绑定这两种事件来适配。
存在的问题:
1.会保护两套事件,且事件的event对象不一样。
2.如果存在触摸屏存在多种事件的时候,事件可能反复触发
那么还有一个抉择: pointer事件
pointer事件有pointerdown,pointermove,pointerup事件等等(还有别的);同样pointer
事件的event对象pc端和挪动端也是不一样的,也是须要解决一下的。
pointer事件能兼容挪动端和pc端,这样就能只绑定一种事件了。
留神
1.当咱们想挪动一个元素时,咱们要把该元素css款式设置为touch-action:none,不然,pointermove事件会触发3次左右就主动勾销了,前面不执行了,也不会报错。
2.在元素从pointerdown事件到move,还得是原来的元素,你、不能被替换,当初的双向绑定框架会更新dom,挪动过程中该元素就不是原来的元素了。
代码
测试代码
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <title>Document</title> <style> * { margin: 0; } html { height: 100%; } body { height: 100%; overflow: hidden; } div { border: 1px solid; padding: 20px; } #div1 { width: 350px; height: 70px; padding: 10px; border: 1px solid #aaaaaa; } #content { position: relative; height: 200px; width: 100%; background-color: bisque; } #pointer { position: absolute; height: 50px; width: 50px; left: 0; top: 0; background-color: blue; touch-action: none; } </style> </head> <body> <div id="content"> <div id="pointer"></div> </div> <script type="text/javascript"> let pointer = document.querySelector('#pointer') const content = document.querySelector('#content') let startLeft = 0 let startTop = 0 pointer.addEventListener('pointerdown', function (ev) { console.log('down', ev.x, ev.y, ev.isPrimary) startLeft = ev.x startTop = ev.y document.body.addEventListener('pointermove', mousemove) document.body.addEventListener('pointerup', mouseup) document.body.addEventListener('pointercancel', mousecancel) content.removeChild(pointer) pointer = document.createElement('div') pointer.id = "pointer" content.appendChild(pointer) }) function mouseup(ev) { // document.body.removeEventListener('touchmove', mousemove) document.body.removeEventListener('pointermove', mousemove) // pointer.style.left = '0px' // pointer.style.top = '0px' document.body.removeEventListener('pointerup', mouseup) document.body.removeEventListener('pointercancel', mousecancel) } function mousemove(ev) { ev.preventDefault(); console.log('move', ev, pointer) // pointer.style.left = ev.x - startLeft + 'px' // pointer.style.top = ev.y - startTop + 'px' } function mousecancel(ev) { console.log('mousecancel', ev) } </script> </body></html>