原生JS實(shí)現(xiàn)彈幕效果的簡(jiǎn)單操作指南
前言
現(xiàn)在很多的直播平臺(tái)或者視頻平臺(tái)都會(huì)用到彈幕加強(qiáng)和觀眾的互動(dòng)效果,那么如何用JS實(shí)現(xiàn)這樣的效果呢,用一個(gè)初學(xué)者的方法記錄下這個(gè)方法,歡迎大牛指導(dǎo)。
1、首先需要操作文檔必須拿到Dom中的元素,當(dāng)然有很多方法,這里還是用document.querySelector.
2、這邊也是為了鍵盤和鼠標(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接用戶圖像及彈幕內(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)畫也離不開(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è)鍵盤的enter可以發(fā)送,是一個(gè)事件委托window.οnkeydοwn=function(e){
var ev = e || event; var keyCode = ev.keyCode || ev.which;
判斷如果按的是鍵盤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)文章
js 實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)菜單效果
本文主要分享了js實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)菜單效果的示例代碼。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
JavaScript中日期格式化的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了JavaScript中日期格式化的一些實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
JavaScript canvas實(shí)現(xiàn)帶有陰影的圖形和文字
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)帶有陰影的圖形和文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
uniapp 獲取頁(yè)面來(lái)源及注意事項(xiàng)
這篇文章主要介紹了uniapp 獲取頁(yè)面來(lái)源及注意事項(xiàng),獲取當(dāng)前頁(yè)面棧的實(shí)例,以數(shù)組形式按棧的順序給出,數(shù)組中的元素為頁(yè)面實(shí)例,第一個(gè)元素為首頁(yè),最后一個(gè)元素為當(dāng)前頁(yè)面,感興趣的朋友參考本文實(shí)例代碼2024-03-03
利用javascript實(shí)現(xiàn)的三種圖片放大鏡效果實(shí)例(附源碼)
這篇文章主要介紹了利用javascript實(shí)現(xiàn)的幾種放大鏡效果,很實(shí)用一款漂亮的js圖片放大鏡特效,常見(jiàn)于電商網(wǎng)站上產(chǎn)品頁(yè),用來(lái)放大展示圖片細(xì)節(jié),很有實(shí)用性,推薦下載學(xué)習(xí)研究。文中提供了完整的源碼供大家下載,需要的朋友可以參考借鑒,一起來(lái)看看吧。2017-01-01
JS實(shí)現(xiàn)數(shù)字格式千分位相互轉(zhuǎn)換方法
下面小編就為大家?guī)?lái)一篇JS實(shí)現(xiàn)數(shù)字格式千分位相互轉(zhuǎn)換方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
js實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
JavaScript代碼實(shí)現(xiàn)圖片循環(huán)滾動(dòng)效果
這篇文章主要介紹了JavaScript代碼實(shí)現(xiàn)圖片循環(huán)滾動(dòng)效果的相關(guān)資料,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

