vue-danmaku
Version:
基于 Vue 的弹幕交互组件 | A danmaku component for Vue
241 lines (213 loc) • 3.67 kB
TypeScript
/**
* 自定义弹幕
*/
export type CustomDanmu<T = any> = {
[key: string]: T
}
/**
* 弹幕类型
*/
export type Danmu = string | CustomDanmu
/**
* 弹幕轨道
*/
export interface DanChannel {
[index: number]: HTMLDivElement[]
}
/**
* 弹幕元素属性
*/
export interface DanmuItem {
height: number
speeds: number
top: number
right: number
}
/**
* 弹幕库属性
*/
export interface DanmakuItem {
channels: number
debounce?: number
randomChannel?: boolean
}
/**
* Vue组件实例类型
*/
export interface VueComponentInstance {
ctx: {
unmount?: () => void
}
[key: string]: any
}
/**
* Vue应用实例类型
*/
export interface VueAppInstance {
unmount: () => void
[key: string]: any
}
/**
* 自定义弹幕元素接口扩展
*/
declare global {
interface HTMLDivElement {
/**
* AnimationEnd事件处理函数引用
*/
_animationEndHandler?: (event: AnimationEvent) => void
/**
* Click事件处理函数引用
*/
_clickHandler?: (event: MouseEvent) => void
/**
* Vue组件实例引用
*/
_vueInstance?: {
instance: VueComponentInstance
el: HTMLDivElement
}
/**
* Vue应用实例引用
*/
__vueApp?: VueAppInstance
/**
* Vue父组件引用
*/
__vueParentComponent?: VueComponentInstance
}
}
/**
* 弹幕组件类型
*/
type DanmakuComponent = typeof import('./Danmaku.vue').default
/**
* 弹幕组件实例类型
*/
export type DanmakuInstance = InstanceType<DanmakuComponent> & {
/**
* 是否隐藏弹幕
*/
hidden: boolean
/**
* 是否暂停弹幕
*/
paused: boolean
/**
* 获取播放状态
*/
getPlayState(): boolean
/**
* 调整容器大小
*/
resize(): void
/**
* 开始播放弹幕
*/
play(): void
/**
* 暂停弹幕
*/
pause(): void
/**
* 停止弹幕
*/
stop(): void
/**
* 显示弹幕
*/
show(): void
/**
* 隐藏弹幕
*/
hide(): void
/**
* 清空弹幕
*/
clear(): void
/**
* 重置弹幕
*/
reset(): void
/**
* 添加弹幕
* @param danmu 弹幕内容
* @param position 插入位置,'current'表示当前播放位置,'end'表示末尾,默认为'current'
* @returns 插入的索引位置
*/
addDanmu(danmu: Danmu, position?: 'current' | 'end'): number
/**
* 插入弹幕
* @param dm 外部定义的弹幕
*/
insert(dm?: Danmu): void
/**
* 获取最大可容纳的弹幕轨道数
*/
getMaxChannels(): number
}
/**
* 弹幕组件属性类型
*/
export interface DanmakuProps {
/**
* 弹幕列表数据
*/
danmus: Danmu[]
/**
* 轨道数量,0为最大轨道数量(撑满容器)
*/
channels: number
/**
* 是否自动播放
*/
autoplay: boolean
/**
* 是否循环播放
*/
loop: boolean
/**
* 循环模式下是否避免重复弹幕
*/
loopOnly: boolean
/**
* 是否开启随机轨道注入弹幕
*/
randomChannel: boolean
/**
* 是否开启悬浮暂停
*/
isSuspend: boolean
/**
* 性能模式,启用时使用requestAnimationFrame代替CSS动画
*/
performanceMode: boolean
/**
* 弹幕刷新频率(ms)
*/
debounce: number
/**
* 弹幕速度(像素/秒)
*/
speeds: number
/**
* 弹幕垂直间距
*/
top: number
/**
* 弹幕水平间距
*/
right: number
/**
* 弹幕默认层级
*/
zIndex: number
/**
* 是否自动监听容器大小变化
*/
autoResize: boolean
/**
* 是否开启镜像模式(弹幕从左向右移动)
*/
mirror: boolean
}