原生JS运动实现轮播图
原生JS运动实现轮播图
**基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到最后一张时,将ul的left值设为0,即可达到图片无线轮播的效果。
运动函数的实现
函数需传入元素(即需要参与运动的元素)、目标值(以对象的形式呈现,如{left:300})、callback(回调函数)。
//多物体多值运动+回调机制
functionstartMove(dom,attrObj,callback){
varkey=true;
variSpeed=null,
iCur=null;
clearInterval(dom.timer);
if(key){
dom.timer=setInterval(function(){
//bStop用来判断是否开始执行回调函数
varbStop=true;
//判断传入目标值中的“键”类型是否为opacity
for(varattrinattrObj){
//若要改变的样式为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);
typeofcallback=='function'&&callback();
}
},30)
}
if(!key){
}
}
//用来获取元素实时的样式值
functiongetStyle(elem,prop){
if(window.getComputedStyle){
returnwindow.getComputedStyle(elem,null)[prop];
}
}
HTML部分
HTML中包含一个div,用来显示当前要播放的图片,该div中又包含一个ul(用来存放所有包含图片的li)、三个div(其中两个充当图片左右切换的按钮,第三个存放图片索引点,通过点击索引也可切换到要查看的图片),代码如下:
<