1.0.2 • Published 11 months ago

danmaku-vue v1.0.2

Weekly downloads
-
License
MIT
Repository
-
Last release
11 months ago

danmaku-vue

npm-version size license

基于 Vue3+ts 的弹幕交互组件

Demo: https://dshuais.github.io/danmaku-vue/

Install

$ npm install danmaku-vue --save
或
$ pnpm add danmaku-vue --save

Usage

<script setup>
import Danmaku from 'danmaku-vue'

const danmus = ref(['danmu1', 'danmu2', 'danmu3', '...'])
</script>

<template>
  <Danmaku :danmus="danmus" style="height:100px; width:300px;"></Danmaku>
</template>

Attributes

参数说明类型可选值默认值
danmus弹幕元素列表,支持纯文本或者自定义对象(支持 v-model)Array字符串[]或对象[]必填
channels轨道数量Number0
autoplay是否自动播放Booleantrue
useSlot是否开启弹幕插槽Booleanfalse
useSuspendSlot是否开启弹幕悬浮时插槽(开启isSuspend时可用)Booleanfalse
loop是否开启弹幕循环Booleanfalse
fontSize弹幕字号(slot 模式下不可用)Number18
extraStyle额外样式(slot 模式下不可用)String-
speeds弹幕速度(每秒移动的像素数)Number100
debounce弹幕刷新频率(ms)Number100
randomChannel随机选择轨道插入Booleanfalse
isSuspend是否开启弹幕悬浮暂停Booleanfalse
top弹幕垂直间距(px)Number10
right弹幕水平间距(px)Number10
  • 注 1:channels 为 0,则轨道数为容器可容纳最多轨道数(整个容器)
  • 注 2:danmus 初始化后如果为空,则 autoplay 失效。因此对于异步加载的弹幕数据,需要手动调用 refName.value.play() 进行播放
  • 注 3:弹幕刷新频率为每隔多长时间插入一条弹幕

内置方法

通过以下方式调用:

import Danmaku from 'danmaku-vue'
const danmakuRef = ref<InstanceType<typeof Danmaku>>(null)
danmakuRef.value.play()
...

<Danmaku ref="danmakuRef"></Danmaku>
方法名说明参数
play开始/继续播放-
pause暂停弹幕播放-
clear停止播放并清空弹幕-
show弹幕显示-
hide弹幕隐藏-
reset重置配置(也可在改变播放区域大小后调用)-
resize容器尺寸改变时重新计算滚动距离(需手动调用)-
push发送弹幕(插入到弹幕列表末尾,排队显示)danmu 数据,可以是字符串或对象
add发送弹幕(插入到当前播放位置,实时显示)danmu 数据,可以是字符串或对象
insert绘制弹幕(实时插入,不进行数据绑定)danmu 数据,可以是字符串或对象
getPlayState获得当前播放状态-
getInsertList获取使用 insert 方法插入的弹幕列表danmu[]
  • 注 1:pushadd 的返回值为插入后的下标,可通过判断下标的方式对当前插入弹幕进行样式定制
  • 注 2:insertpush/add 的区别在于,insert 不进行数据绑定,而是直接插入 DOM,适用于直播等场景
  • 注 3:推荐使用 insert 方式单条插入弹幕,因为add会进行数据绑定

Events

事件名说明返回值
list-end所有弹幕插入完毕-
play-end所有弹幕播放完成(已滚出屏幕)index(最后一个弹幕的下标)
dm-click弹幕点击danmu数据,index

Slot

如果你有自定义弹幕结构与样式的需求,你可以传入任意结构的对象并自己写内部样式。

name说明回调参数
default默认slot-
dm自定义弹幕样式(需useSlot为true)danmu,index
suspend自定义弹幕悬浮样式(需useSuspendSlot为true)danmu,index
<script setup>
import Danmaku from 'danmaku-vue'

const danmus = ref([{ avatar: 'http://a.com/a.jpg', text: 'aaa' }...])}
</script>

<template>
  <Danmaku ref="danmaku" :danmus="danmus" useSlot useSuspendSlot loop :channels="5">
    <template #dm="{ danmu, index }">
      <div class="danmu-item">
          <img class="danmu-item--avatar" v-if="danmu.avatar" :src="danmu.avatar" alt="">
          <div>{{ danmu.text }}</div>
      </div>
    </template>
    <template #suspend="{ danmu, index }">
      <div class="danmu-suspend">
        <div class="item" @click="handleAdd(danmu)">➕</div>
        <div class="item" @click="handleIndex(index)">👍</div>
      </div>
    </template>
  </Danmaku>
</template>
  • 注 1:dm slotsuspend slot同时使用时,可通过dm-item:hover设置悬浮后样式

  • 注 2:suspend slot的背景色默认为transparent,可通过!importantdm-suspend强制更改悬浮后背景

讨论交流和 BUG 反馈

这个 QA文档 收集了一些常见问题,可以做阅读参考

也可以给本项目 提交 issue

如果danmaku-vue帮助到了你,欢迎 star,你的 star 是我改 BUG 的动力 ヾ(ゝω・)ノ

Changelog

v1.0.0

1.0.2

11 months ago

1.0.1

11 months ago

1.0.0

11 months ago

0.2.0

11 months ago

0.1.2

11 months ago

0.1.1

11 months ago

0.1.0

11 months ago