今天我们要分享另外一款基于HTML5 Canvas的液体流动样式Loading加载动画,这款Loading动画在加载时会呈现液体流动的动画效果,并且由于和背景颜色的对比,也略微呈现发光的动画效果。

效果预览

代码实现

HTML代码

接下来我们讲讲实现这个加载动画的大致思路和实现过程。

首先在页面上定义一个canvas元素,用来承载这个Loading动画的画布。

  1. <canvas id='canvas'></canvas>

接下拉需要定义一个SVG滤镜,这个滤镜用来渲染Loading圈圈粒子化的效果。

  1. <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  2. <defs>
  3. <filter id="shadowed-goo">
  4. <feGaussianBlur in="SourceGraphic" result="blur" stdDeviation="10" />
  5. <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7" result="goo" />
  6. <feGaussianBlur in="goo" stdDeviation="3" result="shadow" />
  7. <feColorMatrix in="shadow" mode="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -0.2" result="shadow" />
  8. <feOffset in="shadow" dx="1" dy="1" result="shadow" />
  9. <feBlend in2="shadow" in="goo" result="goo" />
  10. <feBlend in2="goo" in="SourceGraphic" result="mix" />
  11. </filter>
  12. <filter id="goo">
  13. <feGaussianBlur in="SourceGraphic" result="blur" stdDeviation="10" />
  14. <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7" result="goo" />
  15. <feBlend in2="goo" in="SourceGraphic" result="mix" />
  16. </filter>
  17. </defs>
  18. </svg>

CSS代码

这里我们先不谈页面中其他元素的样式,我们的重点是为canvas元素指定相应的svg滤镜:

  1. #canvas {
  2. margin: 0px auto;
  3. display: block;
  4. filter: url("#shadowed-goo");
  5. }

JavaScript代码

然后用JavaScript代码实现Loading加载动画。这里用到了canvas的2d动画绘制对象:

  1. var canvas = document.getElementById("canvas");
  2. var ctx = canvas.getContext("2d");

getContext()方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。

这个动画的核心是动态画一段弧线,代码如下:

  1. ctx.fillStyle = "rgba(255,255,255," + this.al + ")";
  2. ctx.beginPath();
  3. ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false);
  4. ctx.fill();

下面是完整的JS代码:

  1. var canvas = document.getElementById("canvas");
  2. var ctx = canvas.getContext("2d");
  3. var p = [];
  4. var particle = [];
  5. var angle = Math.PI/4;
  6. canvas.width = 600;
  7. canvas.height = 600;
  8. var width = canvas.width;
  9. var height = canvas.height;
  10. function getRandomInt(min, max) {
  11. return min + Math.floor(Math.random() * (max - min + 1));
  12. }
  13. function retinaReady() {
  14. var pixelRatio = window.devicePixelRatio || 1;
  15. var backingStore = ctx.webkitBackingStorePixelRatio || 1;
  16. window.ratio = pixelRatio / backingStore; // public var
  17. if (pixelRatio !== backingStore) {
  18. var oldWidth = canvas.width;
  19. var oldHeight = canvas.height;
  20. canvas.width = oldWidth * ratio;
  21. canvas.height = oldHeight * ratio;
  22. canvas.style.width = oldWidth + "px";
  23. canvas.style.height = oldHeight + "px";
  24. ctx.scale(window.ratio, window.ratio);
  25. }
  26. }
  27. retinaReady();
  28. function run(a) {
  29. var r = 140;
  30. var x = r * Math.sin(a) + width / 2;
  31. var y = r * Math.cos(a) + ((height / 2)-80);
  32. var p;
  33. p = new Particle(x, y);
  34. particle.push(p);
  35. }
  36. function Particle(x, y) {
  37. this.x = x;
  38. this.y = y;
  39. this.r = getRandomInt(10, 16);
  40. this.v = {
  41. x: 0,
  42. y: 0
  43. };
  44. this.a = {
  45. x: 0,
  46. y: 0
  47. };
  48. this.al = 1;
  49. }
  50. Particle.prototype.update = function() {
  51. this.a.x = getRandomInt(-0.001, 0.001);
  52. this.a.y = getRandomInt(0.01, 0.02);
  53. this.v.x += this.a.x;
  54. this.v.y += this.a.y;
  55. this.x += this.v.x;
  56. this.y += this.v.y;
  57. if (this.r >= 0.01) {
  58. this.r -= 0.2;
  59. this.al -= 0.001;
  60. } else {
  61. this.r = 0;
  62. this.al = 0;
  63. }
  64. };
  65. Particle.prototype.draw = function() {
  66. ctx.fillStyle = "rgba(255,255,255," + this.al + ")";
  67. ctx.beginPath();
  68. ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false);
  69. ctx.fill();
  70. };
  71. function animate() {
  72. ctx.clearRect(0, 0, width, height);
  73. run(angle);
  74. requestAnimationFrame(animate);
  75. for (var j = 0; j < particle.length; j++) {
  76. var p = particle[j];
  77. p.update();
  78. p.draw();
  79. }
  80. if (angle <= 2 * Math.PI) {
  81. angle += 0.04;
  82. } else {
  83. angle = 0;
  84. }
  85. }
  86. animate();

