移动端滑动事件详解

一、移动端滑动事件穿透

在移动端上,如果有一个滑动组件,例如轮播图组件,当滑动该组件时,很可能会触发下方的其他组件的点击事件。这种情况称为滑动事件穿透。

为了解决这个问题,我们可以使用CSS属性pointer-events来禁止下方组件的点击事件,代码如下:

overflow: hidden;
pointer-events: none; 

二、移动端的滑动事件

在移动端上,有以下几种滑动事件:

  • touchstart:手指触摸事件。
  • touchmove:手指滑动事件。
  • touchend:手指离开事件。

我们可以使用这几个事件来实现一些有趣的效果。例如,在touchstart事件中记录手指的位置,在touchmove事件中计算手指的移动距离,并根据移动距离移动UI组件。代码如下:

var startX, startY;
element.addEventListener('touchstart', function(e) {
  startX = e.touches[0].pageX;
  startY = e.touches[0].pageY;
}, false);
element.addEventListener('touchmove', function(e) {
  var distanceX = e.touches[0].pageX - startX;
  var distanceY = e.touches[0].pageY - startY;
  // 在这里根据distanceX和distanceY移动UI组件
}, false);

三、js移动端滑动事件

除了原生的touch事件,我们也可以使用一些封装过的javascript插件,例如iScroll、Swiper等来实现一些常见的滑动效果。这些插件通常具有更加灵活的配置项和更好的浏览器兼容性。

以Swiper为例,我们可以使用以下代码来初始化一个轮播图:

var mySwiper = new Swiper('.swiper-container', {
  direction: 'horizontal',
  loop: true,
  slidesPerView: 'auto',
  centeredSlides: true,
  spaceBetween: 10,
});

四、移动端滑动触发了点击事件

在移动端上,如果手指在滑动过程中触及了某个UI组件,并且手指离开时没有达到滑动的最小距离,那么就会触发这个UI组件的点击事件。

我们可以通过以下代码来禁止这种行为:

var preventDefault = function(e){ 
  e.preventDefault(); 
}; 
// 禁止touchmove事件的默认行为 
document.addEventListener('touchmove', preventDefault, {passive: false}); 
// 解除禁止 
document.removeEventListener('touchmove', preventDefault, {passive: false}); 

五、移动端左右滑动

在移动端上,左右滑动常见于轮播图、横向列表等,我们可以使用touch事件来实现这种效果。

例如,在touch事件中,我们可以记录手指落下和抬起时的位置,并根据它们来计算出滑动的距离和方向,然后移动UI组件即可。对于横向列表,我们可以根据手指滑动的距离来计算出列表应该移动的距离。代码如下:

var startX, startY;
element.addEventListener('touchstart', function(e) {
  startX = e.touches[0].pageX;
  startY = e.touches[0].pageY;
}, false);
element.addEventListener('touchmove', function(e) {
  var distanceX = e.touches[0].pageX - startX;
  var distanceY = e.touches[0].pageY - startY;
  if(Math.abs(distanceY) < Math.abs(distanceX)) {
    // 左右滑动
    e.preventDefault(); // 防止触发了穿透事件
    // 在这里根据distanceX移动UI组件
  }
}, false);

六、移动端上下滑动事件

在移动端上,上下滑动通常用于滚动条、下拉刷新等场景。我们可以使用原生的touch事件和CSS属性来实现这些效果。

例如,在touch事件中,我们可以记录手指落下和抬起时的位置,并根据它们来计算出滑动的距离和方向,然后移动UI组件即可。对于滚动条,我们可以使用CSS的overflow-x和overflow-y来禁止或开启横向和纵向的滚动条。代码如下:

var startX, startY;
element.addEventListener('touchstart', function(e) {
  startX = e.touches[0].pageX;
  startY = e.touches[0].pageY;
}, false);
element.addEventListener('touchmove', function(e) {
  var distanceX = e.touches[0].pageX - startX;
  var distanceY = e.touches[0].pageY - startY;
  if(Math.abs(distanceY) > Math.abs(distanceX)) {
    // 上下滑动
    e.preventDefault(); // 防止触发了穿透事件
    // 在这里根据distanceY移动UI组件
  }
}, false);

