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 解析读取XML文档 实例代码
Jul 07 Javascript
MooTools 1.2中的Drag.Move来实现拖放
Sep 15 Javascript
js 判断一个元素是否在页面中存在
Dec 27 Javascript
jquery判断元素的子元素是否存在的示例代码
Feb 04 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
Apr 30 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 Javascript
js读取本地文件的实例
Dec 22 Javascript
react build 后打包发布总结
Aug 24 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 Javascript
简单了解Vue computed属性及watch区别
Jul 10 Javascript
详解JavaScript 高阶函数
Sep 14 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类
2006/11/27 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
一些mootools的学习资源
2010/02/07 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
Python学习笔记_数据排序方法
2014/05/22 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
python与字符编码问题
2019/05/24 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
一套比较完整的软件测试人员面试题
2012/05/13 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
信息专业大学生自我评价分享
2014/01/17 职场文书
篮球比赛口号
2014/06/10 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
初一年级组工作总结
2015/08/12 职场文书