前端學習系列——(十三)輪播圖

輪播圖是常用的一種頁面動畫效果,這裏給出兩種不同效果的實現方式和基本原理。

一、利用CSS3transition屬性實現

主要思路:通過改變opacity的值去實現圖片的出現與消失。結合setInterval實現定時輪播。

當然這只是一個demo,沒有實現前一張圖,後一張圖的功能,如果有需要,可以在這個demo上進行添加即可。實現起來並不複雜,關鍵地方進行了註釋。

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>輪播圖</title>
    <style>
        .slide {
            position: absolute;
            top: 0;
            left: 0;
            width: 800px;
            height: 800px;
            opacity: 0;
            transition: opacity 5s linear
        }
        
        .active {
            opacity: 1;
        }
        
        . container {
            position: relative;
        }
    </style>
</head>
<body>
    <div id="slider" class="container">
        <img src="./1.jpg" class="slide active" />
        <img src="./2.jpg" class="slide" />
        <img src="./3.jpg" class="slide" />  
    </div>
</body>
<script>
    window.onload = function() {
        var slider = document.getElementsByClassName("slide");
        var timer = setInterval(changeOpacity, 10000);
        
        function changeOpacity() {
            var count = slider.length;
            for(var i=0; i<count; i++) {
                if(/active/.test(slider[i].className)){
                    //修改標籤的active
                    slider[i].className = "slide";
                    //這種方式可以保證數組索引不會出現負數
                    slider[(i + 1) % count].className = "slide active";
                    break;
                }
            }
        }
        
        
        //mouseenter和mouseleave是IE的,mouseover和mouseout存在冒泡穿透觸發問題,所以需要阻止冒泡
        addListener(document.getElementById("slider"), "mouseover", function(e) {
            e.preventDefault();
            e.cancelBubble = true;
            clearInterval(timer);
        });
        
        addListener(document.getElementById("slider"), "mouseout", function(e) {
            e.preventDefault();
            e.cancelBubble = true;
            timer = setInterval(changeOpacity, 10000);
        })
        
        function addListener(dom, event, func) {
            if(dom.addEventListener) {
                dom.addEventListener(event, func);
            } else if(dom.attachEvent) {
                dom.attachEvent("on"+event, func);
            } else {
                dom["on"+event] = func;
            }
        }
        
        function removeListener(dom, event) {
            if(dom.removeEventListener) {
                dom.removeEventListener(event);
            } else if (dom.detachEvent) {
                dom.detachEvent("on"+event);
            } else {
                dom["on"+event] = null;
            }
        }
    }
</script>
</html>

二、利用JS設置scrollLeft的方式實現從左往右無縫滾動輪播

主要思路:設置<li>的display:inline-block,同時ul的寬度大於所有li的寬度總和,這樣才能保證所有圖片在一行顯示,同時在外部container寬度要比ul小(設置一個固定寬度,不能被撐開),同時兩者都設置overflow:hidden,隱藏滾動條。

然後通過修改container的scrollLeft來移動圖片,當一張圖片拖離視區後,利用appendChild()方法的特性(如果已經存在這個child,那麼移動原來的child到末尾)將第一張圖放置到最後,同時重置container的scrollLeft爲0。

具體實現如下,修改圖片的路徑即可立即使用。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>輪播圖2</title>
        <style>
            * {
                margin: 0;
                padding: 0;
                border: 0;
            }
            
            ul, ol {
                list-style: none;
            }
            
            .container {
                width: 1000px;
                box-sizing: border-box;
                overflow: hidden;
            }
            
            .slider {
                overflow: hidden;
            }
            
            .photo {
                width: 400px;
                height: 400px;
                display: inline-block;
                float: left;
            }
            
        </style>
    </head>
    <body>
        <div id="container" class="container">
            <ul id="slider" class="slider">
                <li class="photo"><img src="./1.jpg" width="400px" height="400px"></li>
                <li class="photo"><img src="./1.jpg" width="400px" height="400px"></li>
                <li class="photo"><img src="./1.jpg" width="400px" height="400px"></li>
            </ul>               
        </div>
    </body>
    <script type="text/javascript">
        window.onload = function() {
            var box = document.getElementById("container");
            var slider = document.getElementById("slider");
            var photos = document.getElementsByClassName("photo");
            var photoWidth = photos[0].offsetWidth;//獲取每個<li>佔據的實際寬度
            var speed = 50;//圖片移動速度,值越大,速度越慢
            var interval = 5;//圖片移動間隔
            
            slider.style.width = photos.length * photoWidth + "px";
            //console.log(photos.length * photoWidth,"heh ");
            
            var func = function() {
                box.scrollLeft += 2;
                //滾動條滾完一張圖片的寬度後,將第一張圖片加到最後,並且重置scrollLeft爲零
                if(photoWidth - box.scrollLeft === 0) {
                    //利用appendChild的特性,如果已經存在這個child,那麼移動原來的child到末尾
                    slider.appendChild(slider.getElementsByClassName("photo")[0]);
                    box.scrollLeft = 0;
                }
            }
            
            var timer = setInterval(func, speed);
            
            addListener(box, "mouseover", function(e) {
                e.preventDefault();
                e.cancelBubble = true;
                clearInterval(timer);
            })
            
            addListener(box, "mouseout", function(e) {
                e.preventDefault();
                e.cancelBubble = true;
                timer = setInterval(func, speed);
            })
            
        }
        
        function addListener(dom, event, func) {
            if(dom.addEventListener) {
                dom.addEventListener(event, func);
            } else if(dom.attachEvent) {
                dom.attachEvent("on"+event, func);
            } else {
                dom["on"+event] = func;
            }
        }
    </script>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章