封装动画函数

/**匀速动画封装
 * @param: ele:元素
 * @param: target:目标位置
 */
function animationMove(ele,target){
    //1.先清除之前的定时器,以本次为准
    clearInterval(ele.timeID);
    //2.开始本次移动
    ele.timeID = setInterval(function(){
        //2.1 获取元素当前位置
        var currentLeft = ele.offsetLeft;
        //2.2 开始移动
        var isLeft = currentLeft <= target?true:false;
        isLeft?currentLeft += 15 : currentLeft -= 15;
        ele.style.left = currentLeft + 'px';
        //2.3 边界检测
        if(isLeft?currentLeft >= target:currentLeft <= target){
            //(1)停止定时器
            clearInterval(ele.timeID);
            //(2)元素复位
            ele.style.left = target + 'px';
        };
    },10);
};

html 、css代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        * {
            padding: 0;
            margin: 0;
            list-style: none;
            border: 0;
        }

        .all {
            width: 500px;
            height: 200px;
            padding: 7px;
            border: 1px solid #ccc;
            margin: 100px auto;
            position: relative;
        }

        .screen {
            width: 500px;
            height: 200px;
            overflow: hidden;
            position: relative;
        }

        .screen li {
            width: 500px;
            height: 200px;
            overflow: hidden;
            float: left;
        }

        .screen ul {
            position: absolute;
            left: 0;
            top: 0px;
            width: 3000px;
        }

        .all ol {
            position: absolute;
            right: 10px;
            bottom: 10px;
            line-height: 20px;
            text-align: center;
        }

        .all ol li {
            float: left;
            width: 20px;
            height: 20px;
            background: #fff;
            border: 1px solid #ccc;
            margin-left: 10px;
            cursor: pointer;
        }

        .all ol li.current {
            background: yellow;
        }

        #arr {
            display: none;
        }

        #arr span {
            width: 40px;
            height: 40px;
            position: absolute;
            left: 5px;
            top: 50%;
            margin-top: -20px;
            background: #000;
            cursor: pointer;
            line-height: 40px;
            text-align: center;
            font-weight: bold;
            font-family: '黑体';
            font-size: 30px;
            color: #fff;
            opacity: 0.3;
            border: 1px solid #fff;
        }

        #arr #right {
            right: 5px;
            left: auto;
        }
    </style>
</head>

<body>
    <div class="all" id='box'>
        <div class="screen">
            <ul>
                <li><img src="images/01.jpg" width="500" height="200" /></li>
                <li><img src="images/02.jpg" width="500" height="200" /></li>
                <li><img src="images/03.jpg" width="500" height="200" /></li>
                <li><img src="images/04.jpg" width="500" height="200" /></li>
                <li><img src="images/05.jpg" width="500" height="200" /></li>
                <li><img src="images/01.jpg" width="500" height="200" /></li>
            </ul>
            <ol>
                <li class="current">1</li>
                <li>2</li>
                <li>3</li>
                <li>4</li>
                <li>5</li>
            </ol>
        </div>
        <div id="arr">
            <span id="left"><</span>
            <span id="right">></span>
        </div>
    </div>
</body>

js代码