到这里为止,这个粒子流体状的Loading加载动画就完成了,文章最后也将源码献给大家。

源码下载

完整的代码我已经整理出了一个源码包,供大家下载学习。

关注我的公众号“前端技术官”,回复关键字:3005,即可获取源码下载链接。

代码仅供参考和学习,请不要用于商业用途。

最后总结

这个Loading动画我们主要用到了SVG滤镜知识,以及HTML5 Canvas的2d动画绘制对象,结合简单的数学三角函数组合,如果你觉得不错,点个赞吧!

超酷!!HTML5 Canvas 水流样式 Loading 动画的更多相关文章

  1. 超酷HTML5 Canvas图表应用Chart.js自定义提示折线图

    超酷HTML5 Canvas图表应用Chart.js自定义提示折线图 效果预览 实例代码 <div class="htmleaf-container"> <div ...

  2. 程序猿必备的10款超炫酷HTML5 Canvas插件

    1.超炫酷HTML5 Canvas 3D旋转地球动画 这是一款基于HTML5 Canvas的3D地球模拟动画,动画以太空作为背景,地球在太空中旋转,同时我们也可以拖拽鼠标来从不同的角度观察地球.另外我 ...

  3. 分享9款最新超酷HTML5/CSS3应用插件

    新的一周开始了,小编继续要为大家分享实用超酷的HTML5应用,今天分享的这9款最新HTML5/CSS3应用你一定会很喜欢,一起来看看. 1.HTML5 Canvas模拟衣服撕扯动画 超级逼真 今天又要 ...

  4. 一款基于HTML5 Canvas的画板涂鸦动画

    今天给各网友分享一款基于HTML5 Canvas的画板涂鸦动画.记得之前我们分享过一款HTML5 Canvas画板工具,可以切换不同的笔刷,功能十分强大.本文今天要再来分享一款基于HTML5 Canv ...

  5. HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版​

    HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...

  6. 【HTML】html5 canvas全屏烟花动画特效

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. 7款超酷HTML5 3D动画精选应用及源码

    对以前来讲,3D动画拿到网页上展示是一件非常奢侈的事情,第一是浏览器不够先进,第二是大部分只能用flash实现伪3D.HTML5的出现,让实现网页3D动画变得非常简单,当然前提是你不要再使用像IE67 ...

  8. 8款超酷而实用的CSS3按钮动画

    1.CSS3分享按钮动画特效 这是一款基于CSS3的社会化分享按钮,按钮非常简单,提供了分享到twitter.facebook.youtube等大型社交网站.每一个分享按钮都有个大社交网站的Logo图 ...

  9. 基于HTML5 Canvas粒子效果文字动画特效

    之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示的文字,回车后即可在canvas上绘制出粒子效果的 ...

随机推荐

  1. 4月11日 python学习总结 对象与类

    1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...

  2. 和风天气WebApi使用教程

    1.首先进入和风天气开发平台,点击右上角的注册进行注册 和风天气开发平台 2.填写注册用的邮箱和密码完成注册,可能还需要手机号,按提示注册完成即可. 3.从和风天气开发平台右上角进入控制台,输入你刚刚 ...

  3. linux下串口测试程序

    通过简单的参数配置,执行文件+串口号+波特率 #include <stdio.h> #include <stdlib.h> #include <unistd.h> ...

  4. jinja2.exceptions.TemplateNotFound 报错处理

    一.检查模板文件夹是否正确. 遇到这个问题,首先需要检查你的模板文件夹命名是否规范,Flask默认会在工程下寻找templates文件夹,这个是默认配置,不能写成template或者其他名字.当然,如 ...

  5. Mybatis的xml配置(mybatis-config.xml)精简笔记

    老规矩,看着官方文档学 首先,我们需要知道的是,在MyBatis 的xml配置文件中,这些影响 MyBatis 行为的属性之间的设置是有先后顺序的.配置的先后顺序依照properties, setti ...

  6. java 基础知识(三)

    Arraylist与Vector的区别 清浅池塘 程序员,专栏:Java那些事儿唯一作者,咨询前请先点详细资料   162 人赞同了该文章 这几天工作有点忙,有很多代码需要写,更新文章有点慢,说声抱歉 ...

  7. vuex组成和原理?

    组成: 组件间通信, 通过store实现全局存取 修改: 唯一途径, 通过commit一个mutations(同步)或dispatch一个actions(异步) 简写: 引入mapState.mapG ...

  8. python 元组tuple 增删改查操作

    初始化: data_tuple = () data_tuple1 = (1,) data_tuple2 = tuple() 新增: data_tuple+data_tuple1 (data_tuple ...

  9. 使用 Spring 框架的好处是什么?

    轻量:Spring 是轻量的,基本的版本大约 2MB.控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依 赖,而不是创建或查找依赖的对象们.面向切面的编程(AOP):Spring ...

  10. apollo规划控制视频-12basic motion planning and overview