当前位置:首页 > VUE

vue弹幕实现不重叠

2026-01-07 02:45:45VUE

实现 Vue 弹幕不重叠的方法

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

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

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

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

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

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 实现图片分析的方法 在 Vue 中实现图片分析通常涉及图片上传、预览、后端交互以及分析结果展示等功能。以下是几种常见的实现方式: 使用 HTML5 File API 和 Canvas…

vue表格实现教学

vue表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提交…

vue实现发送值接受值

vue实现发送值接受值

Vue 实现父子组件传值 父组件向子组件传值(props) 父组件通过 v-bind 或简写 : 向子组件传递数据。子组件通过 props 接收数据。 父组件代码: <templat…

vue实现计时

vue实现计时

Vue 实现计时功能 在 Vue 中实现计时功能可以通过多种方式完成,以下是几种常见的方法: 使用 setInterval 实现基础计时器 通过 setInterval 和 clearInterva…