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 相关文章推荐
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
Mar 14 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
Feb 05 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
Nov 18 Javascript
JS上传图片预览插件制作(兼容到IE6)
Aug 07 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
Jan 04 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 Javascript
vue中如何让子组件修改父组件数据
Jun 14 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
Oct 29 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
Nov 08 Javascript
Echarts地图添加引导线效果(labelLine)
Sep 30 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面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
jquery实现metro效果示例代码
2013/09/06 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
节约能源标语
2014/06/17 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
初中家长评语和期望
2014/12/26 职场文书
介绍信格式
2015/01/30 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
vue+element ui实现锚点定位
2021/06/29 Vue.js