前言

这个需求如题,大体上是将文章的评论数据,在文章的首图上面以弹幕的形式出现。当时在做这个需求的时候,花了挺多精力的,踩了很多坑,现将弹幕的实现思路写出来,如果喜欢的话可以点波赞/关注,支持一下,希望大家看完本文可以有所收获。

个人博客了解一下:obkoro1.com


实现效果:

实现原理:

实现弹幕的原理,并不算太复杂,耗费一些时间,怼一怼应该都可以做出来。

  1. 获取弹幕数据。
  2. 将弹幕设置为四个通道,每个通道最多只能出现两条弹幕。
  3. 使用setInterval动态设置domleft属性。
  4. 使用dom的offsetWidth和屏幕的宽度判断元素是否滚动超出屏幕,然后移除dom。

实现步骤:

1. 首先看一下html的结构。

    <div class="detailImg"><img src="url"/><div id="barrageDiv"><div id="barrageLayer1"></div><div id="barrageLayer2"></div><div id="barrageLayer3"></div><div id="barrageLayer4"></div></div></div><!--detailImg 设置relative, barrageDiv设置z-index在图片上面,以及图片的位置--><!---barrageLayer1~4 主要设置了一个top属性让四个div在各自的水平线上,形成四个通道->
复制代码

关于这里的css样式,关键点都在上面说了,就注意一下上面通道是怎样形成的,就可以了。具体的样式也就不贴出来了,就根据各自的需求来吧。

2.获取弹幕所需要的数据。

要实现弹幕效果肯定需要有数据,这里就是发请求了。

获取数据时,要考虑数据量,一次不可能全部都获取,可以一次获取一部分,当数据要加载完的时候,再次请求数据。

这里要记录数据数据是否全部请求完成,如果请求完成,就可以不再发送数据,直接用之前获取的全部数据就可以了。

3.执行弹幕的函数。

弹幕数据获取后,就执行弹幕运行的函数,因为我在写弹幕函数的时候,设置了很多数据状态,这里就大概讲一下实现思路和关键部分代码。

