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 相关文章推荐
extjs grid取到数据而不显示的解决
Dec 29 Javascript
JavaScript null和undefined区别分析
Oct 14 Javascript
js constructor的实际作用分析
Nov 15 Javascript
web基于浏览器的本地存储方法应用
Nov 27 Javascript
jquery如何获取复选框的值
Dec 12 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 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
WHOIS类的修改版
2006/10/09 PHP
COM in PHP (winows only)
2006/10/09 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
Python中的各种装饰器详解
2015/04/11 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
《老山界》教学反思
2014/04/08 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
优秀求职信
2014/05/29 职场文书
植物生产学专业求职信
2014/08/08 职场文书
写给父母的感谢信
2015/01/22 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
师德承诺书2015
2015/04/28 职场文书
放牛班的春天观后感
2015/06/01 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书