怎样用HTML实现滚动弹幕功能

这次给大家带来怎样用html实现滚动弹功能,html实现滚动弹幕功能的注意事项有哪些,下面就是实战案例,一起来看一下。

主要的功能有;发送弹幕,设置弹幕的颜色,速度和类型,显示弹幕

已知缺陷:不能全屏

canvas没有做自适应
没有自定义播放器控件
没有根据播放时间显示相应的弹幕
弹幕不能实现悬停
已知的缺陷以后会进行改进。网上能找到的弹幕播放器的源码一般只做了滚动的弹幕而没有做静止的弹幕,这里我特意加上了静止弹幕的实现。

Canvas绘制文字以及文字滚动效果

立即学习“前端免费学习笔记(深入)”;

 整个播放器的核心就是绘制文字以及做文字滚动的动画,canvas中对于文字并没有很好的动画支持,只能通过自己实现,实现的思路就是不断的清屏然后重写文字,当清屏重写的频率达到24fps的时候就是流畅的动画了。

先在HTML文件中添加视频video标签和画布canvas标签

把canvas标签的位置样式设置为position:absolute然后视频和画布就重叠在一起,看起来就是一个弹幕播放器了。然后为画布添加弹幕相关的内容,首先获取画布的相关信息和设置画布的字体大小和字体样式

var c=document.getElementById("cv_video");//获取画布大小var c_height=c.height;var c_width=c.width;//获取画布ctx=c.getContext("2d");//设置字体样式ctx.font="25px DengXian";画布信息已经获取和设置,巧妇难为无米之炊,接着我们就要构造弹幕对象,使用的构造模式是动态原型模式//弹幕对象function Barrage(content,color,type,speed){    this.content=content;    this.color=color;    this.type=type;    this.speed=speed;    if(this.type=="default"){        this.height=parseInt(Math.random()*c_height)+10;    }else if (this.type=="static top"){        this.height=parseInt((c_height/2)-Math.random()*c_height/2)+10;    }else if (this.type=="static bottom"){        this.height=parseInt((c_height/2)+Math.random()*c_height/2)+10;    }    if(typeof this.move!="function"){        Barrage.prototype.move=function(){            if(this.type=="default"){                this.left=this.left-this.speed;            }        }    }}

构造的弹幕对象初始化了各种参数,包括内容,颜色,运动类型和速度,定义了move()方法来控制弹幕的缓动,每出发一次move()方法向左滚动一个单位speed的像素。
弹幕对象构造完成之后就进入到主题,动画的制作,直接上代码

//循环擦写画布实现动画效果setInterval(function(){    ctx.clearRect(0,0,c_width,c_height);    ctx.save();    for(var i=0;i<msgs.length;i++){        if(msgs[i]!=null){            if(msgs[i].type=="default"){                handleDefault(msgs[i]);            }else{                handleStatic(msgs[i]);           }        }    }},20)

每20ms执行一次擦写,ctx.clearRect(0,0,c_width,c_height);是将整张当前的画布清除,然后使用ctx.save()将当前的画布保存,接着遍历弹幕列表(msgs是弹幕列表,当每发送一条弹幕都会将该弹幕实例添加到列表中),然后按照默认样式的弹幕还是静止样式的弹幕分别处理。如果是默认样式的弹幕将会按照以下的方法处理

//处理默认弹幕样式function handleDefault(barrage){    if(barrage.left==undefined||barrage.left==null){        barrage.left=c.width;    }else{         if(barrage.left<-200){            barrage=null;        }else{            barrage.move()            ctx.fillStyle=barrage.color;            ctx.fillText(barrage.content,barrage.left,barrage.height)            ctx.restore();        }    } }

首先如果弹幕实例没有设置left属性则将画布的宽度赋予它,如果弹幕实例已经退出画布则将其置null以节省内存,否则的话就调用弹幕实例的move()方法改变left属性的值,然后设置文字的颜色,一级写入新的文字,恢复画布。这样就完成了一帧动画。

对于静止弹幕的实现方法如下

//处理静止弹幕样式function handleStatic(barrage){    ctx.moveTo(c_width/2,barrage.height);    ctx.textAlign="center";    ctx.fillStyle=barrage.color;    ctx.fillText(barrage.content,c_width/2,barrage.height);    if(barrage.left==undefined||barrage.left==null){        barrage.left=c.width;    }else{        if(barrage.left<-200){            ctx.fillText("",c_width/2,barrage.height);                           barrage=null;            //ctx.restore();            ctx.clearRect(0,0,c_width,c_height);               }else{            barrage.left=barrage.left-6;        }    }}

