利用原生js模擬直播彈幕滾動效果
1、基本原理
首先將直播區(qū)域分成十份(我個人自己為了便于計算分成十份),將輸入的內(nèi)容隨機放到分成的十份區(qū)域中,插入到十份區(qū)域右邊的視圖之外,然后調(diào)用動畫,按照隨機的速度從右向左移動,當(dāng)移動到左側(cè)區(qū)域視圖之外移除此滾動元素。
2、具體代碼
<div class="move_video_content">
<div class="video_content">
<div class="video_div" id="video_view"></div>
<div class="scroll_content">
<ul class="scroll_ul" id="scroll_ul_id"></ul>
</div>
</div>
<div class="input_content">
<input type="text" class="input_text" maxlength="30" placeholder="請輸入要發(fā)送的彈幕" id="input_text_id">
<button type="button" class="button_btn" id="send_btn">發(fā)送</button>
</div>
</div>
具體效果如下:

js代碼如下
let inputText = document.getElementById("input_text_id");//input輸入框
let scrollContent = document.getElementById("scroll_ul_id");//側(cè)邊聊天欄
let videoView = document.getElementById("video_view");//視頻區(qū)域
let videoWidth = videoView.offsetWidth;//直播區(qū)域的總寬度
let listHeight = videoView.offsetHeight/10;//每一層直播區(qū)域的高度
let listTopNum = [0,1,2,3,4,5,6,7,8,9];//將直播區(qū)域的高度分成10層
document.getElementById("send_btn").addEventListener("click",function(){//監(jiān)聽發(fā)送按鈕
let value = inputText.value;//獲取輸入框的值
if(!value) return;
appendDom(value);//將輸入框的值插入到滾動聊天中
createVideoBulletChatDom(value);//將輸入框的值插入到彈幕中
inputText.value = '';//清空輸入框
scrollContent.scrollTop = scrollContent.scrollHeight;//自動滾動到底部
})
function appendDom(value){//將輸入框的值插入到滾動聊天中
let li = document.createElement("li");
li.setAttribute("class","scroll_li");
li.innerHTML = value;
scrollContent.appendChild(li);
}
let speedArr = ['normal','fast','faster'];
function createVideoBulletChatDom(value){//將輸入框的值插入到彈幕中
let num = listTopNum[Math.floor((Math.random()*listTopNum.length))];
let p = document.createElement("p");
p.setAttribute("class","video_p");
p.style.top = (num * 60) + "px";
p.style.left = videoWidth + "px";
p.innerHTML = value;
videoView.appendChild(p);
let speed = speedArr[Math.floor((Math.random()*speedArr.length))];
Animate(p,speed);//滾動動畫
}
let animateType = {
'normal':5,
'fast':10,
'faster':15
}
function Animate(dom,speed){//滾動動畫
let domWidth = dom.offsetWidth;//當(dāng)前彈幕元素的寬度
let distance = videoWidth;//直播區(qū)域的總寬度
speed ? speed : 'normal';
let interval = animateType[speed]
let timer = setInterval(function(){
distance -= interval;
dom.style.left = distance + 'px';
if(distance <= -domWidth){
clearInterval(timer);
videoView.removeChild(dom);//清除已經(jīng)滾動出屏幕的標(biāo)簽
}
},50)
}
根據(jù)直播區(qū)域分成的十份(listTopNum),獲取每一層區(qū)域的高度(listHeight),然后改變滾動標(biāo)簽的top實現(xiàn)插入到十份中的不同區(qū)域。
創(chuàng)建一個滾動標(biāo)簽就創(chuàng)建一個滾動動畫(函數(shù)Animate),默認(rèn)速度是normal,每次創(chuàng)建動畫都會隨機傳入一個隨機速度類型(normal、fast、faster),按照傳入的速度類型來改變每次滾動減去的距離大小,實現(xiàn)不同的滾動速度。
總結(jié)
這是個人閑著無事一時興起寫的一個直播滾動動畫,如果加上WebSocket就能實現(xiàn)多人同步通信,這個以后無事再做完善。
具體代碼請訪問[:github.com/liqc-wwl/bu…]下載下來就能直接看效果。
到此這篇關(guān)于利用原生js模擬直播彈幕滾動效果的文章就介紹到這了,更多相關(guān)js模擬直播彈幕滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript之iterable_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了JavaScript之iterable,遍歷Array可以采用下標(biāo)循環(huán),遍歷Map和Set就無法使用下標(biāo)。為了統(tǒng)一集合類型,ES6標(biāo)準(zhǔn)引入了新的iterable類型,Array、Map和Set都屬于iterable類型2017-06-06
Js判斷參數(shù)(String,Array,Object)是否為undefined或者值為空
在一些前端控件要提交數(shù)據(jù)到服務(wù)器端的數(shù)據(jù)驗證過程中,需要判斷提交的數(shù)據(jù)是否為空。如果是普通表單的字符串?dāng)?shù)據(jù),只需要在 trim 后判斷 length 即可,而這里需要的數(shù)據(jù)可以是各種不同的類型,通過 JSON.stringify(data) 進(jìn)行序列化后再傳遞2013-11-11
微信小程序如何修改radio和checkbox的默認(rèn)樣式和圖標(biāo)
這篇文章主要介紹了微信小程序修改radio和checkbox的默認(rèn)樣式和圖標(biāo),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07

