原生JS實(shí)現(xiàn)彈幕效果的簡(jiǎn)單操作指南
前言
現(xiàn)在很多的直播平臺(tái)或者視頻平臺(tái)都會(huì)用到彈幕加強(qiáng)和觀(guān)眾的互動(dòng)效果,那么如何用JS實(shí)現(xiàn)這樣的效果呢,用一個(gè)初學(xué)者的方法記錄下這個(gè)方法,歡迎大牛指導(dǎo)。
1、首先需要操作文檔必須拿到Dom中的元素,當(dāng)然有很多方法,這里還是用document.querySelector.
2、這邊也是為了鍵盤(pán)和鼠標(biāo)都可發(fā)送封裝了一個(gè)函數(shù)function sendMsg(){
首先需要?jiǎng)?chuàng)建一個(gè)容器來(lái)接受你編輯的內(nèi)容,這里用span標(biāo)簽,當(dāng)然其他標(biāo)簽也可
var oSpan=document.cerateElement(“span”)
將oSpan插入到需要展示的oVideoBox
oVideoBox.appendChild(oSpan)
給oSpan加入class用于編輯插入的樣式,當(dāng)然也可以用js,這里用的CSS樣式oSpan.classList.add(“danmu”)
用innerHTML接用戶(hù)圖像及彈幕內(nèi)容這里用ES6的一個(gè)``
oSpan.innerHTML =` < img src ="./source/lei.jpg" /> ${oContent.value}
計(jì)算彈幕出現(xiàn)的初始位置,left位移初始位置即oVideoBox的寬度oVideoBox.offsetWidth.也是oSpan的初始定位oSpan.offsetLeft
top位移的初始即oVideoBox內(nèi)隨機(jī)的高度,避免超出
var maxTop=oVideoBox…clientHeight-oSpan.offsetHeight; var top=Math.round(Math.random()*maxTop) oSpan.style.top = top+ ‘px'
當(dāng)然JS的動(dòng)畫(huà)也離不開(kāi)計(jì)時(shí)器。這邊也是用setInterval()
var timer=setInterval(()=>{ var left=oSpan.offsetLeft left-=10 oSpan.style.left= left+ ‘px'
這邊判斷一下如果超出屏幕就把彈幕和計(jì)時(shí)器移出
if(left<-oSpan.offsetWidtb){ clearInterval(timer); oSpan.remove();}},100)
以上就完成了簡(jiǎn)易版的彈幕函數(shù)就封裝完成了,后面就可以引用了,
事件從點(diǎn)擊開(kāi)始,彈幕也是創(chuàng)建點(diǎn)擊事件oSend.onclick,
oSend.οnclick=function(){引用函數(shù)sendMsg()}
后面可以加上一個(gè)鍵盤(pán)的enter可以發(fā)送,是一個(gè)事件委托window.οnkeydοwn=function(e){
var ev = e || event; var keyCode = ev.keyCode || ev.which;
判斷如果按的是鍵盤(pán)enter的keycode碼是13和alt組合
if (keyCode === 13 && ev.altKey) { sendMsg();}}
以下是bod代碼,可以練練
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>作業(yè)_彈幕</title> <style> * { padding: 0; margin: 0; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .wrapBox { width: 800px; height: 550px; border: 1px solid #000; margin: 50px auto 0; } .videoBox { height: 500px; position: relative; overflow: hidden; } .videoBox img { width: 100%; height: 100%; } video { width: 100%; /* height: 500px; */ } .danmuSend { display: flex; height: 50px; } #content { flex: 1; } #send { width: 100px; } .danmu { color: #f00; font-size: 20px; position: absolute; left: 800px; top: 0; white-space: nowrap; } .danmu img { width: 60px; height: 60px; border-radius: 50%; vertical-align: middle; display: inline-block; } </style> </head> <body> <div class="wrapBox"> <div class="videoBox"> <img src="../../source/bg.jpg" /> <!-- <span class="danmu">我是彈幕</span> --> <!-- <span class="danmu">我是彈幕</span> <span class="danmu">我是彈幕</span> <span class="danmu">我是彈幕</span> <span class="danmu">我是彈幕</span> --> </div> <div class="danmuSend"> <input id="content" type="text"> <button id="send">發(fā)送</button> </div> </div> </body>
以下是JS的代碼:
<script> var oSend = document.querySelector('#send'); var oContent = document.querySelector('#content'); var oVideoBox = document.querySelector('.videoBox'); function sendMsg() { var content = oContent.value; var oSpan = document.createElement('span'); oSpan.className = 'danmu'; oSpan.innerHTML = `<img src="../../source/bg.jpg">${content}`; oVideoBox.appendChild(oSpan); var maxTop = oVideoBox.clientHeight - oSpan.offsetHeight; oSpan.style.top = Math.round(Math.random() * maxTop) + 'px'; var timer = setInterval(() => { var left = oSpan.offsetLeft; left -= 10; oSpan.style.left = left + 'px'; if (left < -oSpan.offsetWidth) { clearInterval(timer); oSpan.remove(); } }, 100); } oSend.onclick = function () { sendMsg(); } window.onkeydown = function (e) { var ev = e || event; var keyCode = ev.keyCode || ev.which; if (keyCode === 13 && ev.altKey) { sendMsg(); } } </script>
總結(jié)
到此這篇關(guān)于原生JS實(shí)現(xiàn)彈幕效果的文章就介紹到這了,更多相關(guān)原生JS實(shí)現(xiàn)彈幕內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 簡(jiǎn)單實(shí)現(xiàn)JavaScript彈幕效果
- 基于JavaScript實(shí)現(xiàn)彈幕特效
- JS實(shí)現(xiàn)的視頻彈幕效果示例
- JavaScript直播評(píng)論發(fā)彈幕切圖功能點(diǎn)集合效果代碼
- javascript實(shí)現(xiàn)彈幕墻效果
- javascript實(shí)現(xiàn)視頻彈幕效果(兩個(gè)版本)
- 原生js實(shí)現(xiàn)彈幕效果
- js cavans實(shí)現(xiàn)靜態(tài)滾動(dòng)彈幕
- js實(shí)現(xiàn)彈幕飛機(jī)效果
- js實(shí)現(xiàn)簡(jiǎn)易彈幕系統(tǒng)
相關(guān)文章
使用閉包對(duì)setTimeout進(jìn)行簡(jiǎn)單封裝避免出錯(cuò)
寫(xiě)js腳本時(shí)經(jīng)常會(huì)用到一些拼寫(xiě)函數(shù)的情況,例如調(diào)用setTimeout...查了很長(zhǎng)時(shí)間,為什么就是彈不出對(duì)話(huà)框呢,使用閉包就可完全避免了2013-07-07微信開(kāi)發(fā) 消息推送實(shí)現(xiàn)代碼
這篇文章主要介紹了微信開(kāi)發(fā) 消息推送實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10Uni-app返回上一頁(yè)面并攜帶參數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Uni-app返回上一頁(yè)面并攜帶參數(shù)的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06js判斷數(shù)組中是否包含某個(gè)值的4種方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于js判斷數(shù)組中是否包含某個(gè)值的4種方法,數(shù)組是我們編程中經(jīng)常使用的的數(shù)據(jù)結(jié)構(gòu)之一,在處理數(shù)組時(shí)我們經(jīng)常需要在數(shù)組中查找特定的值,JavaScript 包含一些內(nèi)置方法來(lái)檢查數(shù)組是否有特定的值或?qū)ο?需要的朋友可以參考下2023-11-11layer彈出子iframe層父子頁(yè)面?zhèn)髦档膶?shí)現(xiàn)方法
這篇文章主要介紹了layer彈出子iframe層父子頁(yè)面?zhèn)髦档膶?shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11js動(dòng)態(tài)生成表格(節(jié)點(diǎn)操作)
這篇文章主要為大家詳細(xì)介紹了js動(dòng)態(tài)生成表格,進(jìn)行節(jié)點(diǎn)操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01