barrage.js
const MAX_DM_COUNT = 6;
const CHANNEL_COUNT = 10;
var domPool = [];
var danmuPool = [];
var hasPosition = [];
var barrageflag = true
function barrageinit(id) {
let wrapper = document.querySelectorAll(id)[0]
console.log(wrapper)
for (let j = 0; j < CHANNEL_COUNT; j++) {
let doms = [];
for (let i = 0; i < MAX_DM_COUNT; i++) {
let dom = document.createElement('span');
wrapper.appendChild(dom);
dom.className = 'barrageright';
dom.style.top = j * 20 + 'px';
doms.push(dom);
dom.addEventListener('transitionend', () => {
dom.className = 'barrageright';
dom.style.transform = null;
domPool[j].push(dom);
});
}
domPool.push(doms);
}
for (let i = 0; i < CHANNEL_COUNT; i++) {
hasPosition[i] = true;
}
}
function getChannel() {
for (let i = 0; i < CHANNEL_COUNT; i++) {
if (hasPosition[i] && domPool[i].length) return i;
}
return -1;
}
function shootDanmu(dom, text, channel) {
console.log('biu~ [' + text + ']');
dom.innerText = text;
dom.style.transform = `translateX(${-dom.clientWidth}px)`;
dom.className = 'barrageleft';
hasPosition[channel] = false;
setTimeout(() => {
hasPosition[channel] = true;
}, dom.clientWidth * 10 + 1000);
}
需要发射的页面调用
<link rel="stylesheet" href="../css/barrage.css">
<script src="../js/barrage.js"></script>
<script>
window.onload = function () {
barrageinit(".player");
let btn = document.getElementsByTagName('button')[0];
let input = document.getElementsByTagName('input')[0];
setInterval(() => {
let channel;
if (danmuPool.length && (channel = getChannel()) != -1) {
let dom = domPool[channel].shift();
let danmu = danmuPool.shift();
shootDanmu(dom, danmu, channel);
}
}, 1);
}
</script>
barrage.css部分
.barrageright {
position: absolute;
visibility: hidden;
white-space: nowrap;
transform: translateX(4.245rem);
z-index: 100;
color: #fff;
font-size: 0.1rem;
}
.barrageleft {
z-index: 100;
position: absolute;
white-space: nowrap;
user-select: none;
transition: transform 7s linear;
color: #fff;
font-size: 0.1rem;
}
聊天同时调用弹幕文件chat.js
function getbarrage(msg) {
let qq = msg
let barrageflag = parent.barrageflag
if(barrageflag){
parent.danmuPool.push(qq)
console.log(parent.danmuPool, qq)
}
}
function sendmsg() {
if (!!token) {
let msgdata = {
'status': 3,
'data': {
...
}
}
socket.send(JSON.stringify(msgdata));
$(".chat_send_div").append(`
//这里只是设计到聊天的样式
`)
gotobottom()
getbarrage($(".send_input").val())
$(".send_input").val('')
}
}
https://www.cnblogs.com/wenruo/p/9566612.html
原作者大神文章地址