js实现移动端轮播图滑动切换


Posted in Javascript onDecember 21, 2020

本文实例为大家分享了js实现移动端轮播图滑动切换的具体代码,供大家参考,具体内容如下

移动端手势

轮播图分析

1、自动轮播且无缝 [定时器、过渡动画]
2、分页器要随着图片的轮播而改变 [根据索引切换]
3、滑动效果 [touch事件]
4、图片随着分页器变化
5、滑动结束的时候,如果滑动的距离不超过屏幕的1/3,就恢复回去 [过渡]
6、滑动结束的时候,如果滑动的距离超过屏幕的1/3,就切换 [滑动方向 + 过渡]]

html页面结构

<!--轮播图-->
 <div class="jd_banner">
  <ul class="clearfix">
  <li><a href="#" ><img src="images/l8.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l1.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l2.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l3.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l4.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l5.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l6.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l7.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l8.jpg" alt=""></a></li>
  <li><a href="#" ><img src="images/l1.jpg" alt=""></a></li>
  </ul>
  <ul class="clearfix">
  <li class="now"></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  </ul>
</div>

js部分

/* 动态设置过渡 */
var addTransition = function (ele) {
 ele.style.transition = "all .6s";
 ele.style.webkitTransition = "all .6s";
};
/* 移除过渡效果 */
var removeTransition = function (ele) {
 ele.style.transition = "none";
 ele.style.webkitTransition = "none";
};
/* 设置容器平移 -- 也就是滑动动画 
 ele:当前元素
 xwidth:平移的距离
*/
var setTranslateX = function (ele, xwidth) {
 ele.style.transform = "translateX(" + xwidth + "px)";
 ele.style.webkitTransform = "translateX(" + xwidth + "px)";
}
var banner = function () {
 /** 轮播图分析 */
 /** 1 自动轮播且无缝 [定时器、过渡动画]
 * 2 点要随着图片的轮播而改变 [根据索引切换]
 * 3 滑动效果 [touch事件]
 * 4 图片随着点而变化
 * 5 滑动结束的时候,如果滑动的距离不超过屏幕的1/3,就恢复回去 [过渡]
 * 6 滑动结束的时候,如果滑动的距离超过屏幕的1/3,就切换 [滑动方向 + 过渡]]
 */
 var timer = ''
 /* 封装定时器函数 */
 var startInterval = function () {
 timer = setInterval(function () {
  index++;// 基于索引 做位移
  addTransition(imgBox); // 为轮播图片组的ul设置过渡函数
  setTranslateX(imgBox, -index * width);// 根据当前索引值计算平移的距离
 }, 2000);
 }
 var banner = document.querySelector(".jd_banner");
 var width = banner.offsetWidth; // 屏幕的宽度
 var imgBox = banner.querySelector("ul:first-child"); // 轮播图片ul
 var length = imgBox.querySelectorAll("li").length; // 图片的个数
 var pointBox = banner.querySelector("ul:last-child");// 分页器ul
 var points = pointBox.querySelectorAll("li");// 分页器集合

 var index = 1; // 初始化索引,由于要无缝衔接,索引从1开始
 startInterval();
 
 /* transitionend事件:当元素过渡动画结束后执行
 每次轮播动画结束后,判断当前索引值
 */
 imgBox.addEventListener("transitionend", function () {
 if (index >= length - 1) {
  index = 1;
  // 清过渡,瞬间定位imgBox 
  removeTransition(imgBox);
  setTranslateX(imgBox, -index * width);
 }
 // 滑动的时候也需要无缝
 else if (index <= 0) {
  index = 8;
  removeTransition(imgBox);
  setTranslateX(imgBox, -index * width);
 }
 showPoint(index - 1); // 改变分页器状态
 });

 var showPoint = function (index) {
 for (var i = 0; i < points.length; i++) {
  points[i].className = '';
 }
 points[index].className = "now";
 };
 /* 滑动切换 (touch事件) */
 var startX = 0; // 触摸起始点
 imgBox.addEventListener("touchstart", function (e) {
 // 记录起始位置的X坐标
 clearInterval(timer);
 startX = e.touches[0].clientX;
 });
 var distanceX = 0;
 var translateX = 0;
 // **** 加一个标识,判断用户有没有滑动
 var isMove = false
 imgBox.addEventListener("touchmove", function (e) {
 var moveX = e.touches[0].clientX;
 // 计算位移,有正负方向
 distanceX = moveX - startX;
 // 计算目标元素的位移
 // 元素将要的定位 = 当前定位 + 手指移动的距离
 translateX = -index * width + distanceX;
 // ********** 要想图片实时地跟着手指走,一定要把过渡清楚掉
 removeTransition(imgBox)
 setTranslateX(imgBox, translateX);
 isMove = true;// 确定用户有滑动
 e.preventDefault(); // 去除移动端浏览器默认的滑动事件
 });

 imgBox.addEventListener("touchend", function (e) {
 if (isMove) {
  if (Math.abs(distanceX) > width / 3) {
  // 切换
  if (distanceX > 0) {
   // 上一张
   index = index - 1;
  } else {
   // 下一张
   index = index + 1;
  }
  addTransition(imgBox); // 设置过渡动画
  setTranslateX(imgBox, -index * width);
  if (index >= 9) {
   index = 1;
  }
  if (index <= 0) {
   index = 8;
  }
  showPoint(index - 1);

  } else {
  // 不满足滑动条件,回退到之前的状态
  addTransition(imgBox);
  setTranslateX(imgBox, -index * width);
  showPoint(index - 1);
  }
 }
 // **** 最好做一次参数的重置
 startX = 0;
 distanceX = 0;
 isMove = false;
 // ****** 为了严谨,再清一次定时器
 clearInterval(timer)
 // 加上定时器
 startInterval();
 });
};

