当前位置:首页 > JavaScript

弹幕实现 js

2026-02-01 15:04:36JavaScript

弹幕实现的基本原理

弹幕功能的实现主要基于前端技术,通过动态创建DOM元素或Canvas绘制文字,控制其从右向左移动。核心逻辑包括弹幕生成、运动控制、碰撞检测及性能优化。

使用DOM实现弹幕

通过动态创建div元素实现弹幕,适合简单场景:

// 创建弹幕元素
function createDanmu(text, color, fontSize) {
  const danmu = document.createElement('div');
  danmu.textContent = text;
  danmu.style.position = 'absolute';
  danmu.style.color = color;
  danmu.style.fontSize = `${fontSize}px`;
  danmu.style.whiteSpace = 'nowrap';
  danmu.style.right = '0';
  danmu.style.top = `${Math.random() * 80}%`; // 随机垂直位置
  document.body.appendChild(danmu);
  return danmu;
}

// 移动弹幕
function moveDanmu(danmu, speed) {
  const start = Date.now();
  const initialRight = parseInt(danmu.style.right);
  const distance = window.innerWidth + danmu.offsetWidth;

  function animate() {
    const elapsed = Date.now() - start;
    const progress = elapsed / (distance / speed);
    danmu.style.right = `${initialRight + progress * distance}px`;
    if (progress < 1) requestAnimationFrame(animate);
    else danmu.remove();
  }
  requestAnimationFrame(animate);
}

使用Canvas优化性能

对于大量弹幕,Canvas方案性能更优:

const canvas = document.getElementById('danmuCanvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

const danmus = [];

class Danmu {
  constructor(text, y, speed, color) {
    this.text = text;
    this.x = canvas.width;
    this.y = y;
    this.speed = speed;
    this.color = color;
  }

  draw() {
    ctx.fillStyle = this.color;
    ctx.font = '24px Arial';
    ctx.fillText(this.text, this.x, this.y);
  }

  update() {
    this.x -= this.speed;
    return this.x + ctx.measureText(this.text).width > 0;
  }
}

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  danmus.forEach((danmu, index) => {
    danmu.draw();
    if (!danmu.update()) danmus.splice(index, 1);
  });
  requestAnimationFrame(animate);
}
animate();

弹幕轨道管理

避免弹幕重叠可采用轨道系统:

const tracks = Array(5).fill().map(() => ({ y: 0, occupied: false }));
function getAvailableTrack() {
  const trackHeight = canvas.height / tracks.length;
  for (let i = 0; i < tracks.length; i++) {
    if (!tracks[i].occupied) {
      tracks[i].occupied = true;
      tracks[i].y = i * trackHeight + trackHeight / 2;
      setTimeout(() => { tracks[i].occupied = false; }, 2000);
      return tracks[i].y;
    }
  }
  return Math.random() * canvas.height; // 无可用轨道时随机位置
}

事件监听与交互

添加发送弹幕功能:

document.getElementById('sendBtn').addEventListener('click', () => {
  const text = document.getElementById('input').value;
  const color = `hsl(${Math.random() * 360}, 100%, 50%)`;
  const y = getAvailableTrack();
  danmus.push(new Danmu(text, y, 5, color));
});

响应式处理

窗口大小变化时重置Canvas:

window.addEventListener('resize', () => {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
});

性能优化建议

  • 使用requestAnimationFrame替代setInterval
  • 对不可见弹幕进行回收
  • 避免频繁DOM操作,优先使用Canvas
  • 对弹幕文本长度做限制
  • 使用对象池复用弹幕对象

弹幕实现 js

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

相关文章

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-contain…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="sli…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 j…