美文网首页web挖坑之路
淡入淡出轮播(衔接前面一片)

淡入淡出轮播(衔接前面一片)

作者: 不知道取个什么昵称不如娶个媳妇 | 来源:发表于2018-09-11 20:47 被阅读2次

    附上代码(其实脑瓜子疼)

    /**
     * 淡入
     * @param element 待添加淡入动画效果的 DOM 元素对象
     * @param speed 限定运动的总时间
     * @param fn 在运动结束后需要继续执行的函数 
     */
    function fadeIn(element, speed, fn) {
        element.style.display = "block";
        element.style.opacity = 0;
        animate(element, {opacity: 1}, speed, fn);
    }
    
    /**
     * 淡出
     * @param element 待添加淡出动画效果的 DOM 元素对象
     * @param speed 限定运动的总时间
     * @param fn 在运动结束后需要继续执行的函数 
     */
    function fadeOut(element, speed, fn) {
        element.style.display = "block";
        element.style.opacity = 1;
        animate(element, {opacity: 0}, speed, function() {
            element.style.display = "none";
            fn && fn();
        });
    }
    
    <!-- 
        淡入淡出轮播的原理:
        将所有元素全都重叠在一起,并让第一张显示,其他图片隐藏
        当切换图片显示的时候,因为所有的img Dom元素可以选择得到
        所以,就可以使用元素节点列表操作元素,使得图片一张接一张
        的显示,经过js改变元素的opacity来改变元素的显示
     -->
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <link rel="stylesheet" href="font-awesome-4.7.0/css/font-awesome.css">
    </head>
    
    <style>
        *{
            margin: 0 ;
            padding: 0 ;
        }
        .container{
            width: 658px;
            height: 658px;
            border: 1px solid ;
            margin: 50px auto;
            position: relative;
        }
        /* 给父元素container设置定位,让子元素停靠 */
        ul{
            position: relative;
        }
        li{
            list-style: none;
        }
        ul li{
            position: absolute;
            display: none;
        }
        ol{
            position: absolute;
            height: 20px;
            width: 658px;
            background: rgba(0, 0, 0, 0.5);
            bottom:0px;
        }
        ol li{
            float: left;
            margin: 0 10px;
            cursor: pointer;
        }
        .show{
            color: #ad4;
        }   
        .container .btn .next,
        .container .btn .prev{
            position: absolute;
            z-index: 9;
            background: rgba(54, 32, 15, 0.5);
            width: 45px;
            height: 30px;
            text-align: center;
            line-height: 30px;
            font-size: 30px;
            cursor: pointer;
        } 
        .container .btn .next{
            right: 0px;
        }
    </style>
    
    <body>
        <div class="container">
            <ul>
                <li style="display:block;"><a href="#"><img src="images/11.jpg" alt="11"></a></li>
                <li><a href="#"><img src="images/12.jpg" alt="12"></a></li>
                <li><a href="#"><img src="images/13.jpg" alt="13"></a></li>
                <li><a href="#"><img src="images/14.jpg" alt="14"></a></li>
            </ul>
            <ol>
                <li class="show"><i class="fa fa-star"></i></li>
                <li><i class="fa fa-star"></i></li>
                <li><i class="fa fa-star"></i></li>
                <li><i class="fa fa-star"></i></li>
            </ol>
            <div class="btn">
                <span class="next">&gt;</span>
                <span class="prev">&lt;</span>
            </div>
        </div>
        <script src="tools.js"></script>
        <script>
        //让图片自动切换起来
        //首先要获取所有图片
    
            var lis = document.querySelectorAll("ul li");//获取到所有图片li标签
            var ol_lis = document.querySelectorAll("ol li");//获取所有星星li标签
            // console.log(lis);
            var len = lis.length;//获得li的数量;
    
            var currindex = 0;//状态量。表示当前li
            var nextindex = 1;//状态量。表示下一个li
            function play_animate(){
                fadeOut(lis[currindex],400);//淡出函数
                fadeIn(lis[nextindex],400);//淡入函数
                ol_lis[currindex].className = "";//移除对应图片的star的颜色
                ol_lis[nextindex].className = "show";//给下一个对应图片的star添加color
                currindex = nextindex;//将下一个赋值给当前
                nextindex++;//得到更下一个
                if(nextindex > len - 1){//如果元素越界,设置为0
                    nextindex = 0;
                }
            }
            var timer = setInterval(play_animate,1000);//设置定时器
    
            var container = document.querySelector(".container");//获取大盒子
            container.onmouseenter = function (){//鼠标移入大盒子清除定时器
                clearInterval(timer);
            }
            container.onmouseleave = function(){//鼠标移出大盒子添加定时器
                timer = setInterval(play_animate,1000);
            }
    
            var ol = document.querySelector("ol");//获取ol
            var i_s = document.querySelectorAll("ol li i");//获取ol里面的i标签
            // console.log(ol);
            ol.onclick = function(event){//以事件委托的方式得到鼠标点击的i标签
                event = event||window.event;//兼容ie做法
                var source = event.target;//得到事件源
                if(source.nodeName === "I"){//判断事件源是不是i
                    // console.log(source);
                    // console.log(ol_lis);
                    var index = Array.from(i_s).indexOf(source);//找到事件源的下标
                    if(currindex === index ) return;//如果事件源的下标与标签的下标一样,表示当前下标对应当前图片,则不执行
                    nextindex = index;//如果不相等,则,将事件源的下标赋值给 图片下标,即改变分、当前图片下标,让其显示
                    play_animate();//调用动画函数来显示图片
                }
            }
    
            var next_ = document.querySelector(".btn .next");
            var prev_ = document.querySelector(".btn .prev");//获取prev和next按钮
            next_.onclick = function(){//next按钮按下,表明图片显示下一张,这与play_animate一样,点击则立即执行该函数
                play_animate();
            }
            prev_.onclick = function(){//prev按钮按下,表明图片显示上一张,而play_animate是显示下一张,所以这里要改变传入到fedain中的元素,这就需要他的序号减一
                nextindex = currindex - 1;//将当前图片序号减一赋给本来的下一张,达到改变序号的目的
                if(nextindex<0){//如果图片的序号已经小于0,那么就越出了边界,所以要判断一下
                    nextindex = len -1;//条件成立,就让下一张的序号变为最后一张
                }
                play_animate();//调用函数
            }
            next_.onselectstart = function(event){
                event.preventDefault();//消除鼠标点击>选中变蓝的问题
            }
            prev_.onselectstart = function(event){
                event.preventDefault();//消除鼠标点击<选中变蓝的问题
            }
        </script>
    </body>
    </html>
    

    相关文章

      网友评论

        本文标题:淡入淡出轮播(衔接前面一片)

        本文链接:https://www.haomeiwen.com/subject/kdlpgftx.html