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 相关文章推荐
flexigrid 类似ext grid的JS表格代码
Jul 17 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
Nov 28 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
Dec 19 Javascript
javascript的内存管理详解
Aug 07 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
按下回车键指向下一个位置的一个函数代码
Mar 10 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
Mar 27 Javascript
详解Javascript中的原型OOP
Oct 12 Javascript
详解vue 兼容IE报错解决方案
Dec 29 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
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之Smarty入门
2007/01/04 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
php中adodbzip类实例
2014/12/08 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
python对字典进行排序实例
2014/09/25 Python
Python 数据结构之旋转链表
2017/02/25 Python
python数据结构之链表的实例讲解
2017/07/25 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
空乘英文求职信
2014/04/13 职场文书
党员承诺书格式
2014/05/21 职场文书
领导欢迎词致辞
2015/01/23 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
检讨书范文大全
2015/05/07 职场文书
表彰大会新闻稿
2015/07/17 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