代码地址如下:
http://www.demodashi.com/demo/11636.html

前言

之前在某网站上看到了一个canvas绘制的动画效果,虽然组成的元素很简单,只有点和线,但是视觉效果却非常炫丽,当下就非常想自己把他实现一遍。因为工作原因这个想法搁置了一段时间,前不久忽然想起来,就抽空完成了这个demo,下面是demo的截图,想要看动态效果的小伙伴可以戳旁边的链接:canvas绘制绚丽的点线动画效果

运行效果图

下面就简单介绍一下完成这个demo的思路

需要掌握的基础知识

  1. canvas绘制点与线的api
  2. 理解JavaScript中“类”

需求分析

  1. 随机产生并向随机方向以随机的速度匀速移动
  2. 未点击时,点的总数保持不变;点击时在点击的位置产生数个新的点
  3. 点与点之间在一定距离内有细线连接
  4. 鼠标在画面中移动时,能够与其他点产生互动

编写代码(文章末尾有源码)

点的实现

由于在整个demo中需要使用到大量的点,所以使用一个Dot类来负责产生点的实例以及这个点的所有行为

// 声明一个Dot对象
var Dots = function () {this.canvas; // canvas节点this.ctx; // canvas绘图上下文this.x; // 横向坐标this.y; // 纵向坐标this.r; // dot半径this.sx; // 单位时间水平移动距离this.sy; // 单位时间纵向移动距离
};

Dot的原型链中需要有一下两个方法:init() 与 update()

Dots.prototype = {init: function(){...},update: function(){...}
}

init()

Dots实例的初始化方法,在canvas中绘制一个点,并确定这个Dots实例移动的方向与速度(由sx与sy决定,即确定sx与sy的值)

update()

更新dot的位置,通过不断调用其的update方法,使其产生运动的效果,并且判断dot所处的位置是否已经超出canvas的边界,若超出则调用其init()方法,使其重生在canvas内

如何绘制一个点?

点的本质是一个实心圆,所以绘制一个点就是绘制一个填充了颜色的圆

this.ctx.beginPath(); // 开启绘制路径
this.ctx.arc(this.x, this.y, this.r, 0, 2*Math.PI); // 绘制圆 参数依次为 圆的横坐标/纵坐标/半径/绘制圆的起始位置/绘制圆的弧度大小
this.ctx.fillStyle = "rgba(255,255,255,.8)"; // 设置填充颜色
this.ctx.fill(); // 填充颜色
this.ctx.closePath(); // 关闭绘制路径

让点移动起来

如果让你实现一个动画,你可能会想到通过定时器setTimeout或者setInterval的方式来实现,时间设定越短动画也就越流畅,但是使用定时器会有这么几个问题出现:

  1. 当有耗时任务时,定时器任务会等待耗时任务结束,js引擎空闲时再去执行
  2. 当设定时间非常短时,可能会出现掉帧现象,产生动画不连贯的感受

那么有什么方法可以解决这个问题呢?答案是使用全局函数requestAnimFrame()

requestAnimFrame的字面意思是“请求动画帧”,作用是根据GPU的渲染频率来执行方法内的js代码,这样就不会出现上面使用定时器而导致的两个可能的问题

// dot移动效果
function animateUpdate() {dot.update(); // 更新dot的当前位置requestAnimFrame(animateUpdate);
}requestAnimFrame(animateUpdate);

绘制点与点之间的连线

将产生的点存放在一个数组中,就得到了一个当前所有点实例的集合,通过for循环的嵌套,将数组中的每个点进行两两比较,当点与点之间的距离达到预先设置的临界值时,即可绘制连线

如何绘制一条线?

ctx.beginPath(); // 开启绘制路径
ctx.moveTo(x, y); // 设置线的起始位置
ctx.lineTo(dx, dy); // 设置线的结束位置
ctx.strokeStyle = 'rgb(255,255,255)'; // 设置绘制线条的颜色
ctx.strokeWidth = 1; // 设置绘制线条的宽度
ctx.stroke(); // 绘制
ctx.closePath(); // 关闭绘制路径

如何实现线条的淡入淡出效果?

