Vue实现弹幕效果

简介: 这两天又看到有人问 Vue 如何做弹幕效果。正好我过年的时候做了个活动,其中用户可以摇签,然后 C 位飘屏展示。Vue 版本效果地址:https://www.lilnong.top/static/html/vue-bullet-biubiubiu.html网上原生版本:https://www.lilnong.top/stati...

bVbGMdU.webp.jpg


实现原理


弹幕动画效果


动画效果其实很简单,从右到左


一般来说我们认知的动画流畅度顺序是 css(transform) > css(left) > js


实现 css 的动画效果的方式


实现起来有两种方案


  1. transtion 状态 A 到状态 B 使用过渡效果
    这个重点是需要触发状态变化,所以我们可以考虑 push 之后 $nextTick 中再改变状态。


  1. animation 元素做动画。
    这个就比较简单了,他是单指元素动画


transform + animation


我们先来看看 css 的 transform 如何实现动画效果。


@keyframes right2left {
    0% {transform: translate(100vw)}
    100% {transform: translate(-100%);}
}


因为 translate 的 % 是基于当前元素的,所以我们可以设置开始位置在 100vw(正好在右边屏幕外),结束位置在 -100%(正好把自己都挪到左边屏幕外)


left + animation


@keyframes right2left {
    0% {left: 100%}
    100% {left: -100%}
}


left 的 % 是基于父级的 width,所以这里开始位置可以设置 100%,结束位置不太好控制 -100%


弹幕队列设计


因为我的需求是当前登录用户发出的会在 C 位显示,所以我把他设计成了三个队列


  1. 普通的弹幕队列,里面用来存放其他用户发的


  1. c 位弹幕队列,用来存放当前用户发的


  1. 页面中显示的弹幕队列


// item 是当前要显示的弹幕
var item = null;
// 判断一下是否是 c 位,c 位的话要先排查 c 位弹幕队列
if(this.idx == 3){
    // c 位
    item = this.clist.shift();
}
// 如果说没有要显示的弹幕,那么取普通弹幕队列的弹幕
if(!item){
    item = this.list.shift();
}
if(item){
    // 如果有弹幕,那么放到显示队列中
    item.line = this.idx;
    this.idx = (this.idx % 5 + 1);
    this.bulletlist.push(item)
}else{
    // 如果没有弹幕,那么排查一下有没有 c位 弹幕队列
    // 因为我的弹幕做了循环,所以不太可能出现这种情况
    if(this.clist.length){
        item = this.clist.shift();
        item.line = 3;
        this.idx = 3;
        this.bulletlist.push(item)
    }
}


动画开始与结束逻辑


动画开始因为我使用的是 animation,那么当 DOM 显示在页面中他就会执行动画。


动画结束是监视 animationend 的回调,因为我的动画时长是固定,所以每次都移除第一个 DOM 即可。


如果是 transtion 应该怎么做?


transtion 也有对应的结束事件 transtionend


但是开始比较坑,他需要的是两帧。这里我们要依赖 $nextTick 来实现


弹幕碰撞等问题


设置五条航道,每 1000ms 渲染一个弹幕,这样的话就可以错开行。


而且因为动画是固定时长,所以可以人为控制一行只有一个。

相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
313 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
297 137
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
803 0
|
8月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1033 4
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
7月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
861 77
|
5月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
422 1
|
5月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
266 0
|
8月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
6月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
476 17