移动端长按事件的使用与应用

在移动端开发中,长按事件是常见的一种交互方式,可以实现长按操作触发特定的功能,例如复制、粘贴、删除等。本文将从多个方面对移动端长按事件进行详细阐述。

一、移动端长按事件与松开

长按事件分为两个部分,一个是按下的瞬间触发的事件,另一个是长按一定时间之后触发的事件。一般情况下,长按一定时间之后会弹出一个选项框,其中包含了很多操作,例如复制、粘贴、删除等。

document.getElementById('btn').addEventListener('touchstart', function (e) {
  // 长按
  this.timer = setTimeout(function () {
    console.log('长按事件触发了')
  }, 1000)
})

document.getElementById('btn').addEventListener('touchend', function (e) {
  // 松开
  clearTimeout(this.timer)
})

上面的代码是一个简单的长按事件的示例,通过设置一个定时器,在长按一定时间后触发长按事件功能,并在松开时清除定时器。其中,timer 为一个全局变量,要在松开的时候清除,避免定时器依旧运行。

二、移动端事件有哪些

除了长按事件,移动端还有很多其他操作方式的事件。

1. 点击事件

单次点击触发的事件,用于实现类似于网页中的点击跳转等功能。

document.getElementById('btn').addEventListener('click', function(){
    console.log('点击事件触发了')
})

2. 双击事件

快速两次点击触发的事件,用于实现类似于网页中的放大、缩小等功能。

document.getElementById('btn').addEventListener('dblclick', function(){
    console.log('双击事件触发了')
})

3. 滑动事件

手指在屏幕上滑动时触发的事件,用于实现类似于轮播图、画廊等功能。

document.getElementById('btn').addEventListener('touchmove', function(){
    console.log('滑动事件触发了')
})

4. 手势事件

手指在屏幕上做出的各种手势,例如旋转、捏合、拖拽等。

document.getElementById('btn').addEventListener('gesturestart', function(){
    console.log('手势开始事件触发了')
})
document.getElementById('btn').addEventListener('gesturechange', function(){
    console.log('手势变化事件触发了')
})
document.getElementById('btn').addEventListener('gestureend', function(){
    console.log('手势结束事件触发了')
})

三、移动端长按事件弹出复制按钮插件

移动端长按事件弹出复制按钮插件是一个很常见的需求,可以通过自定义一个长按事件触发复制框,并将选中的文本复制到剪贴板中实现。下面是一个例子:

function longPress(element, copyBtn) {
  let initX
  let initY
  let timer = null
  const MIN_DISTANCE = 10
  element.addEventListener('touchstart', (e) => {
    if (e.touches.length > 1) {
      return
    }
    initX = e.changedTouches[0].clientX
    initY = e.changedTouches[0].clientY
    timer = setTimeout(() => {
      copyBtn.show(element)
    }, 800)
  })
  element.addEventListener('touchmove', (e) => {
    const moveX = e.changedTouches[0].clientX
    const moveY = e.changedTouches[0].clientY
    if (Math.abs(moveX - initX) > MIN_DISTANCE || Math.abs(moveY - initY) > MIN_DISTANCE) {
      clearTimeout(timer)
      timer = null
      copyBtn.hide()
    }
  })
  element.addEventListener('touchend', () => {
    clearTimeout(timer)
    timer = null
    copyBtn.hide()
  })
}

上面的代码中定义了一个长按事件函数,可以通过监听 touchstart、touchmove、touchend 事件实现长按操作。其中 copyBtn 表示长按弹出框,可以通过该对象的 show()、hide() 方法实现显示和隐藏操作。在长按一定时间后显示弹出框,在移动操作或者松开时隐藏弹出框。

四、JS移动端事件

移动端与 PC 端的事件略有不同,移动端使用的事件更加丰富多彩,下面对 JS 移动端事件进行一些简单的介绍。

1. 触摸事件

触摸事件是移动端最基本的事件之一,其包含了如下 4 种事件:

  • touchstart:手指放在屏幕上时触发
  • touchmove:手指在屏幕上滑动时触发
  • touchend:手指离开屏幕时触发
  • touchcancel:触摸被中断时触发

