当前位置:首页 > VUE

vue+实现弹幕

2026-01-16 01:01:02VUE

实现弹幕的基本思路

弹幕功能的实现需要结合DOM操作、动画控制和数据管理。Vue的响应式特性和组件化开发能有效简化弹幕逻辑的实现。

弹幕数据管理

使用Vue的dataref(Composition API)存储弹幕消息数组,每条消息包含文本、颜色、位置等信息:

// Options API
data() {
  return {
    danmus: [],
    colors: ['#ff0000', '#00ff00', '#0000ff', '#ffff00']
  }
}

// Composition API
const danmus = ref([])
const colors = ['#ff0000', '#00ff00', '#0000ff', '#ffff00']

弹幕容器与样式

创建固定定位的容器作为弹幕显示区域,设置overflow: hidden防止页面滚动:

vue+实现弹幕

<div class="danmu-container" ref="container">
  <div 
    v-for="(item, index) in danmus" 
    :key="index"
    class="danmu-item"
    :style="{
      color: item.color,
      top: item.top + 'px',
      left: item.left + 'px'
    }"
  >
    {{ item.text }}
  </div>
</div>
.danmu-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  overflow: hidden;
}

.danmu-item {
  position: absolute;
  white-space: nowrap;
  font-size: 24px;
  text-shadow: 1px 1px 2px #000;
}

弹幕动画控制

使用CSS动画或requestAnimationFrame实现移动效果。CSS动画方案更简单:

addDanmu(text) {
  const containerWidth = this.$refs.container.offsetWidth
  const containerHeight = this.$refs.container.offsetHeight
  const top = Math.random() * containerHeight * 0.8

  this.danmus.push({
    text,
    color: this.colors[Math.floor(Math.random() * this.colors.length)],
    top,
    left: containerWidth
  })

  setTimeout(() => {
    this.danmus.shift()
  }, 10000) // 根据动画持续时间清理数据
}

弹幕发送功能

添加输入框和发送按钮,触发弹幕添加:

vue+实现弹幕

<div class="danmu-input">
  <input v-model="inputText" @keyup.enter="sendDanmu" />
  <button @click="sendDanmu">发送</button>
</div>
sendDanmu() {
  if (!this.inputText.trim()) return
  this.addDanmu(this.inputText)
  this.inputText = ''
}

性能优化

对于大量弹幕,使用虚拟滚动或对象池技术优化性能:

cleanDanmus() {
  // 移除屏幕外的弹幕
  this.danmus = this.danmus.filter(item => {
    const element = document.querySelector(`.danmu-item:nth-child(${item.id})`)
    if (!element) return false
    const rect = element.getBoundingClientRect()
    return rect.right > 0
  })
}

完整示例代码

组合上述代码的完整组件实现:

<template>
  <div>
    <div class="danmu-container" ref="container">
      <div 
        v-for="(item, index) in danmus" 
        :key="index"
        class="danmu-item"
        :style="{
          color: item.color,
          top: item.top + 'px',
          animation: `move ${item.duration}s linear forwards`
        }"
      >
        {{ item.text }}
      </div>
    </div>

    <div class="danmu-input">
      <input v-model="inputText" @keyup.enter="sendDanmu" />
      <button @click="sendDanmu">发送</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      danmus: [],
      colors: ['#ff0000', '#00ff00', '#0000ff', '#ffff00'],
      inputText: '',
      duration: 10
    }
  },
  methods: {
    sendDanmu() {
      if (!this.inputText.trim()) return
      this.addDanmu(this.inputText)
      this.inputText = ''
    },
    addDanmu(text) {
      const containerHeight = this.$refs.container.offsetHeight
      const top = Math.random() * containerHeight * 0.8

      this.danmus.push({
        text,
        color: this.colors[Math.floor(Math.random() * this.colors.length)],
        top,
        duration: this.duration
      })
    }
  }
}
</script>

<style>
@keyframes move {
  from { transform: translateX(100%); }
  to { transform: translateX(-100%); }
}
</style>

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

相关文章

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现发送值接受值

vue实现发送值接受值

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

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现钟表

vue实现钟表

使用 Vue 实现动态钟表 以下是一个基于 Vue 3 的动态钟表实现方案,包含时分秒指针和数字时间显示。 模板部分 <template> <div class="clock…

vue实现计时

vue实现计时

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

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vue…