JS 實現無縫滾動動畫原理(初學者入)


  這段時間在教培訓班的學生使用原生javascript實現無縫滾動的動畫案例,做了這個原理演示的動畫,分享給自學JS的朋友!博主希望對你們有幫助!

在講解之前先看一下demo:

demo:https://224137748.github.io/JS_warehouse/lunbo/domo.HTML
源碼:https://github.com/224137748/JS_warehouse/blob/master/lunbo/domo.HTML

  ps:  上面和下面的滾動進度是一致的,上面紅色框是為了演示滾動動畫原理做的一個view,下面大一點的才是我們真正看到的無縫滾動~!

原理:

     <div id="showbox">
            <div id="showpic">
                <img src="img/1.jpg"/>
                <img src="img/2.jpg"/>
                <img src="img/3.jpg"/>
                <img src="img/4.jpg"/>
                <img src="img/5.jpg"/>
                <img src="img/1.jpg"/>
            </div>
        </div>

 首先先分析一下html文檔結構,這里以上面小紅框的視圖為例子;

       <div id="showbox"> 紅框div的寬度為200px,高度為圖片的高度112px;   注意:overflow:hidden;在這里的作用       
       <div id="showpic">這個div盒子width=600%;寬度為6個紅框div盒子的寬度,高度一致;以紅框盒子為定位上下文,
使用絕對定位;

設置定時器:
    
1)、因為#showpic盒子使用絕對定位,所以只需要將其left屬性進行改變就能實現動畫效果;
    2)、#showpic里面是6張圖片,這6張圖片第一張和最后一張圖片是相同的,因為我們要實現第五張圖片往左滾動的同時,后面不會出現空白,
所以必須加一張圖片,加第一張圖片能銜接很自然;
    3)、使#showpic盒子的left屬性值遞減,那么#showpic盒子將往左邊移動,當減到第5張圖片的時候left屬性設置為0,跳轉到第1張圖片的位置,無縫滾動銜接成功;
<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <title>圖片練習</title>
        <style>
            *{padding: 0;margin: 0;}
            body{
                overflow: hidden;
            }
            ul,li{
                list-style: none;
            }
            #showbox{
                position: absolute;
                top: 20px;
                left: 50%;
                width: 200px;
                height: 112px;
                border: 2px solid red;
                margin: 0 0 0 -100px;
            }
            #showpic{
                position: absolute;
                left:0 ;
                width: 600%;
                height: 112px;
                z-index: -1;
            }
            #showpic img{
                float: left;
            }
            #box{
                position: absolute;
                top: 60%;
                left: 50%;
                width: 800px;
                height: 450px;
                margin: -225px 0 0 -400px;
                overflow: hidden;
                
            }
            #box::after{
                content: "點擊屏幕暫停";
                display: block;
                position: absolute;
                left: 320px;
                top: 30px;
                font-size: 30px;
                color: white;
                
            }
            ul{
                position: relative;
                left: 0;
                
                width: 600%;
                height: 450px;
            }
            li{
                width: 800px;
                display: inline-block;
                float: left;
            }
            ul img{
                vertical-align: top;
                width: 800px;
                
            }
        </style>
    </head>

    <body >
        <div id="showbox">
            <div id="showpic">
                <img src="img/1.jpg"/>
                <img src="img/2.jpg"/>
                <img src="img/3.jpg"/>
                <img src="img/4.jpg"/>
                <img src="img/5.jpg"/>
                <img src="img/1.jpg"/>
            </div>
        </div>
    
        <div id="box">
            <ul>
                <li>
                    <img src="img/幻燈片1.jpg"/>
                </li>
                <li>
                    <img src="img/幻燈片2.jpg"/>
                </li>
                <li>
                    <img src="img/幻燈片3.jpg"/>
                </li>
                <li>
                    <img src="img/幻燈片4.jpg"/>
                </li>
                <li>
                    <img src="img/幻燈片5.jpg"/>
                </li>
                <li>
                    <img src="img/幻燈片1.jpg"/>
                </li>
            </ul>
        </div>
    </body>

</html>
<script type="text/javascript">
    var ul = document.getElementsByTagName("ul")[0];
    ul.position = 0;        //自定義屬性
    var showpic = document.getElementById("showpic");
    showpic.position = 0;    //自定義屬性
    var timer = null;
    var width1 =200,width2 = 800;
    var star = true;
    timer = setInterval(move,0);
    function move(){
        autoplay(ul,width2);
        autoplay(showpic,width1);
    }
    //定義自動播放函數
    function autoplay(obj,width){
        obj.position-=obj.offsetWidth/4000;
        console.log(obj.position)
        if(obj.position<-width*5){
            obj.position =0;
        }
        obj.style.left = obj.position+"px";
    }
    //點擊暫停動畫
    document.onclick = function(){
        if(star){
            clearInterval(timer);
            star = false;
        }else{
            timer = setInterval(move,0);
            star = true;
        }
    }
</script>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM