h5怎样通过canvas来实现滚动弹幕功能

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

最近在着手开发弹幕视频网站,通过html5中的canvas实现了弹幕的功能。

那么闲言碎语不要讲,先说思路后上代码。

思路:从注意事项上来说就是将一块画布覆盖在了video标签产生的视频窗口之上,使用注意事项就能实现了。最重要的就是js控制画布上弹幕的显示了,每一个弹幕都包装成一个对象,对象包含的属性有弹幕应该出现的时间,弹幕的颜色,弹幕是否是移动的以及弹幕的文本。弹幕对象拥有方法包含:设置弹幕的横纵坐标,弹幕的移动函数。实现的原理,在监听视频开始播放的事件,在视频开始播放时生成一个定时器,定时器每隔一个时间去遍历循环弹幕对象数组并根据对象的属性在画布的适当位置上绘制出弹幕,计时器中除了绘制弹幕的代码还有执行更新弹幕数组的代码。

那么下面开始直接上代码:

(function () {    window.onload=function () {        var video = document.getElementsByTagName("video")[0]        var cav = document.getElementsByTagName("canvas")[0]        //设置常量canvas的高度以及宽度        var cavWidth = 800        var cavHeight = 420        cav.width=cavWidth        cav.height=cavHeight        var ctx = cav.getContext("2d")        //存储弹幕对象的数组        var capObjs = []        var lastItemTime        var capHeight = 20        var inputEle = document.getElementsByClassName("caption-input-text")[0]        var sendEle = document.getElementsByClassName("caption-sendButton")[0]        var colorUl = document.getElementsByClassName("colorItems")[0]        var ismoveInputEle = document.getElementsByClassName("caption-input-ismove")[0]        //弹幕颜色        var colors=["#fff","#FFCCCC","#CCFFCC","#CCCCFF","#FFFFCC","#CCFFFF"]        var selectedColorIndex = 0        var prevPlayTime = 0        //测试数据的数组        var testArrayCopy = []        var capobjId = 0        //弹幕在画布中高度可能值组成的数组        var topObjs = [{blank:true , value : 20 ,index:0},                        {blank:true , value : 50 ,index:1},                        {blank:true , value : 80 ,index:2},                        {blank:true , value : 110 ,index:3},                        {blank:true , value : 140 ,index:4},                        {blank:true , value : 170 ,index:5},                        {blank:true , value : 200 ,index:6},                        {blank:true , value : 230 ,index:7},                        {blank:true , value : 260 ,index:8},                        {blank:true , value : 290 ,index:9},                        {blank:true , value : 320 ,index:10},                        {blank:true , value : 350 ,index:11},                        {blank:true , value : 380 ,index:12},                        {blank:true , value : 410 ,index:13}]//test data 测试数据var testArray = [{content:"ABCDEFGHIJKLMNOPQRSTUVWXYZ",time:"1",ismove:false,colorIndex:0},{content:"233333333333333",time:"2",ismove:true,colorIndex:0},{content:"干杯,哈哈哈~~~~~~",time:"2",ismove:true,colorIndex:5},{content:"干杯,哈哈哈~~~~~~",time:"2",ismove:true,colorIndex:4},{content:"干杯,哈哈哈~~~~~~",time:"2",ismove:true,colorIndex:4},{content:"干杯,哈哈哈~~~~~~",time:"2",ismove:true,colorIndex:0},{content:"干杯,哈哈哈~~~~~~",time:"2",ismove:true,colorIndex:0},{content:"233333333333333",time:"3",ismove:true,colorIndex:0},{content:"233333333333333",time:"3",ismove:true,colorIndex:0},{content:"233333333333333",time:"3",ismove:true,colorIndex:0},{content:"233333333333333",time:"3",ismove:true,colorIndex:0},{content:"233333333333333",time:"3",ismove:true,colorIndex:0},{content:"233333333333333",time:"3",ismove:true,colorIndex:0},{content:"233333333333333",time:"4",ismove:false,colorIndex:0},{content:"233333333333333",time:"5",ismove:true,colorIndex:4},{content:"233333333333333",time:"6",ismove:true,colorIndex:2},{content:"233333333333333",time:"7",ismove:true,colorIndex:2},{content:"233333333333333",time:"7",ismove:true,colorIndex:2},{content:"233333333333333",time:"7",ismove:true,colorIndex:2},{content:"233333333333333",time:"7",ismove:true,colorIndex:2},{content:"233333333333333",time:"7",ismove:true,colorIndex:2},{content:"233333333333333",time:"7",ismove:true,colorIndex:2},{content:"233333333333333",time:"8",ismove:true,colorIndex:0},{content:"233333333333333",time:"9",ismove:true,colorIndex:0},{content:"233333333333333",time:"10",ismove:true,colorIndex:0},{content:"老师说的非常好,我要好好学习了》》》》",time:"12",ismove:true,colorIndex:0},{content:"老师说的非常好,我要好好学习了》》》》",time:"13",ismove:true,colorIndex:0},{content:"老师说的非常好,我要好好学习了》》》》",time:"14",ismove:true,colorIndex:2},{content:"老师说的非常好,我要好好学习了》》》》",time:"15",ismove:false,colorIndex:0},{content:"老师说的非常好,我要好好学习了》》》》",time:"16",ismove:true,colorIndex:2},{content:"老师说的非常好,我要好好学习了》》》》",time:"17",ismove:true,colorIndex:3},{content:"老师说的非常好,我要好好学习了》》》》",time:"18",ismove:true,colorIndex:2},{content:"老师说的非常好,我要好好学习了》》》》",time:"19",ismove:true,colorIndex:0},{content:"老师说的非常好,我要好好学习了》》》》",time:"20",ismove:true,colorIndex:3},{content:"老师说的非常好,我要好好学习了》》》》",time:"21",ismove:true,colorIndex:0},{content:"老师说的非常好,我要好好学习了》》》》",time:"22",ismove:true,colorIndex:0},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"23",ismove:true,colorIndex:0},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"24",ismove:true,colorIndex:0},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"25",ismove:true,colorIndex:3},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"26",ismove:true,colorIndex:0},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"27",ismove:true,colorIndex:5},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"28",ismove:false,colorIndex:5},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"29",ismove:true,colorIndex:5},{content:"老铁们,小礼物走一波了,小汽车小火箭刷起来吧=========",time:"30",ismove:true,colorIndex:5},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"31",ismove:true,colorIndex:5},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"32",ismove:true,colorIndex:2},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"33",ismove:true,colorIndex:2},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"33",ismove:true,colorIndex:5},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"34",ismove:true,colorIndex:5},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"35",ismove:true,colorIndex:5},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"36",ismove:true,colorIndex:2},{content:"马上就下课了,瓦罗蓝大陆走起了~~~",time:"37",ismove:true,colorIndex:2}]        //将测试数据备份        copyArray(testArray , testArrayCopy)        /*弹幕对象的构造函数,参数分别是:1.ismove:弹幕是否是移动的弹幕,2.spe:弹幕的移动速度,3.col:弹幕的颜色,4.text:弹幕的文本*/        /*原型链方法 setTopValue设置纵坐标,setLeftValue设置横坐标,moving完成坐标的改变,setId完成id值的设置*/        function Caption( ismove , spe , col , text ) {            this.isMove = ismove            this.speed = spe            this.color = col || "#ff0"            this.content = text            this.latestTime = 0            this.width = text.length * 20            this.id = 0            this.topIndex = 0            this.occupyPos = true            this.top = 300            this.left = 0            this.setLeftValue()            this.setTopValue()        }        Caption.prototype.setTopValue = function  () {            for(var i = 0 ,len = topObjs.length ; i  450) {                    topObjs[this.topIndex].blank = true                }            }        }        Caption.prototype.setId = function  () {            this.id = capobjId            capobjId++        }         var cap1 = new Caption(  false , 1 , 0 , "小礼物走一波,双击6666。。。。")        capObjs.push(cap1)        cap1.setId()                 //循环遍历数组,根据对象的属性绘制在画布上        function drawAllText () {            ctx.clearRect( 0 , 0 , cavWidth , cavHeight)            ctx.beginPath()            for(var i=0 , len = capObjs . length ; i = 0; i--) {                if (objs[i].left  450 ) {                    objs.splice(i , 1)                }             }        }                 //更新保存弹幕对象的数组        function updateArray () {            var now = parseInt( video.currentTime )            for (var i = testArray.length - 1; i >= 0; i--) {                var nowItemTime = parseInt(testArray[i].time)                if ( nowItemTime == now ) {                    //首次写的控制高度的方式,空间利用不充分,后来改为setTopValue中的方式                    // var nowItemLeft = getLeftValue(testArray[i])                    // var diffTime = Math.abs(nowItemTime - lastItemTime)                    // if (diffTime  400 ? 20 : capHeight                    // }                       var temcolor = colors[testArray[i].colorIndex]                    var temcap = new Caption (  testArray[i].ismove , 1 , temcolor , testArray[i].content  )                    capObjs.push(temcap)                    capObjs[capObjs.length - 1].setId()                    temcap = null                    testArray.splice(i,1)                }            }        }                 //当用户点击send发送弹幕的回调函数        function sendCaption (argument) {            var inputEleTxt = inputEle.value            var now = parseInt( video.currentTime )            var inputIsmoveValue = ismoveInputEle.checked            var temObj = {content:inputEleTxt,time:now,ismove:inputIsmoveValue,colorIndex:selectedColorIndex}            testArray.push(temObj)            inputEle.value = ""        }         // function getLeftValue (obj) {        //     if (obj.ismove) {        //         return 0        //     }        //     else {        //         var contentLength = obj.content.length        //         var nowItemLeft = 420 - contentLength * 9        //         return nowItemLeft        //     }        // }                 //重新启动canvas,用在人为导致进度条时间的改变        function reinitCav (argument) {            // testArray = testArrayCopy            copyArray(testArrayCopy , testArray)            capObjs = []            capHeight = 0            clearInterval(canvasTimer)            canvasTimer = null            initCanvas()        }         var canvasTimer = null                 //初始化canvas,用在开始播放时         function initCanvas () {             if (canvasTimer == null ) {                canvasTimer = setInterval(function (argument) {                    drawAllText()                    updateArray()                    refreshObjs(capObjs)                },10)             }                     }//end function initCanvas                 //复制数组        function copyArray (arr1 , arr2) {            for (var i =0 , len=arr1.length ; i  1) {                reinitCav()            }        }, false)                 //视频暂停执行代码        video.addEventListener("pause" , function () {            clearInterval(canvasTimer)            canvasTimer = null        })                 //点击send的监听事件        sendEle.addEventListener("click" , sendCaption)                 //input的回车监听事件        inputEle.addEventListener("keydown", function(e) {            var keynum = 0            keynum = window.event ? e.keyCode : e.which            if (keynum == 13) {                sendCaption()            }        })          var aaaa = function() {            alert(1)        }        aaaa()        // function b(aaaa){        //     return aaaa()        // }        // b()       }//end})()

登录后复制

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

相关阅读:

注意事项

注意事项

注意事项

以上就是h5怎样通过canvas来实现滚动弹幕功能的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3194426.html

(0)
上一篇 2025年4月1日 01:56:52
下一篇 2025年3月8日 21:01:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • H5的拖放应该如何实现

    这次给大家带来h5的拖放应该如何实现,实现h5拖放效果应该的注意事项有哪些,下面就是实战案例,一起来看一下。 简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置。 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。 先点击一…

    编程技术 2025年4月1日
    000
  • 用H5和C3实现简单的时钟效果

    这次给大家带来用h5和c3实现简单的时钟效果,用h5和c3实现简单的时钟效果的注意事项有哪些,下面就是实战案例,一起来看一下。 目的: 利用html5,css实现钟摆效果 知识点: 1) 利用注意事项/left/top和calc()实现元素…

    编程技术 2025年4月1日
    100
  • h5如何实现记住密码功能

    这次给大家带来h5如何实现记住密码功能,h5实现记住密码功能的注意事项有哪些,下面就是实战案例,一起来看一下。 HTML5 提供了两种在客户端存储数据的新方法: localStorage – 没有时间限制的数据存储 sessio…

    编程技术 2025年4月1日
    100
  • H5的本地存储和本地数据库详细介绍

    这次给大家带来h5的本地存储和本地数据库详细介绍,使用h5的本地存储和本地数据库的本地数据库有哪些,下面就是实战案例,一起来看一下。 本地存储 1.1 本地存储由来的背景 由于HTML4时代Cookie的大小、格式、存储数据格式等限制,网站…

    编程技术 2025年4月1日
    100
  • 怎样用h5的sse服务器发送EventSource事件

    这次给大家带来怎样用h5的sse服务器发送eventsource事件,用h5的sse服务器发送eventsource事件的事件有哪些,下面就是实战案例,一起来看一下。 前言 我前面文章讲过数据大屏,里面的数据时时事件。还有时时更新的股票数据…

    编程技术 2025年4月1日
    100
  • h5怎样实现输入框提示语+正常文本框提示语

    这次给大家带来h5怎样实现输入框提示语+正常文本框提示语,实现h5的输入框提示语+正常文本框提示语的注意事项有哪些,下面就是实战案例,一起来看一下。 登录后复制 placeholder=”  请输入用户名/手机号”;…

    编程技术 2025年4月1日
    100
  • h5和c3怎样做出太阳系行星运转的动画效果

    这次给大家带来h5和c3怎样做出太阳系行星运转的动画效果,用h5和c3做出太阳系行星运转动画效果的注意事项有哪些,下面就是实战案例,一起来看一下。 做一个太阳系八大行星的运转动画,不包括行星的卫星,所有行星围绕太阳公转,行星采用纯色,暂时没…

    编程技术 2025年4月1日
    100
  • 在js中如何将canvas生成图片保存

    下面我就为大家分享一篇js 将canvas生成图片保存,或直接保存一张图片的实现方法,具有很好的参考价值,希望对大家有所帮助。 将canvas数组保存 function downLoadImage(canvas,name) {  var a…

    编程技术 2025年3月31日
    100
  • 使用JS+canvas如何制作圆锥

    本篇文章给大家讲解html中用canvas函数配合js画出一个圆锥形的图形实例,有需要的朋友学习测试下吧。 以下是我们给大家分享是实例代码: 我的第一个 HTML 页面const cvs =document.getElementById(&…

    2025年3月31日
    100
  • 2017最好用的10种html5(h5)应用开发工具推荐

    制作一个漂亮的HTML5页面少不了HTML5应用开发工具!一般h5页面都用什么开发工具呢?本文将为你推荐2017年10款好用的html5页面制作工具!最后附上部分html5开发工具供您下载使用。 HTML5自诞生以来,作为新一代的Web标准…

    2025年3月31日 编程技术
    100

发表回复

登录后才能评论