首先将画布的基点移动到画布的中心,需要注意的是这时候相对与生成了一张新的画布,原来画布的clearRect()方法已经不适用与这张画布了。然后再设置文字对齐为居中对齐,设置文字样式,填充文字。因为弹幕是静止的所以不需要进行缓动,但是静止弹幕也是会消失的,需要设置一个标志位来使他定时消失。在这里为了不占用额外的属性,我们直接使用left属性作为标志位,同样进行left属性的递减,但不把递减反映到画布中,当left达到阈值,则使用ctx.clearRect()方法将弹幕清除。这样就实现了静止弹幕的处理。

其他关于颜色,样式的设置有一定基础的人应该是很容易掌握的在这里就不多介绍了,自己看可运行代码部分理解一下就好。

总结

 这个项目主要是使用了canvas进行文字绘制以及实现文字的缓动动画,主要用到的方法有

canvasDom.getContext()canvas.save()/canvas.restore()canvas.clearRect()canvas.moveTo()

原来我对与save()和restore()是不能理解的,现在我算是有一点理解了,当你更改了画布状态,现在的画布就已经不是原来的画布,所以在修改画布状态之前先把画布状态保存,切换画布状态,完成工作之后,恢复为原来的画布状态继续工作。像我处理静态弹幕的时候,把画布的基点改变了,那么原来画布的清除方法就不再适用于当前画布,只有在当前画布中自己使用另外的清除方法。然后再恢复到原来的画布。

可运行代码

                Document    .pickdiv{        width: 30px;        height: 30px;        cursor: pointer;        border: 2px solid gray;        display: inline-block;    }    #white{        background: white;    }    #red{        background:#ff6666;    }    #yellow{        background:#ffff00;    }    #blue{        background:#333399;    }    #green{        background:#339933;    }    #cv_video{        position: absolute;        z-index: 1;    }    #barrageplayer{        position: relative;        display: block;        width: 900px;        height: 500px;    }    #v_video{        position: absolute;        width: 100%;        height: 100%;        z-index: 0;    }    
默认 静止顶部 静止底部
1X 2X 3X
var c=document.getElementById("cv_video"); var typeDom=document.getElementsByName("type"); var speedDom=document.getElementsByName("speed"); var colorpick=document.getElementById("colorpick"); var smsg=document.getElementById("smsg"); var color="#white"; var speed=1; var type="default"; var msgs=[]; //获取画布大小 var c_height=c.height; var c_width=c.width; //获取画布 ctx=c.getContext("2d"); ctx.font="25px DengXian"; //处理颜色选择 colorpick.addEventListener('click',function(event){ switch(event.target.id){ case "white": color="white"; break; case "red": color="#ff6666"; break; case "yellow": color="#ffff00"; break; case "green": color="#339933"; break; case "blue": color="#333399"; break; } }) //处理发送弹幕 document.getElementById("send").onclick=function(){ var text=smsg.value; for(var i=0;i<typeDom.length;i++){ if(typeDom[i].checked){ type=typeDom[i].value; break; } } for(var i=0;i<speedDom.length;i++){ if(speedDom[i].checked){ speed=2*parseInt(speedDom[i].value); break; } } var tempBarrage=new Barrage(text,color,type,speed); msgs.push(tempBarrage); } // //弹幕功能部分代码 // //弹幕对象 function Barrage(content,color,type,speed){ this.content=content; this.color=color; this.type=type; this.speed=speed; if(this.type=="default"){ this.height=parseInt(Math.random()*c_height)+10; }else if (this.type=="static top"){ this.height=parseInt((c_height/2)-Math.random()*c_height/2)+10; }else if (this.type=="static bottom"){ this.height=parseInt((c_height/2)+Math.random()*c_height/2)+10; } if(typeof this.move!="function"){ Barrage.prototype.move=function(){ if(this.type=="default"){ this.left=this.left-this.speed; } } } } //循环擦写画布实现动画效果 setInterval(function(){ ctx.clearRect(0,0,c_width,c_height); ctx.save(); for(var i=0;i<msgs.length;i++){ if(msgs[i]!=null){ if(msgs[i].type=="default"){ handleDefault(msgs[i]); }else{ handleStatic(msgs[i]); } } } },20) //处理默认弹幕样式 function handleDefault(barrage){ if(barrage.left==undefined||barrage.left==null){ barrage.left=c.width; }else{ if(barrage.left<-200){ barrage=null; }else{ barrage.move() ctx.fillStyle=barrage.color; ctx.fillText(barrage.content,barrage.left,barrage.height) ctx.restore(); } } } //处理静止弹幕样式 function handleStatic(barrage){ ctx.moveTo(c_width/2,barrage.height); ctx.textAlign="center"; ctx.fillStyle=barrage.color; ctx.fillText(barrage.content,c_width/2,barrage.height); if(barrage.left==undefined||barrage.left==null){ barrage.left=c.width; }else{ if(barrage.left<-200){ ctx.fillText("",c_width/2,barrage.height); barrage=null; //ctx.restore(); ctx.clearRect(0,0,c_width,c_height); }else{ barrage.left=barrage.left-6; } } }

