移動端滑動事件詳解

一、移動端滑動事件穿透

在移動端上,如果有一個滑動組件,例如輪播圖組件,當滑動該組件時,很可能會觸發下方的其他組件的點擊事件。這種情況稱為滑動事件穿透。

為了解決這個問題,我們可以使用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/zh-tw/n/331204.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LWUKD的頭像LWUKD
上一篇 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

發表回復

登錄後才能評論