<script src="./animation.js"></script>
<script>
    /*自动轮播:
   a.页面一加载,启用自动轮播模式: 开启一个5s定时器,执行点击下一页代码
   b.鼠标移入box,切换手动模式:清除定时器
   c.鼠标移出box:切换自动模式:开启定时器
   */

    //1.获取元素
    var box = document.getElementById('box');//最外面边框大盒子
    var screen = box.children[0];//轮播图显示区域盒子
    var arr = box.children[1];//上一页下一页盒子
    var ul = screen.children[0];//轮播图列表ul
    var ol = screen.children[1];//页码ol
    var left = document.getElementById('left');//上一页
    var right = document.getElementById('right');//下一页

    //第一步:页面加载开启自动模式
    var timeID = setInterval(function () {
        nextPage();
    }, 3000);

    //2.注册事件
    //2.1 鼠标移入box
    box.onmouseover = function () {
        //3.事件处理:显示arr
        arr.style.display = 'block';

        //第二步:移入切换手动模式
        clearInterval(timeID);
    };

    //2.2 鼠标移出box
    box.onmouseout = function () {
        //3.事件处理:隐藏arr
        arr.style.display = 'none';

        //第三步:切换自动模式
        //注意:timeID已经声明是全局变量,如果这里用了var就变成局部变量外部就会无法访问
        timeID = setInterval(function () {
            nextPage();
        }, 3000);

    };

    /*无限轮播
        a.当从第五张点击下一页的时候,由于此时还有第六张(与第一张一样),所以会动画滚动到第一张
        b.当从第六张点击下一页的时候,由于瞬间修改ul的位置是0,第六张与第一张重复.然后从第一张滚到第二张     
    */

    //声明一个全局变量记录当前应该显示的图片下标
    var index = 0;
    //2.3 鼠标点击下一页
    right.onclick = function () {
        nextPage();
    };

    function nextPage(){
        //3.事件处理
        //3.0 如果是最后一张,则直接修改ul的位置为第一张从头开始无限轮播
        if (index == ul.children.length - 1) {
            ul.style.left = '0px';
            index = 0;
        };
        //3.1 下一页
        index++;
        //3.2 开始滚动
        animationMove(ul, -screen.offsetWidth * index);
        //3.3 排他思想修改页码样式
        for (var i = 0; i < ol.children.length; i++) {
            if (i == index) {
                ol.children[i].className = 'current';
            } else {
                ol.children[i].className = '';
            };
        };
        //3.4 如果是第六张(与第一张重复),则应该显示第一个页码
        if (index == ul.children.length - 1) {
            ol.children[0].className = 'current';
        };

    };

    //2.4 鼠标点击上一页
    left.onclick = function () {
        //3.事件处理
        //3.0 如果是第一张,(1)修改ul为最后一张位置  (2)index改成最大下标
        if (index == 0) {
            ul.style.left = -(ul.children.length - 1) * 500 + 'px';
            index = ul.children.length - 1;
        };
        //3.1 上一页
        index--;
        //3.2 开始滚动
        animationMove(ul, -screen.offsetWidth * index);
        //3.3 排他思想修改页码样式
        for (var i = 0; i < ol.children.length; i++) {
            if (i == index) {
                ol.children[i].className = 'current';
            } else {
                ol.children[i].className = '';
            };
        };
        //3.4 如果是第六张(与第一张重复),则应该显示第一个页码
        if (index == ul.children.length - 1) {
            ol.children[0].className = 'current';
        };
    };

    //2.5 页码点击事件
    for (var i = 0; i < ol.children.length; i++) {
        //1.给每一个页面添加自定义索引
        ol.children[i].setAttribute('yemaIndex', i);
        //2.给每一个页面注册点击事件
        ol.children[i].onclick = function () {
            //3.事件处理
            //3.1 获取当前点击页码的索引
            var yemaIndex = this.getAttribute('yemaIndex');
            //3.2 将当前点击的页码赋值给index
            index = yemaIndex;
            //3.3 开始滚动
            //如果是最后一张,滚动方向就会反过来导致视觉效果比较差
            //思路:如果是第六张,先不急着滚动,先回到第一张然后再滚动
            if (ul.offsetLeft == -(ul.children.length - 1) * 500) {
                ul.style.left = '0px';
            };

            animationMove(ul, -screen.offsetWidth * yemaIndex);
            //3.4 排他思想修改页码样式
            for (var j = 0; j < ol.children.length; j++) {
                if (j == yemaIndex) {
                    ol.children[j].className = 'current';
                } else {
                    ol.children[j].className = '';
                }
            };
        };
    };
</script>

</html>