当前位置:首页 > VUE

vue实现视频弹幕

2026-02-20 04:03:02VUE

实现思路

使用Vue实现视频弹幕功能,核心在于动态渲染弹幕元素并控制其移动。弹幕数据通常通过WebSocket或API实时获取,前端利用CSS动画或JavaScript定时器实现滚动效果。

基本实现步骤

安装依赖(可选) 如需使用WebSocket,可安装socket.io-client

npm install socket.io-client

视频播放器与弹幕容器 在Vue组件中设置视频播放器和弹幕容器:

<template>
  <div class="video-container">
    <video ref="videoPlayer" controls width="800"></video>
    <div class="danmu-container" ref="danmuContainer"></div>
  </div>
</template>

样式设置 弹幕容器需绝对定位,覆盖在视频上方:

.video-container {
  position: relative;
}
.danmu-container {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  overflow: hidden;
}

弹幕数据结构 定义弹幕数据格式:

data() {
  return {
    danmuList: [], // 弹幕数据 {text: '内容', color: '#fff', time: 5}
    currentDanmu: [] // 当前正在显示的弹幕
  }
}

弹幕渲染方法 使用CSS动画控制弹幕移动:

methods: {
  addDanmu(danmu) {
    const danmuEl = document.createElement('div')
    danmuEl.textContent = danmu.text
    danmuEl.style.color = danmu.color
    danmuEl.classList.add('danmu-item')

    // 随机设置弹幕轨道(顶部、中部、底部)
    const track = Math.floor(Math.random() * 3)
    danmuEl.style.top = `${20 + track * 30}%`

    this.$refs.danmuContainer.appendChild(danmuEl)

    // 触发动画
    setTimeout(() => {
      danmuEl.style.transform = `translateX(-100%)`
    }, 10)

    // 动画结束后移除元素
    danmuEl.addEventListener('transitionend', () => {
      danmuEl.remove()
    })
  }
}

弹幕动画CSS

.danmu-item {
  position: absolute;
  white-space: nowrap;
  font-size: 20px;
  text-shadow: 1px 1px 2px #000;
  transition: transform 10s linear;
  transform: translateX(100%);
}

实时弹幕处理 通过WebSocket或定时器获取新弹幕:

mounted() {
  // 模拟WebSocket接收
  setInterval(() => {
    if (this.danmuList.length) {
      this.addDanmu(this.danmuList.shift())
    }
  }, 500)

  // 视频时间更新时发送对应时间点的弹幕
  this.$refs.videoPlayer.addEventListener('timeupdate', () => {
    const currentTime = this.$refs.videoPlayer.currentTime
    // 筛选当前时间点的弹幕...
  })
}

高级功能扩展

弹幕防遮挡 通过计算弹幕位置避免重叠:

checkCollision(danmuEl) {
  const rect = danmuEl.getBoundingClientRect()
  // 检测与其他弹幕元素的位置重叠...
}

弹幕互动 添加点击事件(需设置pointer-events: auto):

danmuEl.addEventListener('click', () => {
  console.log('弹幕被点击')
})

弹幕过滤器 实现敏感词过滤或用户屏蔽:

filterDanmu(text) {
  const bannedWords = ['敏感词1', '敏感词2']
  return !bannedWords.some(word => text.includes(word))
}

性能优化 使用虚拟滚动技术处理大量弹幕:

vue实现视频弹幕

// 只渲染可视区域内的弹幕
// 使用requestAnimationFrame优化动画

完整组件示例

<template>
  <div class="video-danmu">
    <video src="video.mp4" ref="video" controls></video>
    <div class="danmu-stage" ref="stage"></div>
    <div class="danmu-input">
      <input v-model="inputText" @keyup.enter="sendDanmu" />
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputText: '',
      danmuPool: []
    }
  },
  methods: {
    sendDanmu() {
      if (!this.inputText.trim()) return

      const newDanmu = {
        text: this.inputText,
        color: this.getRandomColor(),
        time: this.$refs.video.currentTime
      }

      this.danmuPool.push(newDanmu)
      this.inputText = ''
    },
    getRandomColor() {
      return `#${Math.floor(Math.random()*16777215).toString(16)}`
    }
  }
}
</script>

注意事项

  • 弹幕数量需做限制,避免性能问题
  • 移动端需考虑触摸事件兼容性
  • 视频全屏时需调整弹幕容器尺寸
  • 对于长视频,可采用分段加载弹幕数据

以上实现可根据实际需求调整弹幕速度、样式、出现频率等参数。商业级应用还需考虑弹幕存储、用户认证、实时同步等后端支持。

标签: 弹幕视频
分享给朋友:

相关文章

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…

h5实现视频直播

h5实现视频直播

实现H5视频直播的基本方法 使用HTML5的<video>标签结合直播流协议(如HLS或DASH)是实现视频直播的常见方式。现代浏览器已普遍支持这些技术。 选择直播流协议 HLS(HTT…

h5怎么实现视频直播

h5怎么实现视频直播

实现H5视频直播的方法 H5视频直播可以通过多种技术实现,主要包括使用HTML5的<video>标签结合流媒体协议,或借助第三方库和平台。以下是几种常见方法: 使用HLS(HTTP Li…

vue上传视频实现

vue上传视频实现

使用 <input type="file"> 上传视频 创建文件选择控件,限制文件类型为视频格式(如 .mp4, .webm)。通过 @change 事件监听文件选择,获取 File 对象…

vue实现缓存视频

vue实现缓存视频

Vue 实现视频缓存的方法 在 Vue 中实现视频缓存可以通过多种方式完成,包括使用浏览器的缓存机制、Service Worker 或者借助第三方库。以下是几种常见的方法: 使用 Service W…

div css制作网页视频

div css制作网页视频

使用HTML5和CSS嵌入视频 在网页中嵌入视频可以通过HTML5的<video>标签实现,结合CSS进行样式控制。以下是一个基础示例: <video width="640" he…