原生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"><</div> <div class="btn rightbtn">></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运动所实现的图片轮播。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。