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 相关文章推荐
基于jquery+thickbox仿校内登录注册框
Jun 07 Javascript
关于js注册事件的常用方法
Apr 03 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
May 14 Javascript
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
jQuery控制Div拖拽效果完整实例分析
Apr 15 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
在js中实现邮箱格式的验证方法(推荐)
Oct 24 Javascript
手机软键盘弹出时影响布局的解决方法
Dec 15 Javascript
prototype与__proto__区别详细介绍
Jan 09 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
setTimeout函数的神奇使用
Feb 26 Javascript
一篇文章看懂JavaScript中的回调
Jan 05 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 图片上传代码
2011/09/13 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
php的ddos攻击解决方法
2015/01/08 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
跟老齐学Python之折腾一下目录
2014/10/24 Python
Python判断字符串与大小写转换
2015/06/08 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
wxPython实现分隔窗口
2019/11/19 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
Python如何读取、写入CSV数据
2020/07/28 Python
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
开展创先争优活动总结
2014/08/28 职场文书
个人职业及收入证明
2014/10/13 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
邀请书模板
2015/02/02 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android