当前位置:首页 > VUE

vue弹幕实现不重叠

2026-01-07 02:45:45VUE

实现 Vue 弹幕不重叠的方法

CSS 定位与动画控制 通过绝对定位和动态计算弹幕轨道高度,确保弹幕在不同轨道上运行。每条弹幕占据固定高度的轨道,避免重叠。

// 弹幕轨道高度计算
const trackHeight = 30;
const tracks = Math.floor(containerHeight / trackHeight);

随机轨道分配 弹幕发射时随机分配空闲轨道,若当前轨道被占用则选择下一可用轨道。通过数组记录轨道占用状态。

vue弹幕实现不重叠

function getAvailableTrack() {
  for (let i = 0; i < tracks; i++) {
    if (!occupiedTracks[i]) {
      occupiedTracks[i] = true;
      return i;
    }
  }
  return -1; // 无可用轨道时处理
}

碰撞检测算法 使用矩形碰撞检测判断弹幕位置,动态调整新弹幕的发射时间或轨道。通过弹幕宽度和速度计算碰撞可能性。

function checkCollision(barrage, track) {
  const existing = activeBarrages.filter(b => b.track === track);
  return existing.some(b => {
    const distance = b.speed * (Date.now() - b.startTime);
    return distance < containerWidth + barrage.width;
  });
}

动态速度调整 根据弹幕密度自动调整速度,高密度时加快速度减少重叠概率。可设置不同速度档位对应不同轨道数量。

vue弹幕实现不重叠

const speedLevels = [3, 4, 5]; // px/ms
const currentSpeed = speedLevels[Math.floor(activeBarrages.length / 10)];

可视区域外缓冲 在容器外设置缓冲区存放待显示弹幕,通过IntersectionObserver API监测可视区域,动态加载弹幕。

<div class="barrage-buffer" ref="buffer"></div>

性能优化建议 使用虚拟滚动技术,对不可见弹幕进行DOM回收。限制同时显示的弹幕数量,超过阈值时进入队列等待。

const MAX_BARRAGES = 50;
if (activeBarrages.length >= MAX_BARRAGES) {
  queue.push(newBarrage);
}

完整示例组件结构

<template>
  <div class="barrage-container" ref="container">
    <div 
      v-for="(item, index) in activeBarrages" 
      :key="index"
      class="barrage-item"
      :style="{
        top: `${item.track * trackHeight}px`,
        animation: `move ${item.duration}s linear`
      }"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      trackHeight: 30,
      occupiedTracks: [],
      activeBarrages: [],
      queue: []
    }
  },
  mounted() {
    this.initTracks();
    this.startEmitter();
  },
  methods: {
    initTracks() {
      const containerHeight = this.$refs.container.clientHeight;
      this.tracks = Math.floor(containerHeight / this.trackHeight);
      this.occupiedTracks = new Array(this.tracks).fill(false);
    },
    emitBarrage(text) {
      const track = this.getAvailableTrack();
      if (track >= 0) {
        this.activeBarrages.push({
          text,
          track,
          duration: this.calcDuration(),
          startTime: Date.now()
        });
        setTimeout(() => {
          this.occupiedTracks[track] = false;
        }, this.duration * 1000);
      } else {
        this.queue.push(text);
      }
    }
  }
}
</script>

<style>
.barrage-container {
  position: relative;
  height: 300px;
  overflow: hidden;
}
.barrage-item {
  position: absolute;
  white-space: nowrap;
  animation-fill-mode: forwards;
}
@keyframes move {
  from { transform: translateX(100%); }
  to { transform: translateX(-100%); }
}
</style>

关键参数调优建议

  • 轨道高度建议30-40px,平衡显示密度与可读性
  • 动画时长控制在5-15秒区间,根据内容长度动态计算
  • 碰撞检测间隔设置为200-300ms,平衡性能与精确度
  • 缓冲区大小建议为可视区域的2-3倍宽度

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

相关文章

vue实现用户信息删除

vue实现用户信息删除

Vue 实现用户信息删除功能 在 Vue 中实现用户信息删除功能通常涉及前端界面交互和后端 API 调用。以下是实现步骤: 前端界面设计 创建删除按钮或操作项,通常使用 @click 事件触发删除操…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现modal

vue实现modal

Vue 实现 Modal 弹窗组件 使用 Vue 实现 Modal 弹窗组件可以通过多种方式,包括原生 Vue 组件、第三方库或自定义指令。以下是几种常见方法: 原生 Vue 组件实现 创建一个基础…

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template>…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null } },…