pc 端与移动端区分点击与拖拽事件

pc 端与移动端区分点击与拖拽事件


在 html 的应用中,拖拽事件为 mousedown -> mousemove -> mouseup 三个事件组成,在一个有拖拽事件的 div 中监听一个 click 事件,当拖拽之后也会出发 click 事件,为了不让拖拽事件影响到点击事件,需要区分点击事件和拖拽事件

PC 端

  • 示例代码
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1.0">
	    <title>Click</title>
	    <style>
	        #container {
	            width: 500px;
	            height: 500px;
	            background-color: aqua;
	        }
	    </style>
	</head>
	<body>
	    <div id="container"></div>
	    <script>
	        const container = document.getElementById('container');
	        container.addEventListener('mousedown', (event) => {
	            console.log('mousedown event is', event)
	        })
	        container.addEventListener('mouseup', (event) => {
	            console.log('mouseup event is', event)
	        })
	    </script>
	</body>
	</html>

当点击时,可以查看打印信息

  1. 点击时的打印信息
    在这里插入图片描述
    在这里插入图片描述
  2. 拖拽后的打印信息
    在这里插入图片描述
    在这里插入图片描述

可以看出点击后的 mousedown 和 mouseup 的 MouseEvent 的 clientX 与 clientY 的值是相等的,而拖拽后的 clientX 与 clientY 的值不同,故可以通过判断 clientX 和 clientY 的值来判断点击事件或者拖拽事件,修改后的代码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Click</title>
    <style>
        #container {
            width: 500px;
            height: 500px;
            background-color: aqua;
        }
    </style>
</head>
<body>
    <div id="container"></div>
    <script>
        const clientOffset = {};
        const container = document.getElementById('container');
        container.addEventListener('mousedown', (event) => {
            clientOffset.clientX = event.clientX;
            clientOffset.clientY = event.clientY;
        })
        container.addEventListener('mouseup', (event) => {
            const clientX = event.clientX;
            const clientY = event.clientY;
            if (clientX === clientOffset.clientX && clientY === clientOffset.clientY) {
                console.log('click');
            } else {
                console.log('drag');
            }
        })
    </script>
</body>
</html>

移动端

在移动端中,点击以及拖拽时没有 mousedown 和 mouseup 事件,所以我们需要使用移动端的事件,移动端的事件如下

事件作用与 pc 端对应
touchstart手指按倒屏幕上mousedown
touchmove手指在屏幕上滑动mousemove
touchend手指离开屏幕mouseup
touchcancle特殊情况下关闭/退出时触发-

所以我们需要使用 touchstart 和 touchend 来代替 mousedown 和 mouseup,并且 TouchEvent 接口的点击位置在 event.changeTouches 列表中记录,所以取 clientOffset 值的时候需要从 changeTouches 列表中取值

在这里插入图片描述

  • 示例代码
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1.0">
	    <title>Click</title>
	    <style>
	        #container {
	            width: 200px;
	            height: 200px;
	            background-color: aqua;
	        }
	    </style>
	</head>
	<body>
	    <div id="container"></div>
	    <script>
	        const clientOffset = {};
	        const container = document.getElementById('container');
	        container.addEventListener('touchstart', (event) => {
	            clientOffset.clientX = event.changedTouches[0].clientX;
	            clientOffset.clientY = event.changedTouches[0].clientY;
	        })
	        container.addEventListener('touchend', (event) => {
	            const clientX = event.changedTouches[0].clientX;
	            const clientY = event.changedTouches[0].clientY;
	            if (clientX === clientOffset.clientX && clientY === clientOffset.clientY) {
	                console.log('click');
	            } else {
	                console.log('drag');
	            }
	        })
	    </script>
	</body>
	</html>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现移动端canvas的缩放与拖拽平移可以通过以下步骤实现: 1. 监听手势事件,例如touchstart、touchmove、touchend等。 2. 在touchstart事件中记录手指的起始位置,以及canvas的起始位置和尺寸。 3. 在touchmove事件中计算手指移动的距离,根据距离改变canvas的尺寸或位置,从而实现缩放和平移。 4. 在touchend事件中记录canvas的最终位置和尺寸。 下面是一个简单的示例代码,实现了canvas的缩放和平移: ```javascript var canvas = document.getElementById('myCanvas'); var context = canvas.getContext('2d'); var lastX, lastY, startX, startY, startWidth, startHeight; var isDragging = false, isScaling = false; canvas.addEventListener('touchstart', function(e) { var touch = e.touches[0]; lastX = startX = touch.clientX; lastY = startY = touch.clientY; startWidth = canvas.width; startHeight = canvas.height; isDragging = true; }); canvas.addEventListener('touchmove', function(e) { var touch = e.touches[0]; if (e.touches.length == 1 && isDragging) { var deltaX = touch.clientX - lastX; var deltaY = touch.clientY - lastY; canvas.style.left = (startX + deltaX) + 'px'; canvas.style.top = (startY + deltaY) + 'px'; } else if (e.touches.length == 2) { isDragging = false; var touch1 = e.touches[0]; var touch2 = e.touches[1]; var dist = Math.sqrt(Math.pow(touch1.clientX - touch2.clientX, 2) + Math.pow(touch1.clientY - touch2.clientY, 2)); if (!isScaling) { isScaling = true; startWidth = canvas.width; startHeight = canvas.height; } var scale = dist / Math.sqrt(Math.pow(lastX - lastY, 2) + Math.pow(touch1.clientY - touch2.clientY, 2)); canvas.width = startWidth * scale; canvas.height = startHeight * scale; } lastX = touch.clientX; lastY = touch.clientY; }); canvas.addEventListener('touchend', function(e) { isDragging = false; isScaling = false; }); ``` 这段代码中,我们监听了canvas的touchstart、touchmove和touchend事件,用于实现canvas的缩放和平移。在touchstart事件中记录了手指的起始位置和canvas的起始尺寸和位置,在touchmove事件中计算手指移动的距离,并根据距离改变canvas的尺寸和位置,从而实现缩放和平移。在touchend事件中记录canvas的最终位置和尺寸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值