设置reba颜色值可实现带透明度的颜色,透明度的计算方式为,(临界值距离 - 实际距离) / 临界值距离,这样就可以实现两点距离越远线条颜色越淡。再通过动画不停渲染,就可以造成视觉上淡入淡出的效果

ctx.strokeStyle = 'rgba(255,255,255,'+(dotsDistance-s)/dotsDistance+')';

实现鼠标交互

添加点击事件 click 事件监听器,当点击时实例化多个Dots对象,并将其添加到上文保存点的数组中,这样既可将新产生的点与原有的点产生联系。需要注意的是,产生点的位置应该为点击的位置,由于demo中的canvas是全屏显示的,所以只需要获取鼠标点的pageX / pageY,如果canvas并非全屏,则需要获取到的点产生的位置应该是相对于canvas的位置,而不能直接使用pageX / pageY, 并且需要判断是否在canvas内,如果不在则不产生新点

document.addEventListener('click', createDot); // 添加点击事件
function createDot(e) { // 点击事件方法var tx = e.pageX,ty = e.pageY; // 获取点击位置if ((tx > 0 && tx < width) && (ty > 0 && ty < height)) { // 判断是都在canvas内 width和height为canvas宽高for (var i = 0; i < 5; i ++) {var dot = new Dots();dotsArr.push(dot);dot.init(canvas, tx, ty);} // 循环创建5个点 并添加到数组中}
};

如何实现鼠标在canvas中移动的交互效果?

首先添加 mousemove 的事件监听器,其他步骤与上面点击的代码相同,唯一不同的是,确定点击在canvas内后不能创建新的点。现在为Dots对象添加一个新的原型链方法mouseDot()用于更新需要跟踪鼠标移动的点的位置