总结

原生js实现滑动切换的原理主要还是利用移动端的手势事件

  • touchstart 当手指触摸屏幕时触发
  • touchmove 当手指在屏幕中滑动的时候触发
  • touchend 当手指离开屏幕时触发

利用touch相关事件实现移动端常见滑动效果和移动端常见的手势事件。

而swiper插件的底层实现原理也是这个,因此,为了快速开发,还是使用swiper插件最好

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

Javascript 相关文章推荐
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
JS event使用方法详解
Apr 28 Javascript
javascript 嵌套的函数(作用域链)
Mar 15 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
解决给dom元素绑定click等事件无效问题的方法
Feb 17 Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
security.js实现的RSA加密功能示例
Jun 06 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 Javascript
Javascript异步编程async实现过程详解
Apr 02 Javascript
JS如何定义用字符串拼接的变量
Jul 11 Javascript
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
vue监听滚动事件的方法
Dec 21 #Vue.js
vue el-upload上传文件的示例代码
Dec 21 #Vue.js
微信小程序自定义支持图片的弹窗
Dec 21 #Javascript
Jquery+javascript实现支付网页数字键盘
Dec 21 #jQuery
微信小程序实现modal弹出框遮罩层组件(可带文本框)
Dec 20 #Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 #Javascript
微信小程序学习之自定义滚动弹窗
Dec 20 #Javascript
You might like
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
详解vue中axios的封装
2018/07/18 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
python实现sublime3的less编译插件示例
2014/04/27 Python
Django卸载之后重新安装的方法
2017/03/15 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Python中psutil的介绍与用法
2019/05/02 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
Python 文件数据读写的具体实现
2020/01/24 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
外联部演讲稿
2014/05/24 职场文书
机械专业求职信范文
2014/07/15 职场文书
2014年统计工作总结
2014/11/21 职场文书
财务部岗位职责
2015/02/03 职场文书
小学数学教学随笔
2015/08/14 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS