当前位置:首页 > VUE

vue弹幕实现不重叠

2026-01-12 02:04:36VUE

vue弹幕实现不重叠的方法

使用CSS定位和动态计算

通过动态计算每条弹幕的垂直位置,确保新弹幕不会与现有弹幕重叠。利用position: absolutetop属性控制每条弹幕的显示位置。

data() {
  return {
    danmuList: [],
    occupiedLines: new Set()
  }
},
methods: {
  addDanmu(text) {
    const lineHeight = 30; // 每行弹幕高度
    const maxLines = Math.floor(this.$el.clientHeight / lineHeight);

    let line = 0;
    while (line < maxLines && this.occupiedLines.has(line)) {
      line++;
    }

    if (line < maxLines) {
      this.occupiedLines.add(line);
      this.danmuList.push({
        text,
        top: line * lineHeight,
        id: Date.now()
      });

      setTimeout(() => {
        this.occupiedLines.delete(line);
        this.danmuList = this.danmuList.filter(item => item.id !== id);
      }, duration);
    }
  }
}

轨道系统实现

预先划分多条轨道,每条轨道同一时间只允许存在一条弹幕。通过维护轨道状态来避免重叠。

vue弹幕实现不重叠

data() {
  return {
    tracks: Array(5).fill(null), // 5条轨道
    danmus: []
  }
},
methods: {
  launchDanmu(text) {
    const availableTrack = this.tracks.findIndex(track => track === null);
    if (availableTrack !== -1) {
      this.tracks[availableTrack] = text;
      this.danmus.push({
        text,
        track: availableTrack,
        id: Date.now()
      });

      setTimeout(() => {
        this.tracks[availableTrack] = null;
      }, 3000);
    }
  }
}

碰撞检测算法

实现更精确的碰撞检测,计算每条弹幕的实时位置和宽度,确保新弹幕不会与运动中的弹幕重叠。

vue弹幕实现不重叠

checkCollision(newDanmu) {
  const newWidth = this.calculateTextWidth(newDanmu.text);
  return this.danmuList.some(danmu => {
    const currentWidth = this.calculateTextWidth(danmu.text);
    return (
      danmu.top === newDanmu.top &&
      Math.abs(danmu.left - newDanmu.left) < (currentWidth + newWidth) / 2
    );
  });
}

使用Web Workers处理计算

对于大量弹幕场景,可以将碰撞检测等计算密集型任务放到Web Worker中处理,避免阻塞主线程。

// worker.js
self.onmessage = function(e) {
  const { danmus, newDanmu } = e.data;
  const collision = /* 碰撞检测逻辑 */;
  postMessage(collision);
};

// Vue组件中
const worker = new Worker('worker.js');
worker.postMessage({ danmus: this.danmus, newDanmu });
worker.onmessage = (e) => {
  if (!e.data.collision) {
    this.addDanmu(newDanmu);
  }
};

第三方库解决方案

考虑使用成熟的弹幕库如rc-bulletsdanmaku,这些库已经实现了完善的防重叠机制。

import Danmaku from 'danmaku';
const danmaku = new Danmaku({
  container: document.getElementById('danmu-container'),
  engine: 'canvas',
  speed: 120,
  preventOverlap: true
});

注意事项

弹幕防重叠实现需要考虑性能问题,特别是在弹幕数量较多时。可以根据实际需求选择合适的方案,简单的轨道系统适合大多数场景,而需要精确防重叠时可采用碰撞检测算法。

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

相关文章

vue实现拼音搜索

vue实现拼音搜索

实现拼音搜索的基本思路 拼音搜索的核心是将中文转换为拼音,并在用户输入拼音时匹配对应的中文内容。Vue中可以通过集成拼音转换库(如pinyin或pinyin-pro)实现这一功能。 安装拼音转换库…

vue 实现长列表

vue 实现长列表

Vue 实现长列表的优化方案 虚拟滚动技术 虚拟滚动是处理长列表的高效方式,仅渲染可视区域内的元素。通过计算滚动位置动态加载和卸载DOM节点,大幅减少内存占用和渲染压力。 <template&…

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &l…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keyword…

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

实现vue

实现vue

安装Vue.js 通过npm安装Vue.js是最常见的方式。确保已安装Node.js和npm,运行以下命令: npm install vue 或者使用CDN直接引入: <script src…