原生JS运动实现轮播图

原生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代码

此处采用的为内联样式表


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

要点:
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运动所实现的图片轮播。

你可能感兴趣的:(javascript)