canvas实现爱心和彩虹雨效果


Posted in Javascript onMarch 09, 2017

效果图:

canvas实现爱心和彩虹雨效果

代码如下:

<!doctype html>
 <html>
 <head>
 <meta charset="utf-8">
 <title></title>
 </head>
 <body>
 <canvas id="canvas"></canvas>
 <script>
 var canvas = document.getElementById('canvas'),
 ctx = canvas.getContext('2d'),
 canvasW = canvas.width = window.innerWidth,
 canvasH = canvas.height = window.innerHeight,
 canvasWHalf = canvasW / 2,
 canvasHHalf = canvasH / 2,
 xoff = canvasWHalf - 306,
 yoff = 50,
 bg = '00061a',
 id = 0,
 raindrops = [],
 minSize = 1,
 maxSize = 4,
 minSpeed = 5,
 maxSpeed = 20,
 minHue = 0,
 maxHue = 360,
 maxAmount = 50;
 function random(min, max) {
 if (arguments.length < 2) {
  max = min;
  min = 0;
 }
 return Math.floor(Math.random() * (max - min) + min);
 }
 function hexToRGB(hex, opacity) {
 var rgb = '';
 hex.match(/.{2}/g).forEach(function(n) {
  rgb += (parseInt(n, 16)) + ',';
 });
 return 'rgba(' + rgb + opacity + ')';
 }
 function draw() {
 // Heart
 ctx.fillStyle = hexToRGB(bg, '0.1');
 ctx.beginPath();
 // Left half
 ctx.moveTo(0, 0);
 ctx.lineTo(canvasWHalf, 0);
 ctx.lineTo(304 + xoff, 97 + yoff);
 ctx.bezierCurveTo(282 + xoff, -5 + yoff, 80 + xoff, -6 + yoff, 76 + xoff, 165 + yoff);
 ctx.bezierCurveTo(74 + xoff, 251 + yoff, 184 + xoff, 300 + yoff, 304 + xoff, 447 + yoff);
 ctx.lineTo(canvasWHalf, canvasH);
 ctx.lineTo(0, canvasH);
 // Right half
 ctx.moveTo(canvasW, 0);
 ctx.lineTo(canvasWHalf, 0);
 ctx.lineTo(304 + xoff, 97 + yoff);
 ctx.bezierCurveTo(326 + xoff, 5 + yoff, 528 + xoff, 6 + yoff, 532 + xoff, 165 + yoff);
 ctx.bezierCurveTo(534 + xoff, 251 + yoff, 424 + xoff, 300 + yoff, 304 + xoff, 447 + yoff);
 ctx.lineTo(canvasWHalf, canvasH);
 ctx.lineTo(canvasW, canvasH);
 ctx.closePath();
 ctx.fill();
 // Raindrops
 for (var i = 1; i < id; i++) {
  raindrops[i].fall();
 };
 }
 var Raindrop = function() {
 id++;
 this.y = random(-canvasH);
 this.x = random(canvasW);
 this.size = random(minSize, maxSize);
 this.speed = random(minSpeed, maxSpeed);
 this.color = 'hsl(' + random(minHue, maxHue) + ',100%,55%)';
 this.origColor = this.color;
 this.id = id;
 raindrops[id] = this;
 };
 Raindrop.prototype.fall = function() {
 this.y += this.speed;
 if (this.y >= canvasH) {
  this.y = random(-canvasH);
  this.x = random(canvasW);
 }
 ctx.save();
 ctx.beginPath();
 var gradient = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.size);
 gradient.addColorStop(0, '#fff');
 gradient.addColorStop(0.5, this.color);
 gradient.addColorStop(1, hexToRGB(bg, 0));
 ctx.rect(this.x, this.y, this.size, maxSpeed);
 ctx.fillStyle = gradient;
 ctx.fill();
 ctx.closePath();
 ctx.restore();
 };
 (function init() {
 ctx.fillStyle = '#' + bg;
 ctx.fillRect(0, 0, canvasW, canvasH);
 for (var i = 0; i < maxAmount; i++) {
  new Raindrop();
 }
 }());
 function animate() {
 draw();
 window.requestAnimationFrame(animate);
 }
 window.requestAnimationFrame(animate);
 function mouseTrail(x, y) {
 ctx.save();
 ctx.globalCompositeOperation = 'overlay';
 ctx.fillStyle = 'rgba(255,255,255,0.1)';
 ctx.arc(x, y, 50, 0, Math.PI * 2);
 ctx.fill();
 ctx.restore();
 }
 window.addEventListener('mousemove', function(cursor) {
 mouseTrail(cursor.x, cursor.y);
 });
 </script>
 </body>
</html>

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

Javascript 相关文章推荐
用Javascript实现Windows任务管理器的代码
Mar 27 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 Javascript
Jquery搜索父元素操作方法
Feb 10 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
JavaScrpt的面向对象全面解析
May 09 Javascript
Vue中控制v-for循环次数的实现方法
Sep 26 Javascript
javascript json字符串到json对象转义问题
Jan 22 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
四十九个javascript小知识实用技巧
Nov 20 Javascript
vue如何实现observer和watcher源码解析
Mar 09 #Javascript
详解VueJs异步动态加载块
Mar 09 #Javascript
微信小程序 设置启动页面的两种方法
Mar 09 #Javascript
js实现登录框鼠标拖拽效果
Mar 09 #Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
Mar 09 #Javascript
基于vue实现分页/翻页组件paginator示例
Mar 09 #Javascript
vue.js利用Object.defineProperty实现双向绑定
Mar 09 #Javascript
You might like
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
python简单文本处理的方法
2015/07/10 Python
Python 内置函数complex详解
2016/10/23 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
英国女性时尚品牌:Apricot
2018/12/04 全球购物
孝老爱亲模范事迹
2014/01/24 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
硕士生工作推荐信
2014/03/07 职场文书
答谢词范文
2015/01/05 职场文书
社会实践活动报告
2015/02/05 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
联谊会开场白
2015/06/01 职场文书
歌咏比赛主持词
2015/06/29 职场文书
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
mybatis 获取更新记录的id
2022/05/20 Java/Android
js前端图片加载异常兜底方案
2022/06/21 Javascript