欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

原生JS运动实现轮播图

程序员文章站 2022-03-08 15:46:34
原生js运动实现轮播图**基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到最...

原生js运动实现轮播图

**基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到最后一张时,将ul的left值设为0,即可达到图片无线轮播的效果。

运动函数的实现

函数需传入元素(即需要参与运动的元素)、目标值(以对象的形式呈现,如{left: 300})、callback(回调函数)。

//多物体多值运动+回调机制
function startmove(dom, attrobj, callback) {
 var key = true;
 var ispeed = null,
  icur = null;
 clearinterval(dom.timer);
 if (key) {
  dom.timer = setinterval(function() {
  //bstop用来判断是否开始执行回调函数
   var bstop = true;
   //判断传入目标值中的“键”类型是否为opacity
   for (var attr in attrobj) {
   //若要改变的样式为opacity,则将元素的opacity扩大100被进行操作
    if (attr === 'opacity') {
     icur = parsefloat(getstyle(dom, attr)) * 100;
    } else {
     icur = parseint(getstyle(dom, attr));
    }
    //运动速度设为目标值减去当前值的一半,即当前状态离目标值越接近,运动速度越小
    ispeed = (attrobj[attr] - icur) / 2;
    //对速度进行取整
    ispeed = ispeed > 0 ? math.ceil(ispeed) : math.floor(ispeed);
    if (attr === 'opacity') {
     dom.style.opacity = (icur + ispeed) / 100;
    } else {
     dom.style[attr] = icur + ispeed + 'px';
    }
    if (icur !== attrobj[attr]) {
     bstop = false;
    }
   }
   //当bstop为true时,元素的所有样式均已达到目标值,清理定时器并执行回调函数
   if (bstop) {
    clearinterval(dom.timer);
    typeof callback == 'function' && callback();
   }
  }, 30)
 }
 if (!key) {

 }
}
//用来获取元素实时的样式值
function getstyle(elem, prop){
 if (window.getcomputedstyle){
  return window.getcomputedstyle(elem, null)[prop];
 }
}

html部分

html中包含一个div,用来显示当前要播放的图片,该div中又包含一个ul(用来存放所有包含图片的li)、三个div(其中两个充当图片左右切换的按钮,第三个存放图片索引点,通过点击索引也可切换到要查看的图片),代码如下:

<div class="wrapper">
 <ul class="sliderpage">
  <li>
   <img src="./image/dog/阿拉斯加.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/比熊.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/边牧.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/柯基.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/阿拉斯加.jpeg"/>
  </li>
 </ul>
 <div class="btn leftbtn">&lt;</div>
 <div class="btn rightbtn">&gt;</div>
 <div class="sliderindex">
  <span class="active"></span>
  <span></span>
  <span></span>
  <span></span>
 </div>
</div>

css代码

此处采用的为内联样式表

<style>
 *{
  margin: 0;
  padding: 0;
  list-style: none;
 }
 .wrapper{
  position: relative;
  margin: 100px auto 0;
  width: 600px;
  height: 360px;
  overflow: hidden;
 }
 .wrapper .sliderpage{
  position: absolute;
  left: 0;
  width: 3000px;
  height: 360px;
 }
 .wrapper .sliderpage li{
  width: 600px;
  height: 360px;
  float: left;
 }
 .wrapper .sliderpage li img{
  width: 100%;
  height: 100%;
 }
 .btn{
  position: absolute;
  top: 50%;
  width: 20px;
  height: 20px;
  color: #fff;
  text-align: center;
  line-height: 20px;
  background-color: #000;
  opacity: 0.2;
  cursor: pointer;
 }
 .leftbtn{
  left: 5px;
 }
 .rightbtn{
  right: 5px;
 }
 .wrapper:hover .btn{
  opacity: 0.8;
 }
 .sliderindex{
  position: absolute;
  width: 100%;
  bottom: 10px;
  cursor: pointer;
  text-align: center;
 }
 span{
  width: 8px;
  height: 8px;
  background-color: #cccccc;
  border-radius: 50%;
  display: inline-block;
  margin-right: 5px;
 }
 .active{
  background-color: orange;
 }
</style>

图片自动运动及点击运动事件绑定

要点:

1、当图片运动到最后一张时(显示图片为第一张图片),将ul的left值设为0即可实现无限轮播;
2、图片每次运动的值为li的宽度;
3、图片的运动需要一定的时间,因此在图片运动过程中应禁止产生其它定时器,否则会造成运动尺寸混乱而导致图片轮播出现问题,这里用lock来进行实现,在ul运动过程中将lock值设为false,运动结束后又将lock值设为true;
4、通过index值来实现索引显示图片功能,图片轮播过程中,index初始值为0,当图片向右轮播时index值加1,图片向左轮播时,index值减1,index值为0时,若让图片向左轮播,则将index值设为n(li个数)并进行轮播,而当index值为3且图片向右轮播时,在ul运动完成后将index值设为0;

var timer = null;
var sliderpage = document.getelementsbytagname('ul')[0];
var movewidth = sliderpage.children[0].offsetwidth;
var num = sliderpage.children.length - 1;
var leftbtn = document.getelementsbyclassname('leftbtn')[0];
var rightbtn = document.getelementsbyclassname('rightbtn')[0];
var lock = true;
var index = 0;
var indexarray = document.getelementsbyclassname('sliderindex')[0].getelementsbytagname('span');
//索引切换
for (var i = 0; i < indexarray.length; i ++){
 (function(myindex){
  indexarray[myindex].onclick = function(){
   lock = false;
   cleartimeout(timer);
   index = myindex;
   changeindex(index);
   startmove(sliderpage, {left: -index * movewidth}, function(){
    lock = true;
    timer = settimeout(automove, 3000);
   })
  }
 }(i))
}
//图片运动过程中改变index点的样式
function changeindex(index){
 for (var i = 0; i < indexarray.length; i++){
  indexarray[i].classname = '';
 }
 indexarray[index].classname = 'active';
}
timer = settimeout(automove, 3000);
//向左翻
leftbtn.onclick = function (){
 automove('right->left');
}
//向右翻
rightbtn.onclick = function (){
 automove('left->right');
}
//direction
//默认轮播方向 'left->right' / undefined
//点击left按钮 'right->left'
function automove(direction){
 cleartimeout(timer);
 if (lock){
  lock = false;

  if (!direction || direction === 'left->right'){
   index++;
   startmove(sliderpage, {left: sliderpage.offsetleft - movewidth}, function(){
    if (sliderpage.offsetleft === - num * movewidth){
     index = 0;
     sliderpage.style.left = '0px';
    }
    timer = settimeout(automove, 3000);
    lock = true;
    changeindex(index);
   });
  }else if(direction === 'right->left'){
   if (sliderpage.offsetleft === 0){
    index = num;
    sliderpage.style.left = - num * movewidth + 'px';
   }
   index--;
   startmove(sliderpage, {left: sliderpage.offsetleft + movewidth}, function () {
    timer = settimeout(automove, 3000);
    lock = true;
    changeindex(index);
   })
  }
 }
}

以上即为通过原生js运动所实现的图片轮播。

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

相关标签: js 轮播图