相信看了这些案例你已经掌握了方法,更多精彩请关注创想鸟其它相关文章!

相关阅读:

怎样在HTML网页中插入视频

怎样做出HTML文本框只读效果

如何使用HTML+CSS做出鼠标划过就可以显示二级菜单栏

以上就是怎样用HTML实现滚动弹幕功能的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 17:03:04
下一篇 2025年12月21日 17:03:14

相关推荐

  • HTML图片的img标签怎样使用

    这次给大家带来html图片的img标签怎样使用,图片的img标签使用的注意事项有哪些,下面就是实战案例,一起来看一下。 说明 img 是 Image(图像)的缩写。src 属性用来指定图像的路径。 HTML4.01 里为了配合各种无法显示图像的浏览器和有声阅读浏览器,必须设定 标签里的 alt 属性…

    2025年12月21日 好文分享
    000
  • HTML怎样做出鼠标经停时(tr)变色

    次给大家带来html怎样做出鼠标经停时(tr)变色,html做出鼠标经停时(tr)变色的注意事项有哪些,下面就是实战案例,一起来看一下。 使用纯CSS实现在鼠标经过一个表格的某一行的时候,要整行的背景颜色发生变化,以表明该行正中焦点: change tr.change:hover { backgro…

    好文分享 2025年12月21日
    000
  • html怎样格式化json数据

    这次给大家带来html怎样格式化json数据,html格式化json数据的注意事项有哪些,下面就是实战案例,一起来看一下。 废话不多说了,直接给大家贴代码了,具体代码如下所示: JS Bin var json = {“hey”: “guy”,”anumber”: 243,”anobject”: {“…

    好文分享 2025年12月21日
    000
  • html怎样在消息按钮上增加数量角标

    这次给大家带来html怎样在消息按钮上增加数量角标,html在消息按钮上增加数量角标的注意事项有哪些,下面就是实战案例,一起来看一下。 onclick=”goMessage();” style=”width: 60px;height: 100%;color: wh…

    好文分享 2025年12月21日
    000
  • html怎样实现页面跳转时传递参数

    这次给大家带来html怎样实现页面跳转时传递参数,html怎样页面跳转时传递参数的注意事项有哪些,下面就是实战案例,一起来看一下。 a页面 点击跳转按钮后 在b页面可以获取到对应的值。 a页面 $(function(){ name = $(“#name”).text(); age = $(“#age…

    好文分享 2025年12月21日
    000
  • html、css和js的注释规范用法有哪些

    这次给大家带来html、css和js的注释规范用法有哪些,使用html、css和js的注释有哪些的注意事项有哪些,下面就是实战案例,一起来看一下。 添加必要的注释,对一个有责任心、有道德模范的前端必须具备的好习惯,可以大大提高代码的可维护性、可读性。首先大家需要熟悉一下html、css、js的注释的…

    好文分享 2025年12月21日
    000
  • 如何在html页面中做出查找功能

    这次给大家带来如何在html页面中做出查找功能,怎么在html页面中做出查找功能?在html页面中做出查找功能的注意事项有哪些,下面就是实战案例,一起来看一下。 最近在搞一个被很多人改了的框架,天天看代码看的头的晕了,不过感觉进步还挺大的,自己做了一个后台可配置前台查看两个库不同数据范围的东西,还挺…

    好文分享 2025年12月21日
    000
  • HTML的表单组件如何使用

    这次给大家带来html的表单组件如何使用,怎么使用html的表单组件?使用html的表单组件的注意事项有哪些,下面就是实战案例,一起来看一下。 HTML 表单用于搜集不同类型的用户输入。下文通过代码给大家分享html 表单组件实例代码,感兴趣的朋友参考下吧 废话不多说了,直接给大家贴代码了,具体代码…

    好文分享 2025年12月21日
    000
  • HTML实现抢票功能(设定时间打开抢票的页面)

    今天给大家介绍一份非常使用的功能,html实现抢票功能,也给大家提供解决方法,需要的朋友可以保存笔记了。 #result{ width:500px; border:1px solid #CCCCCC; background:#FFFFCC; margin:50px auto; font-size:2…

    好文分享 2025年12月21日
    000
  • 怎样用HTML做出移动端固定悬浮半透明搜索框

    这次给大家带来怎样用html做出移动端固定悬浮半透明搜索框,html做移动端固定悬浮半透明搜索框的注意事项有哪些,下面就是实战案例,一起来看一下。 Question. 问题 在移动端商城系统中,我们常常看到位于页面顶部有一个搜索框,这类搜索框博主比较喜欢的是固定在页面顶部,半透明悬浮,能依稀看见部分…

    好文分享 2025年12月21日
    000
  • html怎样格式化输出JSON数据

    这次给大家带来html怎样格式化输出json数据,html格式化输出json数据的注意事项有哪些,下面就是实战案例,一起来看一下。 将 json 数据以美观的缩进格式显示出来,借助最简单的 JSON.stringify 函数就可以了,因为此函数还有不常用的后面2个参数。 hello pre {out…

    好文分享 2025年12月21日
    000
  • 怎样做出HTML文本框只读效果

    这次给大家带来怎样做出html文本框只读效果,做出html文本框只读效果的注意事项有哪些,下面就是实战案例,一起来看一下。 相信看了这些案例你已经掌握了方法,更多精彩请关注创想鸟其它相关文章! 相关阅读: H5里图片中有缝隙应该如何解决 HTML5单页面手势滑屏切换如何实现 立即学习“前端免费学习笔…

    好文分享 2025年12月21日
    000
  • HTML实现海康摄像头实时监控功能_HTML/Xhtml_网页制作

    最近公司安排我做一个ccfa的小东东,其中有一项需求就是做一个网页播放摄像头的实时监控功能,对于我这个小菜鸟来说真是难到了,下面小编给大家带来了html实现海康摄像头实时监控功能,对html感兴趣的朋友一起看看吧 最近公司安排做CCFA的一些东西,有一项就是做一个网页播放摄像头的实时监控。网上百度了…

    2025年12月21日 好文分享
    000
  • HTML页面自动清理js、css文件的缓存(自动添加版本号)_HTML/Xhtml_网页制作

    这篇文章主要介绍了html页面自动清理js、css文件的缓存(自动添加版本号),小编觉得挺不错的,现在分享给大家html源码,也给大家做个参考。对html感兴趣的小伙伴们一起跟随小编过来看看吧  在web项目开发过程中,我们经常会引用css、js文件,更新文件后常出现缓存问题(明明更改了代码,在浏览…

    好文分享 2025年12月21日
    000
  • 关于HTML基本语法和语义写法规则与实例分析

    本文主要和大家分享对html基本语法和语义进行了整理与实例,需要的朋友可以参考下,希望能帮助到大家。 DOCTYPE DOCTYPE(Document Type) 该声明位于文档中最前面的位置,处于html标签之前,此标签告知浏览器文档使用哪种HTML或者 XHTML规范。 DTD(Document…

    好文分享 2025年12月21日
    000
  • HTML标签中行内元素和块级元素详解

    本文主要和大家详细介绍了html常用的标签中行内元素和块级元素,需要的朋友参考下吧,希望能帮助到大家。 块元素(block element) HTML标签分类明细      * address – 地址     * blockquote – 块引用     * center …

    好文分享 2025年12月21日
    000
  • HTML阻止iframe跳转页面并使用iframe在页面内嵌微信网页版详解

    winform结合html5能实现什么功能?突有心血来潮,想在里面嵌套一个微信网页版,下面小编给大家介绍下html阻止iframe跳转页面并使用iframe在页面内嵌微信网页版的实现方法,一起看看吧,希望能帮助到大家。 就想弄一个winform结合html5的一个小东西,突有兴致,想在里面嵌套一个微…

    2025年12月21日 好文分享
    000
  • html中form与表单提交操作的方法总结

    本文主要介绍了html中form元素与表单提交方面的知识,需要的朋友可以参考一下,希望能帮助到大家。 form元素 form元素的DOM接口是HTMLFormElement,继承自HTMLElement,因而它与其他的HTML元素拥有相同的默认属性,不过它自身还有几个独有的属性和方法: 属性值 说明…

    2025年12月21日
    000
  • 如何实现HTML中鼠标经停时整行(tr)变色

    本文主要介绍了html中实现鼠标经停时整行(tr)变色的相关资料,需要的朋友可以参考下,希望能帮助到大家。 使用纯CSS实现在鼠标经过一个表格的某一行的时候,要整行的背景颜色发生变化,以表明该行正中焦点: change tr.change:hover { background-color:#00FF…

    好文分享 2025年12月21日
    000
  • html实现在消息按钮上增加数量角标的实现代码

    我们知道微信或者qq在有未读消息的时候,就会有红色的数量提示,本文主要介绍了html在消息按钮上增加数量角标的实现代码,需要的朋友可以参考下,希望能帮助到大家。 html代码: 消息4 css代码: /*角标 */ .ii{ display: none; background: #f00; bord…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信