【前端案例】 22 - 案例:移动端拖动元素
2020-12-17 本文已影响0人
itlu
案例演示
![](https://img.haomeiwen.com/i17394504/7dd680ccd8d63f9d.gif)
功能分析
-
touchstart
、touchmove
、touchend
可以实现拖动元素; -
但是拖动元素需要当前手指的坐标值 我们可以使用
targetTouches[0]
里面的pageX
和pageY
; -
移动端拖动的原理: 手指移动中,计算出手指移动的距离。然后用盒子原来的位置 + 手指移动的距离;
-
手指移动的距离: 手指滑动中的位置 减去 手指刚开始触摸的位置。
拖动元素三步曲:
-
触摸元素
touchstart
: 获取手指初始坐标,同时获得盒子原来的位置; -
移动手指
touchmove
: 计算手指的滑动距离,并且移动盒子; -
离开手指
touchend
。
代码实现
div {
position: absolute;
left: 0;
top: 0;
width: 200px;
height: 200px;
background-color: pink;
}
<div></div>
/**
* 1. 触摸元素 touchstart 获取手指初始坐标,同时获得盒子原来的位置
*
* 2. 移动手指 touchmove 计算手指的滑动距离并且移动盒子
*
* 3. 手指离开 touchend
*
* 4. 手指移动也会触发滚动屏幕的事件这里需要阻止其默认的事件 e.preventDefault()
*/
let div = document.querySelector('div');
let startX = 0;
let startY = 0;
let x = 0;
let y = 0;
/**
* 当鼠标触摸屏幕的时候获取到当前鼠标所在初始的位置 和 元素 div 的初始位置
*/
div.addEventListener('touchstart', (e) => {
startX = e.targetTouches[0].pageX;
startY = e.targetTouches[0].pageY;
x = div.offsetLeft;
y = div.offsetTop;
})
/**
* 当鼠标移动的时候 需要获取到当前鼠标的位置 计算出鼠标初始位置到当前位置移动的坐标
*/
div.addEventListener('touchmove', (e) => {
let moveX = e.targetTouches[0].pageX - startX;
let moveY = e.targetTouches[0].pageY - startY;
// 移动盒子
div.style.left = x + moveX + 'px';
div.style.top = y + moveY + 'px';
// 禁用默认的屏幕滚动事件
e.preventDefault();
})