拖拽原理问题
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>doc</title>
<style>
body {
height: 500px;
background-color: papayawhip;
}
.to {
position: fixed;
right: 20px;
bottom: 20px;
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
border-radius: 50%;
background-color: #dadada;
color: white;
font-size: 30px;
-webkit-tap-highlight-color: transparent;
}
</style>
</head>
<body>
<a id="to" class="to" href="javascript:;">↑</a>
<script>
var to = document.getElementById('to');
var startPoint = {};
var diffPoint = {};
to.addEventListener('touchstart', function (e) {
startPoint.x = e.changedTouches[0].pageX;
startPoint.y = e.changedTouches[0].pageY;
console.log('start--' + e.changedTouches[0].pageX + ':' + e.changedTouches[0].pageY);
});
to.addEventListener('touchmove', function (e) {
diffPoint.x = e.changedTouches[0].pageX - startPoint.x;
diffPoint.y = e.changedTouches[0].pageY - startPoint.y;
to.style.transform = 'translate3d(' + diffPoint.x + 'px,' + diffPoint.y + 'px,0)';
console.log('move--' + e.changedTouches[0].pageX + ':' + e.changedTouches[0].pageY);
});
to.addEventListener('touchend', function (e) {
startPoint.x = e.changedTouches[0].pageX;
startPoint.y = e.changedTouches[0].pageY;
console.log('end--' + e.changedTouches[0].pageX + ':' + e.changedTouches[0].pageY);
});
</script>
</body>
</html>拖拽简单来讲不就是touchstart事件里求得起始坐标,touchmove事件里求得距离=目标坐标-起始坐标,然后移动这些距离,touchend事件里更新下起始坐标不就行了吗?就像上面的代码一样,但是为啥第二次移动时,明明已更新了startPoint(触发touchend事件更新startPoint为移动后当前的坐标),当触发touchmove事件拖拽的元素会回到最初始的位置(左下角)?
视频中curPoint的作用不理解,难道说是startPoint记录的是移动前的坐标,curPoint记录的是移动后的坐标,当触发touchstart事件时startPoint才更新为当前坐标(也就是curPoint)?
正在回答
同学你好,问题解答如下:
1、translate3d方法设置的是移动距离,也就是从起始位置(第一次)移动后的距离。第一次移动是正确的,第二次移动的时候diffPoint对象值是差值,也就是从第一次结束为止开始移动的差值,并没有加上第一次已经移动过的距离,所以还是从起始位置开始移动的。
2、这样理解是可以的。curPoint对象的作用除了记录每一次移动后的位置,当再一次移动的时候,移动差值+curPoint就是translate3d方法需要设置的值。
自己可以再测试理解下。如果我的回答帮到了你,欢迎采纳,祝学习愉快~
- 参与学习 人
- 提交作业 622 份
- 解答问题 6815 个
微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星