JS实现无限轮播无倒退效果


Posted in Javascript onSeptember 21, 2020

本文实例为大家分享了JS实现无限轮播无倒退的具体代码,供大家参考,具体内容如下

原理:每次移动前设置transition过渡效果,完成清除过渡效果,然后在到达最后一张图片的时候在清除过渡效果之后translateX(0)

另外需要jq的引用

HTML:

<div class="slide-container" view-count="3">
 <ul>
 <li>
  <img src="images/women/15444293310974910.jpg" alt=""/>
 </li>
 <li>
  <img src="images/women/15444293312083674.jpg" alt=""/>
 </li>
 <li>
  <img src="images/women/15444293313734437.jpg" alt=""/>
 </li>
 <li>
  <img src="images/women/15444293315979953.jpg" alt=""/>
 </li>
 <li>
  <img src="images/women/15444293316955485.jpg" alt=""/>
 </li>
 <li>
  <img src="images/women/15444293317767707.jpg" alt=""/>
 </li>
 </ul>
</div>

CSS:

.slide-container {
  max-width: 1230px;
  margin: auto;
  overflow: hidden;
 }
 .slide-container li {
  float: left;
 }
 .slide-container img {
  width: 100%;
 }

JS:

第一步我们应该在ul的所有li前面和后面复制一份一摸一样的li数组。

效果图:

JS实现无限轮播无倒退效果

JS实现无限轮播无倒退效果

在原来的li集合前后添加了一个一模一样的集合之后,slide-container显示的是prepend(li集合)。

为了使slide-container显示的是最中间的li集合,设置ul:margin-left 和margin-right为负值。大小为一个li集合的宽度。

这样ul实际的宽度就是原来的三倍。slide-container显示的就是最原始的li集合。

let orgLen, canMove, curLi, curLen,
  slider = null,
  interval = null,
  curImgIndex = 0;
 
 function initSlider() {
  let orgLiArray = document.querySelectorAll('.slide-container li');
 
  orgLen = orgLiArray.length;
  canMove = true;
  slider = $('.slide-container');
 
  addLi();
  setStyle();
 
  //添加li
  function addLi() {
  for (let i = 0; i < orgLen; i++) {
   let preLi = orgLiArray[orgLen - i - 1].cloneNode(true);
   let apLi = orgLiArray[i].cloneNode(true);
   document.querySelector('.slide-container ul').prepend(preLi);
   document.querySelector('.slide-container ul').append(apLi);
  }
  }
 
  function setStyle() {
  curLi = slider.find('li');
  curLen = curLi.length;
 
  curLi.css({
   'width': 'calc(' + 100 / curLen + '% - 10px)', //动态设置li的宽度
   'margin': '0 5px'
  });
 
  //根据实际li个数与ul中用户能够看到的个数比例设置ul宽度
  slider.find('ul').css({
   'width': curLen / slider.attr('view-count') * 100 + '%', 
  });
 
  //获取到设置了width之后的li宽度
  //通过margin-left 与margin-right 为负数 使中间的原始li集合在slide-container显示
  let width = document.defaultView.getComputedStyle(curLi[0]).width.match(/\d*\W\d/g);
 
  width = (parseFloat(width) + 10) * orgLen;
  slider.find('ul').css({
   'margin-left': '-' + width + 'px',
   'margin-right': '-' + width + 'px',
  });
  }
 } 
 
 /**
  * 移动函数
  * 每次移动后移除过渡效果
  * 当前第一个图片索引值的绝对值大于原始图片数量则恢复为原始状态
  * @param imgIndex
  */
 function move(imgIndex) {
  canMove = false; //滚轮滚动中不能再次滚动
  clearInterval(interval); //清除定时器
  slider.find('ul').css({
  'transition': 'all 0.5s linear'
  });
 
  setTimeout(function () { //移动
  slider.find('ul').css({
   'transform': 'translateX( ' + 100 / curLen * -imgIndex + '% )',
  });
  setTimeout(function () { //移动完成后清除过渡效果
   slider.find('ul').css({
   'transition': '',
   });
   setTimeout(function () {
   if (Math.abs(imgIndex) >= orgLen) { //到达边界回到初始状态
    curImgIndex = 0;
    slider.find('ul').css({
    'transform': 'translateX(0)'
    });
   }
   canMove = true;
   startInterval();
   }, 20);
  }, 500);
  }, 20);
 }
 
 function startInterval() {
  interval = setInterval(function () { //开始轮播
  curImgIndex++;
  move(curImgIndex);
  },2000);
 }
 
 initSlider();
 startInterval();

然后加入鼠标滚轮实现效果,可以用滚轮切换图片。

先编写具体的处理函数。

//统一处理滚轮滚动事件
 function wheel(event) {
  var delta = 0;
  if (!event) event = window.event;
  if (event.wheelDelta) { //IE、chrome浏览器使用的是wheelDelta,并且值为“正负120”
  delta = event.wheelDelta / 120;
  if (window.opera)
 
  //因为IE、chrome等向下滚动是负值,FF是正值,为了处理一致性,在此取反处理
   delta = -delta;
  } else if (event.detail) { //FF浏览器使用的是detail,其值为“正负3”
  delta = -event.detail / 3;
  }
  if (delta) {
  handle(delta);
 
  //阻止事件冒泡和屏幕向下滚动
  event.preventDefault() && event.stopPropagation();
  }
 
 }
 
 //上下滚动时的具体处理函数
 function handle(delta) {
  //向上滚动
  if (delta < 0 && canMove) {
  curImgIndex++;
  move(curImgIndex);
  } else if (delta > 0 && canMove) { //向下滚动
  curImgIndex--;
  move(curImgIndex);
  }
 }

然后绑定滚轮滚动事件

//兼容性写法
if (window.addEventListener) //FF,火狐浏览器会识别该方法
 slider.get(0).addEventListener('DOMMouseScroll', wheel, false);
 slider.get(0).onmousewheel = wheel; //W3C

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

Javascript 相关文章推荐
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
javascript Discuz代码中的msn聊天小功能
May 25 Javascript
关于ExtJS4.1:快捷键支持的问题
Apr 24 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
JavaScript中扩展Array contains方法实例
Aug 23 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
jquery自定义表单验证插件
Oct 12 Javascript
layui实现点击按钮给table添加一行
Aug 10 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
Aug 14 Javascript
js+canvas绘制图形验证码
Sep 21 #Javascript
vue中路由跳转不计入history的操作
Sep 21 #Javascript
JS实现放大镜效果
Sep 21 #Javascript
vue element ui validate 主动触发错误提示操作
Sep 21 #Javascript
Vue Element校验validate的实例
Sep 21 #Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
Sep 21 #Javascript
vue3.0 上手体验
Sep 21 #Javascript
You might like
一个MYSQL操作类
2006/11/16 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
浅析python中的分片与截断序列
2016/08/09 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python中的set实现不重复的排序原理
2018/01/24 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
Python读取指定日期邮件的实例
2019/02/01 Python
Django中Middleware中的函数详解
2019/07/18 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
国际领先的学术出版商:Springer
2017/01/11 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
PHP面试题大全
2015/10/16 面试题
环境科学专业个人求职信
2013/09/26 职场文书
建筑安全责任书范本
2014/07/24 职场文书
初三毕业评语
2014/12/26 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
汉字听写大会观后感
2015/06/12 职场文书
生日寿星公答谢词
2015/09/29 职场文书
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android