当前位置:首页 > 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元素并初始化位置:

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();

功能扩展实现

弹幕发送接口:

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;
  });
}

节流控制弹幕数量:

js实现弹幕

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

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

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…