JS——旋转木马

1、opacity和zIndex的综合运用

2、样式的数组的替换:向右边滑动---删除样式数组第一位并在数组最后添加;向左边滑动---删除样式数组最后一位并在数组前添加

3、开闭原则,只有当回调函数执行完毕以后,我再次点击滑动按钮才有用

初始化
1 2 3 4 5
a b c d e

==>向右边滑动,数字动,样式不变
5 1 2 3 4
a b c d e
==>向右边滑动,字母动---删除第一位并在数组最后添加
1 2 3 4 5
b c d e a

==>向左边滑动,数字动
2 3 4 5 1 
a b c d e
==>向左边滑动,字母动---删除最后一位并在数组前添加
1 2 3 4 5
e a b c d
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .box {
            width: 1200px;
            margin: 10px auto;
        }

        .content {
            height: 500px;
            position: relative;
        }

        ul {
            list-style: none;
        }

        li {
            position: absolute;
            left: 200px;
            top: 0;
        }

        li img {
            width: 100%;
        }

        .arrow {
            opacity: 0;
        }

        .prev, .next {
            width: 76px;
            height: 112px;
            position: absolute;
            top: 50%;
            margin-top: -56px;
            background: url(images/prev.png) no-repeat;
            z-index: 99;
        }

        .next {
            right: 0;
            background-image: url(images/next.png);
        }
    </style>
    <script>
        /**
         * Created by Lenovo on 2016/9/13.
         */
        window.onload = function () {
            var arr = [
                {   //  1
                     400,
                    top: 70,
                    left: 50,
                    opacity: 20,
                    zIndex: 2
                },
                {  // 2
                     600,
                    top: 120,
                    left: 0,
                    opacity: 80,
                    zIndex: 3
                },
                {   // 3
                     800,
                    top: 100,
                    left: 200,
                    opacity: 100,
                    zIndex: 4
                },
                {  // 4
                     600,
                    top: 120,
                    left: 600,
                    opacity: 80,
                    zIndex: 3
                },
                {   //5
                     400,
                    top: 70,
                    left: 750,
                    opacity: 20,
                    zIndex: 2
                }
            ];

            //0.获取元素
            var content = document.getElementById("content");
            var liArr = content.children[0].children;
            var arrow = content.children[1];
            var arrowChildren = arrow.children;
            //设置一个开闭原则变量,点击以后修改这个值。
            var flag = true;

            //1.鼠标放到轮播图上,两侧的按钮显示,移开隐藏。
            content.onmouseenter = function () {
                //arrow.style.opacity = 1;
                animate(arrow, {"opacity": 100});
            }
            content.onmouseleave = function () {
                //arrow.style.opacity = 1;
                animate(arrow, {"opacity": 0});
            }
            //2.利用缓动框架初始化整个页面,move函数无参数,不会操作arr数组
            move();
            //3.把两侧按钮绑定事件。(调用同一个方法,只有一个参数,true为正向旋转,false为反向旋转)
            arrowChildren[0].onclick = function () {
                if (flag) {
                    flag = false;
                    move(true);
                }
            }
            arrowChildren[1].onclick = function () {
                if (flag) {
                    flag = false;
                    move(false);
                }
            }

            //4.书写函数。
            function move(bool) {
                //判断:如果等于undefined,那么就不执行这两个if语句
                if (bool === true || bool === false) {
                    if (bool) {
                        arr.unshift(arr.pop());
                    } else {
                        arr.push(arr.shift());
                    }
                }
                //再次为页面上的所有li赋值属性,利用缓动框架
                for (var i = 0; i < liArr.length; i++) {
                    animate(liArr[i], arr[i], function () {
                        flag = true;
                    });
                }
            }

        }

        //参数变为2个,将属性atrr和值都存储到json中
        function animate(ele, json, fn) {
            //先清定时器
            clearInterval(ele.timer);
            ele.timer = setInterval(function () {
                //开闭原则
                var bool = true;
                //遍历属性和值,分别单独处理json
                //attr == k(键)    target == json[k](值)
                for (var k in json) {
                    //四部
                    var leader;
                    //判断如果属性为opacity的时候特殊获取值
                    if (k === "opacity") {
                        leader = getStyle(ele, k) * 100 || 100;
                    } else {
                        leader = parseInt(getStyle(ele, k)) || 0;
                    }
                    //1.获取步长
                    var step = (json[k] - leader) / 10;
                    //2.二次加工步长
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
                    leader = leader + step;
                    //3.赋值
                    //ele.style[k] = leader + "px";
                    //特殊情况特殊赋值
                    if (k === "opacity") {
                        ele.style[k] = leader / 100;
                        //兼容IE678
                        ele.style.filter = "alpha(opacity=" + leader + ")";
                        //如果是层级,一次行赋值成功,不需要缓动赋值
                        //为什么?需求!
                    } else if (k === "zIndex") {
                        ele.style.zIndex = json[k];
                    } else {
                        ele.style[k] = leader + "px";
                    }

                    //4.清除定时器
                    //判断: 目标值和当前值的差大于步长,就不能跳出循环
                    //不考虑小数的情况:目标位置和当前位置不相等,就不能清除清除定时器。
                    // if (json[k] !== leader) {
                    //     bool = false;
                    // }
                    if (Math.abs(json[k] - leader) > Math.abs(step)) {
                        bool = false;
                    }
                }
                console.log(1);
                //只有所有的属性都到了指定位置,bool值才不会变成false;
                if (bool) {
                    for (k in json) {
                        if (k === "opacity") {
                            ele.style[k] = json[k] / 100;
                            ele.style.filter = "alpha(opacity=" + leader + ")";//兼容IE678
                        } else if (k === "zIndex") {
                            ele.style.zIndex = json[k];
                        } else {
                            ele.style[k] = json[k] + "px";
                        }

                    }
                    clearInterval(ele.timer);
                    //所有程序执行完毕之后执行回调函数
                    //现在只有传递了回调函数,才能执行
                    if (fn) {
                        fn();
                    }
                }
            }, 25);
        }

        //兼容方法获取元素样式
        function getStyle(ele, attr) {
            if (window.getComputedStyle) {
                return window.getComputedStyle(ele, null)[attr];
            }
            return ele.currentStyle[attr];
        }
    </script>
</head>
<body>
<div class="box">
    <div class="content" id="content">
        <ul>
            <li><a href="#"><img src="images/slidepic1.jpg"></a></li>
            <li><a href="#"><img src="images/slidepic2.jpg"></a></li>
            <li><a href="#"><img src="images/slidepic3.jpg"></a></li>
            <li><a href="#"><img src="images/slidepic4.jpg"></a></li>
            <li><a href="#"><img src="images/slidepic5.jpg"></a></li>
        </ul>
        <!--左右切换按钮-->
        <div class="arrow" id="arrow">
            <a href="javascript:;" class="prev"></a>
            <a href="javascript:;" class="next"></a>
        </div>
    </div>
</div>
</body>
</html>

原文地址:https://www.cnblogs.com/wuqiuxue/p/8022196.html