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 相关文章推荐
各种常用浏览器getBoundingClientRect的解析
May 21 Javascript
struts2+jquery+json实现异步加载数据(自写)
Jun 24 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
学习Bootstrap组件之下拉菜单
Jul 28 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
js事件委托和事件代理案例分享
Jul 25 Javascript
在vue-cli中组件通信的方法
Dec 16 Javascript
javascript获取图片的top N主色值方法详解
Jan 26 Javascript
浅谈Vue响应式(数组变异方法)
May 07 Javascript
JavaScript时间日期操作实例小结【5个示例】
Dec 22 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 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
PHP安全性漫谈
2012/06/28 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
python3使用GUI统计代码量
2019/09/18 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
HTML5制作表格样式
2016/11/15 HTML / CSS
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
副护士长竞聘演讲稿
2014/04/30 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
党员检讨书范文
2014/12/27 职场文书
环保主题班会教案
2015/08/13 职场文书
小学英语教学随笔
2015/08/14 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
Vue vee-validate插件的简单使用
2021/06/22 Vue.js
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android
MySQL常用慢查询分析工具详解
2022/08/14 MySQL
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL