【发布时间】:2020-11-18 22:30:34
【问题描述】:
我的屏幕上有一个固定窗口,我希望用户能够在屏幕上拖动它。虽然我已将它设置为适用于鼠标输入,但我很难让它适用于触摸屏。
所以我有一个像这样的基本盒子:
<div id="smallavatar" class="smallbox">
</div>
紧随其后的是这个JS(注意前半部分是针对点击事件的)
var divOverlay = document.getElementById ("smallavatar");
var isDown = false;
divOverlay.addEventListener('mousedown', function(e) {
isDown = true;
}, true);
document.addEventListener('mouseup', function() {
isDown = false;
}, true);
document.addEventListener('mousemove', function(event) {
event.preventDefault();
if (isDown) {
var deltaX = event.movementX;
var deltaY = event.movementY;
var rect = divOverlay.getBoundingClientRect();
divOverlay.style.left = rect.x + deltaX + 'px';
divOverlay.style.top = rect.y + deltaY + 'px';
}
}, true);
divOverlay.addEventListener('touchstart', e => {
clientX = e.touches[0].screenX;
clientY = e.touches[0].screenY;
});
divOverlay.addEventListener('touchmove', e => {
let x = divOverlay.style.left;
let y = divOverlay.style.top;
// Compute the change in X and Y coordinates.
// The first touch point in the changedTouches
// list is the touch point that was just removed from the surface.
deltaX = e.changedTouches[0].clientX - clientX;
deltaY = e.changedTouches[0].clientY - clientY;
divOverlay.style.left = divOverlay.style.left + deltaX;
divOverlay.style.top = divOverlay.style.top + deltaY;
});
最后使用了以下 CSS:
.smallbox{position:fixed; bottom:70px; right:0; width:360px; height:400px; z-index:20;}
现在虽然 touchmove 事件确实有效,但问题是盒子似乎很快就飞离了屏幕。这个想法应该是我试图在触摸事件开始之前获取 div 使用的位置,然后计算出在 touchmove 事件中发生了多少移动,然后用新的值更新 left 和 top 值它应该在的位置。
有什么错误可以解释为什么这不能按预期工作吗?
【问题讨论】:
标签: javascript html jquery css touch-event