弹幕函数包括的功能:

  1. 定时获取数据(判断数据是否加载完毕)

  2. 定时发射弹幕(判断通道是否闲置),传入弹幕所需要的内容,用户头像等。

  3. 创建dom内容,根据传参生成弹幕div,设置style属性,根据控制弹幕数据数组的下标将div插入对应的dom中。

  4. 采用定时器移动dom,这里是根据内容长度定义弹幕的移动速度。

  5. 移动弹幕的过程中判断四个通道是否处于闲置状态,当dom移动出了屏幕,移动dom并且清除定时器。

     function barrage(){//第一部分先判断数据是否加载完成 这里是一个定时器,设置为15秒。//如果数据还未加载完毕,就再次运行请求数据的接口,请求的页数可以 数组/每次请求的条数+1//数据加载完毕就清除定时器。(我将定时器都保存在vue 组件的data里面) 清除的时候clearInterval(this.data);//定时发射_this.barrageStatus.divStatus.intervalid=setInterval( selfTime,1100);function selfTime() { if(_this.dataNum>=_this.barrageStatus.data.length){//当dataNum大于等于数组的数量时,弹幕从头再来一遍_this.dataNum=0;}//设置四个通道的变量,当这几个变量为false的时候,才可发射if(divStatus.div1===false){//这里只演示其中一个变量divStatus.div1=true;_this.dataNum++;                        return barrageOut(_this.barrageStatus.data[_this.dataNum-1].content,_this.barrageStatus.data[_this.dataNum-1].commentator.headImgUrl,_this.dataNum);}};// 创建弹幕内容,自定义弹幕移动速度function barrageOut(text,imgUrl,num) { //text:弹幕的内容,imgUrl:用户的头像,num:数组的第几个if(num%4==1){ //根据数组下标 创建对应通道的节点 这里也演示其中一个barrageLayer=document.getElementById('barrageLayer1');}// 创建dom内容 定义dom style样式let divBox = document.createElement('div');let divBoxImg=document.createElement('span');let divBoxText=document.createElement('span');divBox.setAttribute('class','barrageDivClass');divBoxText.innerHTML=text;divBox.appendChild(divBoxImg);divBoxImg.setAttribute('class','barrageDivClass_img');divBoxImg.style.backgroundImage=`url(${imgUrl})`;divBox.appendChild(divBoxText);divBox.style.left=document.body.clientWidth+2000+'px';// 初始化left位置,一开始在屏幕的右侧barrageLayer.appendChild(divBox);// 定时器移动dom,形成弹幕let time,l=0;time= setInterval(function(){if(text.length<15){ // 这里可以根据需求自定义弹幕加载的速度l=l-1;}else{l=l-2;}//通过减少left属性移动这个div 从右往左移动divBox.style.left = document.body.clientWidth+l+'px';let delDiv=()=>{if(num%4==1){ //在移动弹幕的过程中判断四个通道是否处于闲置状态 这里只演示其中一个barrageLayer=document.getElementById('barrageLayer1');if(barrageLayer.childNodes.length<2){//判断弹幕数量,如果小于2,设为false,上面的定时器可以继续发射弹幕divStatus.div1=false;}else{divStatus.div1=true;}}}}if( l <= (0-divBox.offsetWidth-120) ){ if(_this.barrageStatus.divStatus.switch==true){ //弹幕开关delDiv();if(l <= (0-divBox.offsetWidth-document.body.clientWidth) ){//不断减少left属性,当小于这个内容的宽度,并且滚了120的时候barrageLayer.removeChild(divBox); //移除domclearInterval(time);//清除这个div的定时器}}else{clearInterval(time);//清除这个div的定时器}}},20)}}
    复制代码

结语

这个弹幕需求,我是如上这么实现的,回头看看实现,发现还是有不少地方可以优化和拆分的,如果有更好的实现思路和本文有哪些错误,欢迎在评论区下面留言。

希望看完的朋友可以点个喜欢/关注,您的支持是对我最大的鼓励。

最后:如需转载,请放上原文链接并署名。码字不易,感谢支持!本人写文章本着交流记录的心态,写的不好之处,不撕逼,但是欢迎指点。

个人blog and 掘金个人主页

关注我的订阅号,来一起学习成长。

以上2018.4.29

参考资料:

纯js 实现弹幕效果

前端将数据转化为弹幕效果的实现方式相关推荐

  1. 使用css绘制弹幕,实现弹幕效果的方法总结(css和canvas)

    这篇文章主要介绍了关于实现弹幕效果的方法总结(css和canvas) ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 之前在一个移动端的抽奖页面中,在抽奖结果的展示窗口需要弹幕轮播显示 ...

  2. 如何把python可视化到前端_python数据可视化的效果如何在web页面中展示_北京可视化股票...

    有什么APP可以展示可视化的任务进度 可视化任务进度软件,使用敬业签,具体可视有事项开始时间,进度及人.还有结束时间以及人员处理速等等,更多功能如下: 1.敬业签是一款功能比较全面的桌面便签软件,分为 ...

  3. html前端实现led样式数字的效果(数码管效果展示数据)

    前端实现led样式数字的效果 前言 效果图 实现代码 使用方式 html代码 该工具类使用面向对象的思想来实现该功能:而我认为每一个数字是应该对象,即"123"是应该对象,&quo ...

  4. java controller json_springMVC的controller层接收前端json数据

    1.前端的操作: 对象接收json数据方式:将所需要传的数据转化为json数据,并将这些数据以post方式传到后台的controller层,然后controller层接收json数据,并且是以对象的形 ...

  5. python转义引号的作用_python传到前端的数据,双引号被转义的问题

    python部分 def mallTemplateConfig(request): gameRole_edit = request.session.get('gameRole_edit', []) # ...

  6. 年货来咯:精选年度最受欢迎干货,覆盖客户端、服务端、前端、数据、算法……...

    ????新年将至,年味渐浓.???? ????闲鱼技术年货,如期而至.???? 从2018年春到今天,我们共发布了216篇原创技术文章,开设在公众号.掘金.知乎.头条.facebook.twitter ...

  7. 基于jQuery实现弹幕效果

    效果如下: HTML: <div class="dmbg"> <div class="dmHt"> <img src=" ...

  8. 3种方法实现弹幕效果

    本文实现弹幕效果的三种方法:1.Canvas实现 2.Jquery实现 3.js原生实现 1.Canvas弹幕实现 借鉴于:https://segmentfault.com/a/11900000117 ...

  9. android实现弹幕功能,Android实现自定义的弹幕效果

    一.效果图 先来看看效果图吧~~ 二.实现原理方案 1.自定义ViewGroup-XCDanmuView,继承RelativeLayout来实现,当然也可以继承其他三大布局类哈 2.初始化若干个Tex ...

最新文章

  1. Matlab数据类型学习图解
  2. boost::test模块测试可变参数样本元素支持和数据集定义的移动语义
  3. 如何通过Maven的Jetty插件运行Web工程
  4. 夯实基础,彻底掌握js的核心技术(四):ES5、ES6对象方法详解
  5. python更改当前工作路径
  6. 安装jdk时更改java安装路径_JDK下载安装步骤
  7. mysql之查询某段时间范围的数据
  8. 使用Reaver破解开启了WPS功能的wifi密码(wpa/wpa2)
  9. 手把手带你玩转Spark机器学习-深度学习在Spark上的应用
  10. bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠
  11. python svm核函数_Python.SVM(三)核方法
  12. Sonic 开源移动端云真机测试平台 - 用例编写与回放流程实例演示,任务定时执行、图像相似度定位、公共步骤、公共参数、测试套件等
  13. CAD参数绘制直线(网页版)
  14. a modern epidemic
  15. mysql中selec sum返回null的解决方法
  16. 大脑状态的重构与认知行为之间的映射
  17. python什么证书最有价值,python哪个证书含金量高
  18. vCenter中上传镜像到存储失败
  19. mdk工程的批量操作文件
  20. 常用的android开发框架有哪些

热门文章

  1. javascript同级遍历_有用的DOM遍历方法,你需要了解一下
  2. mysql数据库帐户_MySQL数据库用户帐号管理基础知识详解
  3. 乐源机器人优点跟缺点_机床实现自动化上下料选桁架机械手还是关节机器人好?...
  4. Android Volley完全解析3:定制自己的Request
  5. day02: SQL_DML, oracle中sql的各种查询
  6. tableau使用需要收费吗_使用苹果手机时,这些需要注意的点,你都知道吗?
  7. activex for chrome 网银助手_这 10 款插件让你的 Chrome 更好用
  8. mysql 工具_MySQL压力测试工具,值得收藏
  9. php链接页面时加..,怎么给一个PHP密码访问页面加超链接
  10. errorgetlast php,php error_clear_last()函数与error_get_last()函数