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 相关文章推荐
node.js中的fs.lchown方法使用说明
Dec 16 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
Jul 01 Javascript
JavaScript 继承详解(六)
Oct 11 Javascript
JavaScript用JSONP跨域请求数据实例详解
Jan 06 Javascript
js实现自定义进度条效果
Mar 15 Javascript
微信小程序中顶部导航栏的实现代码
Mar 30 Javascript
关于HTML5的data-*自定义属性的总结
May 05 Javascript
Vue.js 2.x之组件的定义和注册图文详解
Jun 19 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
Oct 30 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 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
PHP5多态性与动态绑定介绍
2015/04/03 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
JS常用算法实现代码
2016/11/14 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Python代码注释规范代码实例解析
2020/08/14 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
中软国际Java程序员笔试题
2014/07/19 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
节水倡议书范文
2014/04/15 职场文书
公共场所禁烟标语
2014/06/25 职场文书
公司员工活动策划方案
2014/08/20 职场文书
教师党员个人自我评价
2015/03/04 职场文书
院系推荐意见
2015/06/05 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python