vue 横屏滚动弹幕
实现原理和之前写的《vue仿app聊天室》一样的
分析
- 接收到新的弹幕消息时
1、从右边进入显示区
2、随机弹幕距离顶部的位置
3、随机弹幕的字体颜色 - 弹幕在显示区的移动动画
1、随机移动速度 - 弹幕离开显示区后移出其dom结构
技术点
- 列表过渡钩子函数
- velocity-animate 插件动画
html 结构
1 | <template> |
js 实现
1、初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14export default{
data () {
color:[ // 随机字体颜色
'yellow',
'blue',
'pink',
'red'
],
speed:{ // 弹幕随机移动速度范围,(每秒移动的px)
min: 50,
max: 100
}
}
}
1 | __init () { |
2、获取随机定位
1
2
3
4
5// 随机获取定位
positionRandom (insertH) {
const top = Math.floor(Math.random() * (this.containerParentH - insertH)) // 随机的范围是弹幕显示区的高度-当前插入的弹幕高度
return top
}
3、获取随机字体颜色
1
2
3
4
5// 获取随机字体颜色
colorRandom () {
const index = Math.floor(Math.random() * this.colorL)
return this.color[index]
}
4、获取随机移动速度
1
2
3
4
5// 获取随机移动速度
speedRandom () {
const speed = this.containerW / (Math.floor(Math.random() * (this.speed.max - this.speed.min + 1) + this.speed.min))
return parseInt(speed * 1000) // 转换成毫秒
},
5、钩子函数的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 beforeEnter (el) {
el.style.cssText = `left: 100%;color:${this.colorRandom()}`
},
// 此回调函数是可选项的设置
// 与 CSS 结合时使用
enter: function (el, done) {
const insertH = el.offsetHeight
el.style.top = `${this.positionRandom(insertH)}px` // 这块代码本想放在beforenter函数里,但获取不到当前元素的高度。
velocity(el, {left: 0}, {duration: this.speedRandom(), complete: done})
},
afterEnter: function (el) {
// 此处代码是定义了弹幕离开显示区的动画,动画执行完,就把当前的dom结构移除
// 当然这块的逻辑代码也可以在 元素离开的钩子函数里实现
velocity(el, {left: '-100%'}, {duration: 2000,
complete: () => {
el.parentNode.removeChild(el)
}})
},
beforeLeave: function (el) {
},
// 此回调函数是可选项的设置
// 与 CSS 结合时使用
leave: function (el, done) {
done()
},
afterLeave: function (el) {
},