mouseDot: function (x, y) {this.x = x * 2;this.y = y * 2; // 这里的2是屏幕的devicePixelRatio 是一个全局熟悉 在retain屏幕下 devicePixelRatio=2 标识浏览器会用两个像素点去绘制原先的一个像素 这样会导致绘图不清晰 之后会专门写一篇关于这个问题的文章 感兴趣的小伙伴可以持续关注this.ctx.beginPath();this.ctx.arc(this.x, this.y, this.r + 0.5, 0, 2*Math.PI);this.ctx.fillStyle = "rgba(255,0,0,.8)";this.ctx.fill();this.ctx.closePath();}
document.addEventListener('mousemove', moveDot);
function moveDot(e) {var tx = e.pageX,ty = e.pageY;if ((tx > 0 && tx < width) && (ty > 0 && ty < height)) {dot.mouseDot(tx, ty); // 更新跟踪点的位置 小伙伴们可以思考一下这里的dot对于的是dotsArr中的哪一个点}
};

性能优化

以上就是canvas实现绚丽点线效果的基本思路啦!但是还有一个问题需要优化,看过demo的小伙伴可能已经发现了,刚开始不断点击的时候会不断产生点,但是当点的数量到达一定程度的时候就会发现:不管怎么点击,画面中的点的数量基本保持不变

其实在之前看到的网站上,点的数量是可以无上限增加的。但是点的数量不断增加会严重消耗性能,导致动画效果卡顿严重,无法直视,同时点太多也十分的不美观,于是demo就对这一情况做了优化:

当点的数量增加到预设的最大值时,每新增一个点,就会舍弃掉点数组中最先添加进去的点

至于是如何实现的,小伙伴们可以在源码中寻找答案哦!

代码结构图

文件结构类别如下


神奇的canvas——点与线绘制的绚丽动画效果

代码地址如下:
http://www.demodashi.com/demo/11636.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

神奇的canvas——点与线绘制的绚丽动画效果相关推荐

  1. 利用canvas绘制的拓扑动画效果

    展示效果网址 reloadimage(callback){let imgArrs = [];this.imgArray.forEach((img,index,arrs)=>{imgArrs[in ...

  2. flash图片如何镜像翻转_在canvas上实现元素图片镜像翻转动画效果的方法

    这篇文章主要介绍了在canvas上实现元素图片镜像翻转动画效果的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧! 一.Canvas图片水平镜像翻转效果预览 ...

  3. 用计算机画小鸡,flash动画设计教程:5.17——如何演示绘制小鸡的动画效果.doc...

    Flash cs3仿真艺术设计5.17:如何演示绘制小鸡的动画效果 本例为Flash CS3仿真艺术设计系列教程,在上一课中我们学习了如何正确制作人物动作的预测,在这一课中我们将学习如何演示绘制小鸡的 ...

  4. 前端实现图片快速反转替换_在canvas上实现元素图片镜像翻转动画效果的方法

    一.Canvas图片水平镜像翻转效果预览 demo页面中点击图片动画效果可见. 二.Canvas上实现图片镜像翻转的实现 CSS中要想实现元素的翻转效果,比较简单,例如我们希望某一张图片水平镜像翻转, ...

  5. 【Canvas】js用Canvas绘制阴阳太极图动画效果

    学习JavaScript是否兴趣缺缺,那就需要来一个兴趣学习,问一下有没有兴趣用Canvas画图呢,可以画很多有趣的事物,自由发挥想象,收获多多哦,这里有一个例子,如何用canvas画阴阳太极图动图效 ...

  6. Flutter 绘制波浪移动动画效果,曲线和折线图

    简介 上一篇用 Flutter 的 Canvas 画点有趣的图形我们介绍了使用 CustomPaint 绘制自定义形状,可以看到有了图形的平面绘制数学计算方法,我们可以画出所需的形状.本篇我们来介绍线 ...

  7. html实现颜料效果,JS基于HTML5的canvas标签实现炫目的色相球动画效果实例

    本文实例讲述了JS基于HTML5的canvas标签实现色相球效果.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: JS canvas标签制作色相球 var canvas,ctx, ...

  8. SuperMap iClient for javaScript 动态线绘制(模拟飞机飞行)

    作者:程溯 使用方法:SuperMap.Geometry.Point(x, y) SuperMap.Feature.Vector 实现动态线绘制模拟飞机飞行效果 使用 iClient 示范代码中的bu ...

  9. php网页画线,HTML5 canvas基本绘图之绘制线条

    是HTML5中新增的标签,用于绘制图形,这篇文章主要为大家详细介绍了HTML5 canvas基本绘图之绘制线条方法,感兴趣的小伙伴们可以参考一下 是HTML5中新增的标签,用于绘制图形,实际上,这个标 ...

最新文章

  1. nginx 错误502 upstream sent too big header while reading response header from upst
  2. VS2005与VSOrcasExpress对LINQ各有所属~
  3. 浅谈上、下拉电阻的作用/什么是拉电流和灌电流[转]
  4. SqlServer学习笔记【暂】
  5. Sedawk笔记之awk篇:快速了解Awk(三)
  6. mysql 列合并_mysql 列转行,合并字段的方法(必看)
  7. ActiveX、OLE和COM介绍
  8. Chap2-构造函数语意学
  9. JavaME:Google静态地图API
  10. matlab画线不同颜色_怎样画线框图才有意义
  11. MYSQL 数据库怎样快速的复制表以及表中的数据
  12. OpenCV 访问Mat 像素
  13. linux之ab测试
  14. python和excel进行数据交换_python-doc/使用Python和Excel进行交互式数据分析.md at master · HSUCHING/python-doc · GitHub...
  15. recon-ng V5.0 更新版本 被动信息收集
  16. js对象常用方法总结
  17. 自学就能轻松学会搭建网站的步骤教程
  18. C# 调用FFmpeg处理音视频的示例
  19. 对java的粗浅理解
  20. 重贴:MFC类中获得其它类指针 (转)

热门文章

  1. 180个非常有用的电脑知识
  2. 计算机,软件工程类毕业论文选题要求
  3. ddl和dml(DDL和DML包含哪些动词)
  4. 图片太大怎么压缩变小?压缩有技巧
  5. 屏蔽鼠标右键,F1帮助和常用快捷键
  6. FME 安装破解及与ArGIS冲突的解决方法
  7. 苹果本的vscode菜单栏不见了,怎么回事
  8. 【Books系列】之第三本书:《新物种爆炸》读书笔记
  9. 国产操作系统调研 -- 银河麒麟4.0.2
  10. Java 基于WEB的农产品销售管理系统源码+数据库+论文文档+项目辅导视频