当前位置:首页 > 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实现atm

vue实现atm

Vue实现ATM机模拟功能 使用Vue.js实现ATM机模拟功能需要结合组件化开发、状态管理以及用户交互逻辑。以下是关键实现步骤: 核心组件结构 创建以下Vue组件构建ATM界面: CardRea…

vue实现详情

vue实现详情

Vue 实现详情页的常见方法 使用动态路由 在 Vue Router 中配置动态路由参数,通过 $route.params 获取详情 ID。示例路由配置: { path: '/detail/:i…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…

vue实现计数

vue实现计数

Vue 实现计数功能 在 Vue 中实现计数功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue 数据绑定和事件监听 通过 Vue 的数据绑定和事件监听,可以轻松实现计数功能。以下是一个简…