2. 手势事件

手势事件是移动端的特色事件之一,既包含了触摸事件的三种基本事件,还包含了以下几种事件:

  • gesturestart:多个手指触摸屏幕时触发
  • gesturechange:多个手指在屏幕上移动时触发
  • gestureend:多个手指离开屏幕时触发

3. 加速度事件

加速度事件是移动设备上的硬件事件,用于检测设备的运动状态和倾斜状态。

window.addEventListener('devicemotion', function(event) {
  console.log(event.acceleration.x)
})

五、移动端手势事件

手势事件是移动端常见的一种事件,包含了各种手势,例如旋转、捏合、拖拽等。

1. 捏合手势

捏合手势是通过多指触摸实现的,用于实现类似于放大或缩小的操作。

let zoom = 1
let lastScale = 1
let scale = 1
let posX = 0
let posY = 0
let obj = document.getElementById('obj')
obj.addEventListener('gesturestart', function(event) {
    lastScale = scale
})

obj.addEventListener('gesturechange', function(event) {
    scale = lastScale * event.scale
    obj.style.transform = 'scale(' + scale + ') translate(' + posX + 'px,' + posY + 'px)'
})

obj.addEventListener('gestureend', function(event) {
    lastScale = scale
})

2. 旋转手势

旋转手势通过多指触摸实现,用于实现类似于旋转的操作。

let lastDegree = 0
let degree = 0
obj.addEventListener('gesturestart', function(event) {
    lastDegree = degree
})

obj.addEventListener('gesturechange', function(event) {
    degree = lastDegree + event.rotation
    obj.style.transform = 'rotate(' + degree + 'deg) translate(' + posX + 'px,' + posY + 'px)'
})

3. 拖拽手势

拖拽手势通过单指触摸实现,用于实现类似于拖拽的操作。

let startX = 0
let startY = 0
let offsetLeft = 0
let offsetTop = 0
obj.addEventListener('touchstart', function(event) {
    startX = event.touches[0].clientX
    startY = event.touches[0].clientY
    offsetLeft = obj.offsetLeft
    offsetTop = obj.offsetTop
})

obj.addEventListener('touchmove', function(event) {
    let x = event.changedTouches[0].clientX - startX + offsetLeft
    let y = event.changedTouches[0].clientY - startY + offsetTop
    obj.style.left = x + 'px'
    obj.style.top = y + 'px'
})

六、移动端 hover 事件

在 PC 端中,常见的交互方式之一就是鼠标 hover 事件,但这个事件在移动端中并不存在。但通过模拟 hover 事件,我们仍然可以在移动端中实现类似于 hover 的效果。

document.getElementById('btn').addEventListener('touchstart', function(e) {
  this.classList.add('hover')
})

document.getElementById('btn').addEventListener('touchmove', function(e) {
  const rect = this.getBoundingClientRect()
  if (e.touches[0].clientX  rect.right || e.touches[0].clientY  rect.bottom) {
    this.classList.remove('hover')
  }
})

document.getElementById('btn').addEventListener('touchend', function(e) {
  this.classList.remove('hover')
})

通过添加和移除 class 属性,来模拟 hover 事件。当手指滑出按钮范围时,移除 hover 效果。

七、移动端拖拽事件

在移动端中,通过拖拽来实现交互,也是非常常见的一种方式。下面是一个简单的实现方法:

let dragItem = null
let currentX = 0
let currentY = 0
let initialX = 0
let initialY = 0
let xOffset = 0
let yOffset = 0

document.addEventListener('touchstart', dragStart)
document.addEventListener('touchend', dragEnd)
document.addEventListener('touchmove', drag)

function dragStart(e) {
  dragItem = e.target
  initialX = e.touches[0].clientX - xOffset
  initialY = e.touches[0].clientY - yOffset
}

function dragEnd(e) {
  initialX = currentX
  initialY = currentY
  dragItem = null
}

function drag(e) {
  if (dragItem !== null) {
    e.preventDefault()
    currentX = e.touches[0].clientX - initialX
    currentY = e.touches[0].clientY - initialY

    xOffset = currentX
    yOffset = currentY

    setTranslate(currentX, currentY, dragItem)
  }
}

