canvas 弹幕效果(实例分享)


Posted in Javascript onJanuary 11, 2017

话不多说,请看代码

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <canvas style="width: 1280px;height: 720px;background-color: rgba(0,0,0,0.2)">你的浏览器不支持canvas</canvas>
</body>
<script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script>
<script>
 (function ($) {
 function Barrager(dom) {
 this.canvas = dom.get(0);
 this.ctx = this.canvas.getContext("2d");
 this.msgs = new Array(300);//缓冲池,长度越大,屏幕上显示的就越多
 this.width = 1280;//canvas分辨率1280*720
 this.height = 720;
 this.canvas.width=this.width;//上边的两步可以省略,直接在这里赋值
 this.canvas.height=this.height;
 this.font = "30px 黑体";//字体和字体大小
 this.ctx.font=this.font;
 //颜色数组,在绘制过程中随机从这里取出颜色
 this.colorArr=["Olive","OliveDrab","Orange","OrangeRed","Orchid","PaleGoldenRod","PaleGreen","PaleTurquoise","PaleVioletRed","PapayaWhip","PeachPuff","Peru","Pink","Plum","PowderBlue","Purple","Red","RosyBrown","RoyalBlue","SaddleBrown","Salmon","SandyBrown","SeaGreen","SeaShell","Sienna","Silver","SkyBlue"];
 this.interval = "";
 this.draw = function () {//绘制方法
  if (this.interval != "")return;
  var _this=this;
  this.interval = setInterval(function () {//每隔20毫秒重新绘制一次,间隔最好小于40,要不然效果就跟播放图片差不多
  //1,清除屏幕
  _this.ctx.clearRect(0, 0, _this.width, _this.height);
  _this.ctx.save();
  //2,循环缓冲区域,把没有设置Left,Top,Speed,Color先赋值,赋值的就改变left值(产生移动效果),left值小于200就会从缓冲区移除
  for (var i = 0; i < _this.msgs.length; i++) {
   if (!(_this.msgs[i] == null || _this.msgs[i] == "" || typeof(_this.msgs[i]) == "undefined")) {
   if(_this.msgs[i].L==null || typeof(_this.msgs[i].L)=="undefined"){
    _this.msgs[i].L=_this.width;
    _this.msgs[i].T=parseInt(Math.random() * 700);
    _this.msgs[i].S=parseInt(Math.random() * (10 - 4) + 4);
    _this.msgs[i].C=_this.colorArr[Math.floor(Math.random() * _this.colorArr.length)];
   }else{
    if(_this.msgs[i].L<-200){
    _this.msgs[i]=null;
    }else {
    _this.msgs[i].L=parseInt(_this.msgs[i].L-_this.msgs[i].S);
    _this.ctx.fillStyle =_this.msgs[i].C;
    _this.ctx.fillText(_this.msgs[i].msg,_this.msgs[i].L,_this.msgs[i].T);
    _this.ctx.restore();
    }
   }
   }
  }
  }, 20);
 };
 //添加数据,数据格式[{"msg":"nihao"}]
 this.putMsg = function (datas) {//循环缓冲区,把位置是空的装填上数据
  for (var j = 0; j < datas.length; j++) {
  for (var i = 0; i < this.msgs.length; i++) {
   if (this.msgs[i] == null || this.msgs[i] == "" || typeof(this.msgs[i]) == "undefined") {
   this.msgs[i] = datas[j];
   break;
   }
  }
  }
  this.draw();
 };
 this.clear = function () {//清除定时器,清除屏幕,清空缓冲区
  clearInterval(this.interval);
  this.interval="";
  this.ctx.clearRect(0, 0, this.width, this.height);
  this.ctx.save();
  for(var i=0;i<this.msgs.length;i++){
  this.msgs[i]=null;
  }
 };
 }
 $.fn.barrager = function (para) {
 if (typeof(para)=="string") {
  try{
  var api = $(this).data('barrager_api');
  api[para].apply(api);
  }catch (e){}
 } else if (typeof para == 'object' || !para) {
  $this = $(this);
  if ($this.data('barrager_api') != null && $this.data('barrager_api') != ''){
  var api = $this.data('barrager_api');
  api.putMsg(para);
  }else{
  var api = new Barrager($this);
  $this.data('barrager_api', api);
  api.putMsg(para);
  }
 } else {
  $.error('Method ' + method + ' does not exist on jQuery.slidizle');
 }
 return this;
 }
})(jQuery);
</script>
<script>
 // $('canvas').barrager([{"msg":"这是我发的。。。哈哈哈"}]);// 发送弹幕
 
 $('canvas').barrager([{"msg":"看着不错。。。。"},{"msg":"哈哈哈。。。。"},{"msg":"不错不错。。"},{"msg":"真好看。。。。"}]);//多条发送方式

 // $('canvas').barrager("clear"); //清除/关闭弹幕
</script>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript对象之内置对象Math使用方法
Apr 16 Javascript
iframe子页面与父页面在同域或不同域下的js通信
May 07 Javascript
Javascript 中创建自定义对象的方法汇总
Dec 04 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
去除字符串左右两边的空格(实现代码)
May 12 Javascript
微信小程序 框架详解及实例应用
Sep 26 Javascript
javascript实现获取图片大小及图片等比缩放的方法
Nov 24 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
bootstrap table.js动态填充单元格数据的多种方法
Jul 18 Javascript
基于Vue的侧边目录组件的实现
Feb 05 Javascript
关于vue-cli3打包代码后白屏的解决方案
Sep 02 Javascript
JQuery实现动态操作表格
Jan 11 #Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 #Javascript
JavaScript中的call和apply的用途以及区别
Jan 11 #Javascript
Vue数据驱动模拟实现2
Jan 11 #Javascript
jQuery实现对象转为url参数的方法
Jan 11 #Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 #Javascript
移动端界面的适配
Jan 11 #Javascript
You might like
浅谈json_encode用法
2015/03/05 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
Javascript typeof 用法
2008/12/28 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
Vue组件化通讯的实例代码
2017/06/23 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
python的sorted用法详解
2019/06/25 Python
python多线程并发实例及其优化
2019/06/27 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
法人委托书范本
2014/09/15 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
宿舍管理制度范本
2015/08/07 职场文书
小学二年级语文教学反思
2016/03/03 职场文书