七、移动端滚动条事件

在移动端上,滚动条的滑动和PC端有所不同。我们可以使用原生的touch事件来模拟滚动条的滑动,并根据滑动的距离来计算出列表应该移动的距离。代码如下:

var startX, startY, offsetY;
var scrollContainer = document.querySelector('.scroll-container');
var content = document.querySelector('.content');
scrollContainer.addEventListener('touchstart', function(e) {
  startY = e.touches[0].pageY;
  offsetY = content.offsetTop;
}, false);
scrollContainer.addEventListener('touchmove', function(e) {
  var distanceY = e.touches[0].pageY - startY;
  content.style.top = offsetY + distanceY + 'px';
}, false);

八、移动端左滑右滑事件

在移动端上,我们也可以实现左滑右滑的效果,常见的场景有类似微信的左滑删除和滑动导航栏。我们可以使用touch事件来实现这些效果。

例如,在touch事件中,我们可以记录手指落下和抬起时的位置,并根据它们来计算出滑动的距离和方向,然后移动UI组件即可。对于滑动导航栏,我们可以根据手指滑动的距离来计算出导航栏应该移动的距离。代码如下:

var startX, startY, offsetX;
var navBar = document.querySelector('.nav-bar');
var navItems = navBar.children;
var currentIndex = 0;
navBar.addEventListener('touchstart', function(e) {
  startX = e.touches[0].pageX;
  offsetY = navItems[0].offsetLeft;
}, false);
navBar.addEventListener('touchmove', function(e) {
  var distanceX = e.touches[0].pageX - startX;
  if(distanceX > 0 && currentIndex > 0) {
    // 右滑
    e.preventDefault(); // 防止触发了穿透事件
    // 在这里根据distanceX移动UI组件
  } else if(distanceX < 0 && currentIndex < navItems.length - 1) {
    // 左滑
    e.preventDefault(); // 防止触发了穿透事件
    // 在这里根据distanceX移动UI组件
  }
}, false);

九、移动端左右滑动导航栏

在移动端上,左右滑动导航栏常见于类似微信的多个tab页面之间的切换。我们可以使用touch事件来实现这种效果。

例如,在touch事件中,我们可以记录手指落下和抬起时的位置,并根据它们来计算出滑动的距离和方向,然后移动UI组件即可。对于导航栏,我们可以根据手指滑动的距离来计算出导航栏应该移动的距离。代码如下:

var startX, startY, offsetX;
var header = document.querySelector('.header');
var tabs = header.children;
var currentIndex = 0;
header.addEventListener('touchstart', function(e) {
  startX = e.touches[0].pageX;
  offsetY = tabs[0].offsetLeft;
}, false);
header.addEventListener('touchmove', function(e) {
  var distanceX = e.touches[0].pageX - startX;
  if(distanceX > 0 && currentIndex > 0) {
    // 右滑
    e.preventDefault(); // 防止触发了穿透事件
    // 在这里根据distanceX移动UI组件
  } else if(distanceX < 0 && currentIndex < tabs.length - 1) {
    // 左滑
    e.preventDefault(); // 防止触发了穿透事件
    // 在这里根据distanceX移动UI组件
  }
}, false);

十、移动端滑动穿透怎么解决

移动端滑动事件穿透会导致在滑动一个组件时触发其他组件的点击事件,我们可以使用CSS属性pointer-events来禁止下方组件的点击事件。代码如下:

overflow: hidden;
pointer-events: none; 

我们也可以使用javascript来阻止穿透事件的触发。例如,在touchmove事件中,我们可以调用e.preventDefault()来阻止穿透事件的触发:

element.addEventListener('touchmove', function(e) {
  e.preventDefault(); // 防止触发了穿透事件
}, false);

或者,在需要禁止穿透事件的元素上添加以下CSS样式:

pointer-events: none;
touch-action: none;

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
LWUKDLWUKD
上一篇 2025-01-16 15:47
下一篇 2025-01-16 15:47

相关推荐

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

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

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

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

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论