function setTranslate(xPos, yPos, el) {
  el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)"
}

通过监听 touchstart、touchend、touchmove 事件,在 touchmove 事件中实时更新元素位置的坐标,设置 translate 值来实现拖拽效果。

八、移动端双击事件

移动端双击事件在实现缩放等操作时非常实用,下面是一个简单的双击事件实现方法:

let before = null
let lastTap = null
let currentScale = 1

obj.addEventListener('touchstart', function(event) {
  const now = Date.now()
  const delta = now - before
  const tap = event.touches[0].clientX + ',' + event.touches[0].clientY
  const doubleTap = lastTap && delta < 300 && tap === lastTap
  if (doubleTap) {
    currentScale = currentScale === 1 ? 2 : 1
    setScale(currentScale)
  }
  lastTap = tap
  before = now
})

function setScale(scale) {
  obj.style.transform = 'scale(' + scale + ') translate(' + posX + 'px,' + posY + 'px)'
}

通过设置一个 before 变量来记录前一次点击的时间戳,通过计算两次点击的时间差,来判断是否

原创文章,作者:NNII,如若转载,请注明出处:https://www.506064.com/n/143739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NNIINNII
上一篇 2024-10-24 15:25
下一篇 2024-10-24 15:25

相关推荐

  • 抖音外放亲妈下葬事件的背后真相

    近期,一段抖音外放亲妈下葬的视频引发广泛关注和热议。不少人对这个事件感到震惊和愤怒,认为这种行为非常不尊重亲人,触犯了社会公德和家庭道德。但是,事情真相到底是什么呢?我们有必要从多…

    编程 2025-04-28
  • cc.director.on事件监听器

    本文将从多个方面详细介绍Cocos Creator中的cc.director.on事件监听器。 一、cc.director.on的作用和用法 cc.director.on是Coco…

    编程 2025-04-27
  • JavaScript点击事件全方位指南

    一、click事件基础 click事件是最常用的鼠标事件之一,当元素被单击时触发。click事件适用于大多数HTML元素(<a>、<button>)和SVG…

    编程 2025-04-25
  • 探究keyup和keydown事件

    一、介绍 在前端开发中,代码执行通常与用户操作有关。用户操作中,常用的是键盘事件,其中keydown和keyup事件是最为常见的两种。这两种事件都可以用来监测用户按键,但它们有不同…

    编程 2025-04-25
  • 详解JavaScript onclick事件

    一、onclick的基础知识 onclick事件是JavaScript中最常用的事件之一,它在用户点击某个HTML元素时触发。通常我们可以通过给元素添加一个onclick属性来绑定…

    编程 2025-04-25
  • CSS 事件穿透

    在 Web 开发中,CSS 负责网页的样式,而 JavaScript 负责网页的行为。虽然两者有不同的职责,但在实际的开发过程中,我们经常会遇到将二者结合起来的场景。比如需要通过 …

    编程 2025-04-25
  • onclick事件详解

    实现交互功能是Web开发的重要部分,而onclick事件就是其中一个最常用的交互事件之一。在本文中,我们将从多个角度对onclick事件进行详细阐述。 一、使用onclick事件实…

    编程 2025-04-24
  • 事件驱动模型

    一、事件驱动模型一般分为几部分 事件驱动模型一般分为三部分: 1.事件源 2.事件对象 3.事件监听器 事件源是指事件发起的对象,事件对象是指事件的具体内容,事件监听器是用于处理事…

    编程 2025-04-24
  • Vue中的鼠标悬停事件Vue.onmouseover

    一、简介 Vue建立在响应式和组件化的概念之上,并且包含许多内置的指令,其中就包含了v-on指令。v-on指令是Vue中非常重要的一个指令,用于绑定事件,并且它能够根据事件类型,自…

    编程 2025-04-24
  • EL-Button 点击事件全方位解析

    一、基本概念 EL-Button 是饿了么 UI 组件库中的一个按钮组件,具有多种类型和样式。 二、点击事件绑定 为 EL-Button 组件绑定点击事件,可以使用 v-on 指令…

    编程 2025-04-23

发表回复

登录后才能评论