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 相关文章推荐
一个不错的用JavaScript实现的UBB编码函数
Mar 09 Javascript
犀利的js 函数集合
Jun 11 Javascript
jquery实现图片滚动效果的简单实例
Nov 23 Javascript
JS使用getComputedStyle()方法获取CSS属性值
Apr 23 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
Nov 02 Javascript
一个php+js实时显示时间问题
Oct 12 Javascript
Vue 过渡(动画)transition组件案例详解
Jan 22 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
Sep 03 jQuery
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
手动下载Chrome并解决puppeteer无法使用问题
Nov 12 Javascript
微信小程序音乐播放器开发
Nov 20 Javascript
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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
深入解析Python中的上下文管理器
2016/06/28 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
大专生求职信
2014/06/29 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
教代会开幕词
2015/01/28 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
python通过函数名调用函数的几种方法总结
2021/06/07 Python