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设置按钮的disabled属性的实现代码
Nov 28 Javascript
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
js模拟select下拉菜单控件的代码
May 08 Javascript
JavaScript保留两位小数的2个自定义函数
May 05 Javascript
Javascript Memoizer浅析
Oct 16 Javascript
js控制鼠标事件移动及移出效果显示
Oct 19 Javascript
js实现按钮控制图片360度翻转特效的方法
Feb 17 Javascript
基于js实现投票的实例代码
Aug 04 Javascript
js实现根据身份证号自动生成出生日期
Dec 15 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 Javascript
JavaScript如何一次性展示几万条数据
Mar 30 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
Oct 09 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实现支持加盐的图片加密解密
2016/09/09 PHP
prototype 的说明 js类
2006/09/07 Javascript
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
js实现一键复制功能
2017/03/16 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
学习python处理python编码问题
2011/03/13 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
中职应届生会计求职信
2013/10/23 职场文书
有趣的广告词
2014/03/18 职场文书
单位证明范文
2015/06/18 职场文书
家长会感言
2015/08/01 职场文书
初中美术教学反思
2016/02/17 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
MySQL分区表管理命令汇总
2022/03/21 MySQL
Python实现日志实时监测的示例详解
2022/04/06 Python