原生js封装无缝轮播功能代码示例

作者:袖梨 2022-06-29

本篇文章小编给大家分享一下原生js封装无缝轮播功能代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

说明:

这是一个使用原生js、es5语法写出的无缝轮播程序,代码中对相关api进行了封装,使得在引入该轮播js文件后,只需要在自己的js文件中添加两行代码即可在网页中实现一个基本的无缝轮播图效果。

基本使用步骤为:获取dom元素数组、向轮播对象中传参、轮播对象调用自动轮播方法。

除基本的定时器自动轮播功能外,该程序还支持设置过渡动画时间、设置鼠标移入元素自动轮播停止、设置点击左右侧边按钮时轮播、设置点击下方按钮时轮播功能。

该程序不需要依赖css、html文件、但需要你的css、html布局遵循一定的规则。

注意该程序不支持曲线过渡速度、且在将浏览器切换浏览器窗口后有时会出现轮播图错乱的bug,暂时找不到问题的所在。

该程序仅是我一个初学者对无缝轮播函数的简单封装,仅能够做学习和参考使用。

下面除轮播代码外,我还会给出示例程序。

运行效果:

思路:

根据轮播的方向确定所有轮播图元素的排列顺序,如果当前轮播图已到达所有轮播图的边界,则将相对方向上的最后一张轮播图瞬间移动到相应位置。

使用这种方法实现轮播图所需要的最少轮播图数为3张,针对轮播图数量为一张和两张的情况则需要对其单独处理,一张情况下,复制添加两张和当前轮播图相同的轮播图元素,两张情况下,需要按顺序对当前轮播图进行复制添加。

编译环境:

Chrome 86.0.4240.183

代码:

slide.js 封装轮播图代码

(function(window, undefined) {
 
 // 获取元素css属性值
 function getCss(elem, attr) {
  return elem.currentStyle ? 
   elem.currentStyle[attr] : 
   window.getComputedStyle(elem, null)[attr];
 }
 
 // 去除字符串中的非数字,不包括负号
 function toInt(str) {
  var rex = /[^0-9]/ig;
  return Number((str[0] === '-' && str[1] !== '=') ? '-' + str.replace(rex, '') : str.replace(rex, ''));
 }
 
 // 封装动画函数,参数:dom对象、css属性值对象、动画执行时间、动画完成后回调
 function animation(elem, params, speed, callback) {
  for (var param in params) {
   (function(param) {
    
    var elemValue = toInt(getCss(elem, param)),
     targetValue = toInt(params[param]),
     currentDis = elemValue,
     unit = params[param].substr(params[param].indexOf('[A-Za-z]+') - 1);
    
    if (params[param].length > 2) {
     var prefix = params[param].substr(0, 2);
     
     if (prefix === '+=')
      targetValue = elemValue + targetValue;
     else if (prefix === '-=')
      targetValue = elemValue - targetValue;
    }
    
    var dis = (targetValue - elemValue) / speed,
     sizeFlag = targetValue = targetValue) {
       clearInterval(timer);
       elem.style[param] = targetValue + unit;
      } else {
       currentDis += dis;
       elem.style[param] = currentDis + unit;
      }
     }
    }, 1);
    
   })(param);
  }
  
  if (typeof callback === 'function')
   callback();
 };
 
 
 // 向右轮播数组移动
 function rightRoundArrayMove() {
  
  var winsLen = wins.length;
  var lastWin = wins[winsLen - 1];
  
  for (var i = winsLen - 1; i > 0; i--) 
   wins[i] = wins[i - 1];
  
  wins[0] = lastWin;
 }
 
 // 向左轮播
 function rightRound(time) {
  
  rightRoundArrayMove();
  
  wins.forEach(function(win, index) {
   (index === 0) ? 
    win.style.left = index * winWidth - winWidth + 'px' :
    animation(win, {left: '+=' + winWidth + 'px'}, time ? time : animationTime);
  });
 }
 
 // 向右轮播
 function leftRound(time) {
  
  var winsLen = wins.length;
  var firstWin = wins[0];
  
  for (var i = 0; i  0) {
       var timer = setInterval(function() {
           leftRound(animationTime / (poor + 2));
           if ((--count) === 0) 
            clearInterval(timer);
          }, animationTime);
      }
      
      setTimeout(function() {
       isclick = true;
      }, clickInterval 

test.js 测试示例js代码:

onload = function() {
 
 var wins = document.querySelectorAll('.wins > li');
 var btns = document.querySelectorAll('.btns > li');
 var sideBtns = document.querySelectorAll('.side-btns > div');
 var box = document.querySelector('.box');
 
 var s = slide(wins, btns, sideBtns); // 创建轮播对象,参数:窗口dom数组、下方按钮dom数组(可选)、
 s.autoRound(2000);   // 设置自动轮播
 s.setAnimationTime(200); // 设置过渡动画时间
 s.setOverStop(box);   // 设置鼠标移入元素时自动轮播停止,参数:移入的dom元素、移入元素回调、移出元素回调
 s.sideBtnClickRound();  // 设置点击侧边按钮时轮播,参数:按钮dom数组(可选)
 s.btnsClickRound();   // 设置下方按钮点击时轮播,参数:按钮dom数组(可选)、回调
}

html、css示例代码


 
  
  
  
  
  
 
 
 
  
<
>
  • a
  • b
  • c
  • d

相关文章

精彩推荐