JavaScript实现移动端轮播效果


Posted in Javascript onJune 06, 2017

这个轮播代码不是我自己所写,是偶然游览一个简友的主页看到的,今天刚看了事件,决定来逐行分析一下这个代码。首先,移动端与电脑端不同的是移动端只能通过触摸和手势来发生行为,所以我们要用到js中的与触摸操作有关的新事件。其实我们轮播的原理和以前相同,都是通过改变元素的位置来控制图片的出现,但让我们不是很上手的,是那些用于跟踪触摸的属性。

下面,我简单介绍一下与触摸相关的知识

触摸事件

  • touchstart:当手指触摸屏幕时触发,一只手指放在屏幕上也会触发
  • touchmove:当手指在屏幕上滑动时连续触发。在这个事件发生期间可以用preventDefault()可以阻止滚动。
  • touchend:手指从屏幕移开时触发。
  • touchcancel:当系统停止跟踪触发时触发。

上面这几个事件都会冒泡,也都可以取消。

属性

  • touches:表示当前跟踪的触摸操作的Touch对象的数组
  • targetTouches:特定于事件目标的Touch对象的数组。(简单点可以理解为手指触摸屏幕的位置)
  • changeTouches表示自上次触摸以来发生了什么改变的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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用原生javascript创建通用表单验证——更锋利的使用dom对象
Sep 13 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
javascript:void(0)是什么意思示例介绍
Nov 17 Javascript
推荐JavaScript实现继承的最佳方式
Nov 11 Javascript
node.js中的fs.chmod方法使用说明
Dec 18 Javascript
js给selected添加options的方法
May 06 Javascript
JavaScript实现对下拉列表值进行排序的方法
Jul 15 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
JavaScript实现秒杀时钟倒计时
Sep 29 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 Javascript
js评分组件使用详解
Jun 06 #Javascript
javascript中mouseenter与mouseover的异同
Jun 06 #Javascript
jquery仿京东商品放大浏览页面
Jun 06 #jQuery
Node.js连接mongodb实例代码
Jun 06 #Javascript
jquery实现图片放大点击切换
Jun 06 #jQuery
AngularJS 验证码60秒倒计时功能的实现
Jun 05 #Javascript
AngularJS 支付倒计时功能实现思路
Jun 05 #Javascript
You might like
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
浅析php创建者模式
2014/11/25 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
Vue渲染函数详解
2017/09/15 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Pandas的数据过滤实现
2021/01/15 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS
Nginx报404错误的详细解决方法
2022/07/23 Servers