js cavans实现静态滚动弹幕


Posted in Javascript onMay 21, 2020

本文实例为大家分享了js实现静态滚动弹幕的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <!-- 弹幕文字 -->
<div class="video-x"></div> 
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
// 弹幕
 var dataBarrage = [{
  value: "使用的是静态死数据",
  color: "blue",
  range: [0, 0.5]
 },
 {
  value: "随机循环播放",
  color: "blue",
  range: [0, 0.6]
 },
 {
  value: "可以控制区域和垂直分布范围",
  color: "blue",
  range: [0, 0.5]
 },
 {
  value: "字体大小和速度在方法内设置",
  color: "black",
  range: [0.1, 1]
 },
 {
  value: "适合用在一些静态页面上",
  color: "black",
  range: [0.2, 1]
 },
 {
  value: "基于canvas实现",
  color: "black",
  range: [0.2, 0.9]
 },
 {
  value: "因此IE9+浏览器才支持",
  color: "black",
  range: [0.2, 1]
 },
 {
  value: "可以设置边框颜色",
  color: "black",
  range: [0.2, 1]
 },
 {
  value: "文字颜色默认都是白色",
  color: "black",
  range: [0.2, 0.9]
 },
 {
  value: "若文字颜色不想白色",
  color: "black",
  range: [0.2, 1]
 },
 {
  value: "需要自己调整下JS",
  color: "black",
  range: [0.6, 0.7]
 },
 {
  value: "如果需要的是真实和视频交互的弹幕",
  color: "black",
  range: [0.2, 1]
 },
 {
  value: "可以回到原文",
  color: "black",
  range: [0, 0.9]
 },
 {
  value: "查看另外一个demo",
  color: "black",
  range: [0.7, 1]
 },
 {
  value: "下面就是占位弹幕了",
  color: "black",
  range: [0.7, 0.95]
 },
 {
  value: "前方高能预警!!!",
  color: "orange",
  range: [0.5, 0.8]
 },
 {
  value: "前方高能预警!!!",
  color: "orange",
  range: [0.5, 0.9]
 },
 {
  value: "前方高能预警!!!",
  color: "orange",
  range: [0, 1]
 },
 {
  value: "前方高能预警!!!",
  color: "orange",
  range: [0, 1]
 }
 ]; 
// 弹幕方法
 var canvasBarrage = function (canvas, data) {
 if (!canvas || !data || !data.length) {
  return;
 }
 if (typeof canvas == "string") {
  canvas = document.querySelector(canvas);
  canvasBarrage(canvas, data);
  return;
 }
 var context = canvas.getContext("2d");
 // canvas.width = '';
 // canvas.height = '';

 // 存储实例
 var store = {};

 // 字号大小
 var fontSize = 12;

 // 实例方法
 var Barrage = function (obj, index) {
  // 随机x坐标也就是横坐标,对于y纵坐标,以及变化量moveX
  this.x = (1 + (index * 0.1) / Math.random()) * canvas.width;
  this.y =
  obj.range[0] * canvas.height +
  (obj.range[1] - obj.range[0]) * canvas.height * Math.random() +
  36;
  if (this.y < fontSize) {
  this.y = fontSize;
  } else if (this.y > canvas.height - fontSize) {
  this.y = canvas.height - fontSize;
  }
  this.moveX = 1 + Math.random() * 3;

  this.opacity = 0.8 + 0.2 * Math.random();
  this.params = obj;

  this.draw = function () {
  var params = this.params;
  // 根据此时x位置绘制文本
  context.strokeStyle = params.color;
  context.font =
   "bold " + fontSize + 'px "microsoft yahei", sans-serif';
  context.fillStyle = "rgba(255,255,255," + this.opacity + ")";
  context.fillText(params.value, this.x, this.y);
  context.strokeText(params.value, this.x, this.y);
  };
 };

 data.forEach(function (obj, index) {
  store[index] = new Barrage(obj, index);
 });

 // 绘制弹幕文本
 var draw = function () {
  for (var index in store) {
  var barrage = store[index];
  // 位置变化
  barrage.x -= barrage.moveX;
  if (barrage.x < -1 * canvas.width * 1.5) {
   // 移动到画布外部时候从左侧开始继续位移
   barrage.x = (1 + (index * 0.1) / Math.random()) * canvas.width;
   barrage.y =
   (barrage.params.range[0] +
    (barrage.params.range[1] - barrage.params.range[0]) *
    Math.random()) *
   canvas.height;
   if (barrage.y < fontSize) {
   barrage.y = fontSize;
   } else if (barrage.y > canvas.height - fontSize) {
   barrage.y = canvas.height - fontSize;
   }
   barrage.moveX = 1 + Math.random() * 3;
  }
  // 根据新位置绘制圆圈圈
  store[index].draw();
  }
 };

 // 画布渲染
 var render = function () {
  // 清除画布
  context.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制画布上所有的圆圈圈
  draw();

  // 继续渲染
  requestAnimationFrame(render);
 };

 render();
 };
 
 var canvas = '<canvas id="canvasBarrage" class="canvas-barrage"></canvas>'
 $('.video-x').html(canvas);
 canvasBarrage("#canvasBarrage", dataBarrage);
 }) 
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js获取图片长和宽度的代码
Nov 24 Javascript
js检验密码强度(低中高)附图
Jun 05 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
JavaScript中的原型链prototype介绍
Dec 30 Javascript
jQuery功能函数详解
Feb 01 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
基于jQuery实现返回顶部实例代码
Jan 01 Javascript
AngularJS路由Ui-router模块用法示例
May 29 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
Aug 25 Javascript
Vue登录主页动态背景短视频制作
Sep 21 Javascript
ES6 async、await的基本使用方法示例
Jun 06 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 #Javascript
JavaScript实现HSL拾色器
May 21 #Javascript
js实现拾色器插件(ColorPicker)
May 21 #Javascript
原生js实现日期选择插件
May 21 #Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 #Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 #Javascript
记一次用ts+vuecli4重构项目的实现
May 21 #Javascript
You might like
PHP新手上路(十四)
2006/10/09 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
Javascript &amp; DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
python字典基本操作实例分析
2015/07/11 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
班组长安全生产职责
2013/12/16 职场文书
爱情保证书范文
2014/02/01 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python
《废话连篇——致新手》——chinapizza
2022/04/05 无线电