JavaScript移动端轮播图实现:触摸事件与原理详解

作者:流萤时间:2026-10-22 04:36:21浏览:414

本文深入解析基于JavaScript的移动端轮播图实现原理。重点讲解touchstart、touchmove和touchend等触摸事件的使用,以及如何通过监听触摸坐标改变元素位置来实现无缝滚动。结合HTML结构与CSS样式,详细拆解代码逻辑,帮助开发者掌握移动端手势交互的核心技术。

移动端轮播原理与触摸事件概述

这段轮播代码并非原创,而是偶然在简友主页发现,今日结合刚学习的事件知识,决定对其逐行进行剖析。移动端与PC端的交互差异在于,移动端主要依赖触摸和手势操作,因此我们需要使用JavaScript中与触摸相关的新事件。轮播的核心原理与以往一致,即通过改变元素位置来控制图片显示,但难点在于那些用于追踪触摸状态的具体属性。

接下来,简要介绍与触摸操作相关的核心知识。

核心触摸事件类型

触摸事件机制

  • touchstart:当手指接触屏幕时触发,即使只有一根手指放在屏幕上也会激活该事件。
  • touchmove:当手指在屏幕上进行滑动操作时连续触发。在此事件处理过程中,可以使用preventDefault()方法来阻止页面的默认滚动行为。
  • touchend:当手指从屏幕抬起离开时触发。
  • touchcancel:当系统决定停止跟踪触摸操作时触发。

上述所有触摸事件均支持事件冒泡,并且都可以被取消。

触摸对象属性详解

触摸对象属性

  • touches:表示当前正在跟踪的触摸操作中Touch对象构成的数组。
  • targetTouches:特定于事件目标的Touch对象数组(可简单理解为手指当前触摸屏幕的位置集合)。
  • changedTouches:表示自上次触摸操作以来发生变化的Touch对象数组(通常指手指离开屏幕时的位置)。

每个Touch对象包含以下具体属性:

  • clientX:触摸点在视口内的X坐标。
  • clientY:触摸点在视口内的Y坐标。
  • identifier:标识此次触摸的唯一ID。
  • pageX:触摸点在页面中的X坐标。
  • pageY:触摸点在页面中的Y坐标。
  • screenX:触摸点在屏幕坐标系中的X坐标。
  • screenY:触摸点在屏幕坐标系中的Y坐标。
  • target:触发触摸事件的DOM节点目标。

具体实现代码如下:

完整代码实现


<!DOCTYPE html>
<html>
<head>
 <title>移动端轮播</title>
 <style type="text/css">
  * {
   margin: 0;
   padding: 0;
  }
  #box {
   width: 980px;
   overflow: hidden;
   position: relative;
   margin: 0 auto;
  }
  #box ul {
   width: 4900px;
   height: 100px;
   position: relative;
   transform: translateX(-980px);
   
  }
  #box ul li{
   width: 980px;
   height: 100px;
   float: left;
   list-style-type: none;
   text-align: center;
   color: #fff;
   line-height: 100px;
   font-size: 30px;
  }
 </style>
 <script type="text/javascript">
  window.onload = function() {
   var box = document.getElementById('box');
   var oUl = document.getElementsByTagName('ul')[0];
   var aLi = oUl.children;//这样就可以把所有li标签获取到了
   var iNow = 1;
   var x = -iNow*aLi[0].offsetWidth;//li标签的位置
   var bReady = true;
   oUl.addEventListener('touchstart',function(ev){

    //当手指触摸屏幕的时候触发事件,让li的位置随手指滑动而改变
    if(bReady == false){return;}
    bReady = false; 
      
    var downX = ev.targetTouches[0].pageX; //记录触摸位置 
    var disX = downX - x;//下一个li要移动到的位置
    function fnMove(ev) {
     x = downX-disX;
     oUl.style.transform = 'translate3d('+x+'px,0,0)';
    }
    function fnEnd(ev){
     var upX = ev.changedTouches[0].pageX;//离开的位置
     if(Math.abs(upX - downX)>50){
      //左边移动
      if(upX - downX<0){
       iNow++;
       if(iNow==aLi.length){iNow=aLi.length-1;}
      }else{
      //右边移动
       iNow--;
       if(iNow==-1){iNow=0;}
      }
     }
     x = -iNow*aLi[0].offsetWidth;
     oUl.style.transform = 'translate3d('+x+'px,0,0)';
     oUl.style.transition = '200ms all ease';
     function tEnd(){
      if(iNow==4){
       iNow=1;
      }
      if(iNow==0){iNow=3;}
      oUl.style.transition = 'none'
      x = -iNow*aLi[0].offsetWidth;
      oUl.style.transform = 'translate3d('+x+'px,0,0)';
      bReady = true;
     } 
     oUl.addEventListener('transitionend',tEnd,false);
     //释放内存
     document.removeEventListener('touchend',fnEnd,false);
     document.removeEventListener('touchmove',fnMove,false);

    }
    document.addEventListener('touchmove',fnMove,false);
    document.addEventListener('touchend',fnEnd,false);
    //阻止默认事件
    ev.preventDefault();
   },false);

  }
 </script>
</head>
<body>
 <div id="box"> 
 <ul>
  <li style="background:green">3</li>
  <li style="background:orange">1</li>
  <li style="background:yellow">2</li>
  <li style="background:green">3</li>
  <li style="background:orange">1</li>
 </ul>
 </div> 
</body>
</html>

以上内容为本文的全部讲解,希望对各位的学习有所帮助,也欢迎大家继续支持本站。

作者最新文章