当前位置:首页 > JavaScript

js实现弹幕

2026-04-04 01:39:04JavaScript

弹幕基础实现

HTML结构需包含一个容器元素用于承载弹幕:

<div id="danmu-container" style="position: relative; width: 800px; height: 400px; overflow: hidden;"></div>

CSS样式定义弹幕外观:

.danmu-item {
  position: absolute;
  white-space: nowrap;
  color: #fff;
  text-shadow: 1px 1px 2px #000;
  font-size: 20px;
  user-select: none;
}

弹幕核心逻辑

初始化弹幕池与参数:

const container = document.getElementById('danmu-container');
const danmuPool = [];
const config = {
  speed: 2,
  fontSize: 20,
  rowHeight: 30,
  colors: ['#ff0000', '#00ff00', '#0000ff', '#ffff00']
};

弹幕对象构造函数:

class Danmu {
  constructor(text, options = {}) {
    this.text = text;
    this.color = options.color || 
      config.colors[Math.floor(Math.random() * config.colors.length)];
    this.speed = options.speed || config.speed;
    this.top = options.top || 
      Math.floor(Math.random() * (container.offsetHeight / config.rowHeight)) * config.rowHeight;
    this.left = container.offsetWidth;
    this.width = 0;
    this.element = null;
  }
}

弹幕运动控制

创建DOM元素并初始化位置:

js实现弹幕

Danmu.prototype.create = function() {
  const element = document.createElement('div');
  element.className = 'danmu-item';
  element.textContent = this.text;
  element.style.color = this.color;
  element.style.top = `${this.top}px`;
  element.style.left = `${this.left}px`;
  container.appendChild(element);

  this.element = element;
  this.width = element.offsetWidth;
};

实现动画帧更新:

Danmu.prototype.update = function() {
  this.left -= this.speed;
  this.element.style.left = `${this.left}px`;

  if (this.left + this.width < 0) {
    this.remove();
    return false;
  }
  return true;
};

弹幕管理系统

弹幕池管理与渲染循环:

function addDanmu(text, options) {
  const danmu = new Danmu(text, options);
  danmu.create();
  danmuPool.push(danmu);
}

function animate() {
  for (let i = danmuPool.length - 1; i >= 0; i--) {
    if (!danmuPool[i].update()) {
      danmuPool.splice(i, 1);
    }
  }
  requestAnimationFrame(animate);
}

// 启动动画循环
animate();

功能扩展实现

弹幕发送接口:

js实现弹幕

function sendDanmu() {
  const input = document.getElementById('danmu-input');
  if (input.value.trim()) {
    addDanmu(input.value.trim());
    input.value = '';
  }
}

碰撞检测优化(可选):

function getAvailableRow() {
  const rows = Math.floor(container.offsetHeight / config.rowHeight);
  const occupied = new Array(rows).fill(false);

  danmuPool.forEach(danmu => {
    const row = Math.floor(danmu.top / config.rowHeight);
    if (row >= 0 && row < rows) {
      occupied[row] = true;
    }
  });

  for (let i = 0; i < occupied.length; i++) {
    if (!occupied[i]) return i * config.rowHeight;
  }
  return null;
}

性能优化建议

使用Canvas替代DOM:

const canvas = document.getElementById('danmu-canvas');
const ctx = canvas.getContext('2d');

function drawDanmu() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  danmuPool.forEach(danmu => {
    ctx.fillStyle = danmu.color;
    ctx.font = `${config.fontSize}px sans-serif`;
    ctx.fillText(danmu.text, danmu.x, danmu.y);
    danmu.x -= danmu.speed;
  });
}

节流控制弹幕数量:

let lastTime = 0;
function throttleAddDanmu(text, delay = 300) {
  const now = Date.now();
  if (now - lastTime >= delay) {
    addDanmu(text);
    lastTime = now;
  }
}

标签: 弹幕js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…