天天看點

原生JS實作淡入淡出輪播圖

不依賴任何插件

效果:

原生JS實作淡入淡出輪播圖

源碼:

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>淡入淡出輪播圖</title>
    <style>
        *{margin: 0; padding: 0;}
        #container{
            width: 590px;
            height: 470px;
            border: 1px solid black;
            position: relative;
            margin: auto;
            top: 100px;
            left: 0;
            right: 0;
        }
        img{
            position: absolute;
            opacity: 0;
        }
        .show{
            opacity: 1;
            transition: all 3s;
        }
        #btn-box{
            width: 100%;
            font:30px/50px "";
            text-align: center;
            color: white;
            position: absolute;
            top: 200px;
            display: flex;
            justify-content: space-between;
        }
        #left,#right{
            width: 50px;
            height: 50px;
            background-color: rgba(0,0,0,.3);
            cursor: pointer;
        }
        #point-box{
            width: 120px;
            position: absolute;
            left: 30px;
            right: 0;
            bottom: 10px;
            display: flex;
            justify-content: space-between;
            z-index: 10;
        }
        .point{
            width: 10px;
            height: 10px;
            border-radius: 50%;
            background-color: #ccc;
            border: 3px solid rgba(0,0,0,0);
            cursor: pointer;
        }
        .active{
            background-color: rgba(255,255,255,1);
            border: 3px solid rgba(0, 0, 0, 0.5);
        }

    </style>
</head>
<body>
    <div id="container">
        <div id="img-box">
            <img class="show" src="./images/1.jpg" alt="">
            <img src="./images/2.jpg" alt="">
            <img src="./images/3.jpg" alt="">
            <img src="./images/4.jpg" alt="">
            <img src="./images/5.jpg" alt="">
        </div>
        <div id="btn-box">
            <p id="left">&lt;</p>
            <p id="right">&gt;</p>
        </div>
        <div id="point-box">
            <p class="point active"></p>
            <p class="point"></p>
            <p class="point"></p>
            <p class="point"></p>
            <p class="point"></p>
        </div>
    </div>
</body>
</html>
<script>
    function $(ele){
        if(ele.charAt(0) === "#"){
            return document.querySelector(ele);
        }else{
            return document.querySelectorAll(ele);
        }
    }

    // 擷取dom對象
    var container = $("#container");
    var left_btn = $("#left");
    var right_btn = $("#right");
    var imgs = $("img");
    var points = $(".point");

    // 定義變量存放目前圖檔編号
    var index = 0;

    // 建立一個函數
    // 功能:實作圖檔的切換
    // 參數:
    //       參數1:str 決定圖檔的切換方向
    //              傳入的實參1為字元串“last”或“next”    last:切換到上一張  next:切換到下一張
    //       參數2:imgNum  圖檔的數量
    function goImg( str, imgNum ){
        imgs[index].className = "";   // 隐藏目前顯示的圖檔
        points[index].className = "point";  // 對應的小圓點恢複預設樣式
        if(str == "next"){   // 如果傳入的實參為next 則切換到下一張
            index++;
            if(index>imgNum){     // 邊界判斷 
                index = 0;   // 超出最大邊界 置為最小值0  從頭開始
            }
        }else if(str == "last"){    如果傳入的實參為 last 則切換到上一張
            index--;         // 邊界判斷
            if(index<0){     // 超出最小邊界 
                index = imgNum;   // 置為最大值
            }
        }
        imgs[index].className = "show";   // 顯示目前應該顯示的圖檔
        points[index].className = "point active";   // 對應小圓點高亮顯示
    }
    
    // 點選右箭頭切換到下一張
    right_btn.onclick = function(){
        goImg("next",imgs.length-1);
    }

    // 點選左箭頭切換到上一張
    left_btn.onclick = function(){
        goImg("last",imgs.length-1);
    }

    // 每隔3s自動切換到下一張
    var timer = setInterval(function(){
        goImg("next",imgs.length-1);
    },3000);

    // 滑鼠移入時暫停切換
    container.onmouseover = function(){
        clearInterval(timer);
    }

    // 滑鼠移出時繼續切換
    container.onmouseout = function(){
        timer = setInterval(function(){
        goImg("next",imgs.length-1);
    },3000);
    }

    // 為每個小圓點綁定index屬性,存放索引
    for(var i=0; i<points.length; i++){
        points[i].index = i;
    }

    // 點選小圓點切換到對應圖檔
    for(let j=0; j<points.length; j++){
        points[j].onclick = function(){
            // 隐藏之前的圖檔,讓對應的小圓點恢複預設樣式
            imgs[index].className = "";
            points[index].className = "point";
            // 記錄目前小圓點的索引
            index = this.index;
            // 讓目前小圓點高亮以及對應的圖檔顯示
            imgs[index].className = "show";
            points[index].className = "point active";
        }
    }
</script>
           

繼續閱讀