JS彈幕程式碼分析

徐鵬雲發表於2019-02-16

現在許多直播軟體和視訊都有彈幕功能,讓我們來看看並分析是怎麼實現的。

這邊我主要分析下js的程式碼,想看原始碼的朋友送上鍊接,http://sandbox.xinfan.org/xdd…

HTML程式碼如下(css程式碼就不展示了,想看的直接看原始碼吧):

<div id="main" class="container">
        <p class="p0">啦啦啦啦啦啦啦</p>
        <p class="p1">啦啦啦啦啦啦啦</p>
    </div>
    <div class="footer">
        <input id="ipt" class="ipt" type="text" placeholder="說點什麼?"/>
        <button id="launch" class="launch" type="button" onclick="Leave()">發射</button>
        <button id="clear" class="clear" type="button">清屏</button>
    </div>
</div>

JS程式碼如下:

    var num = 2;
    //宣告瞭num=2
    var _p = document.getElementsByTagName("p");
    //獲取標籤p.
    var main = document.getElementById("main");
    //獲取Id為mian的標籤
    function Leave(){
        var colors = ["red","orange","yellow","pink","green"];
        //儲存5個顏色
        var ipt = document.getElementById("ipt");
        //獲取id為ipt的標籤
        var launch = document.getElementById("launch");
        //獲取id為launch的標籤
        var creat_p = document.createElement("p");
        //建立一個p標籤
        main.appendChild(creat_p).innerText = ipt.value;
        //往main子集放一個p標籤並且p標籤的文字為ipt的值
        ipt.value = "";
        //初始化ipt
        creat_p.className = "p" + num;
        //建立的p標籤設定class為p2,p3,p4以此類推
        num++;
        //執行一次加上1.
        var _ran = Math.floor(Math.random()*1000);
        //宣告個0-999的隨機數.
        var F_ran = Math.floor(Math.random()*5)+15;
        //宣告個15-19隨機數 
        var T_ran = _ran%11;
        //宣告11個隨機數,0-10;
        var C_ran = _ran%5;
        //宣告5個隨機數,0-4;
        creat_p.style.top = 30*T_ran + "px";
        //新建立的p標籤給上一個top值,0-300px;
        creat_p.style.color = colors[C_ran];    
        //新建立的p標籤給上一個顏色,colors陣列裡面隨機一個。
        creat_p.style.fontSize = F_ran + "px";
        //新建立的p標籤給上一個字型大小15-19px;
    }
    var speeds = {};
    //宣告一個空陣列.
    function Speed(){
    //建立隨機速度的函式
        for (var i=0;i<_p.length;i++) {
            var name = _p[i].className;
            //獲取各個p標籤的class值.
            speed = speeds[name];
            //將name傳入speeds物件,並賦值給speed.
            if(speed == null){
            //如果speed等於null執行以下程式碼
                var S_ran = Math.floor(Math.random()*5)+1;
                //宣告個隨機數,1-5.
                speeds[name] = S_ran;        
                //並將隨機數賦值給speeds物件(json)的屬性
            }
            var l = _p[i].style.left;
            //獲取p標籤的left值.
            if(l == 0){
                l = "0px";
            //如果l等於0,就給0加上px.    
            }
            var s = parseInt(l) +speed;
            //解析l轉化為數字,再加上一個隨機數,以保證彈幕傳送字型移動速度不同.
            _p[i].style.left = s + "px";
            //給各個p標籤加上隨機數
            if(main.offsetWidth < _p[i].offsetLeft){
            //如果p標籤移動的位置大於mian的寬度
                main.removeChild(_p[i]);
                //刪除這個p標籤
                clearInterval();
                //清除定時器
            }
            
        }
    }

window.onload = function(){
    setInterval(Speed,50);
    //每50毫秒執行一下Speed函式    
}



這次主要講解了每行程式碼的作用,並沒詳細分析程式碼作用和思路,有疑問的朋友可以私信我,共同學習!

相關文章