资讯专栏INFORMATION COLUMN

知乎登录首页 canvas 粒子动态效果,可配置

dayday_up / 1257人阅读

摘要:个人博客封装方法,增加点击,移动效果,配置颜色线条粗细功能在线查看传到了,以后也许用得着,地址先上效果点击效果默认生成随机大小的个小点点鼠标移动,修改鼠标小点点的轴坐标鼠标点击,增加随机大小小点点增加离屏优化性能修复鼠标移出,去除鼠标效果的

</>复制代码

  1. 个人博客 http://taoquns.com/paper/59ba...

  2. canvas 封装方法,增加点击,移动效果,配置颜色线条粗细功能

  3. 在线查看 http://jsrun.net/3PkKp/edit

  4. 传到github了,以后也许用得着,地址: https://github.com/Taoqun/can...

先上效果:

点击效果:

</>复制代码

  1. 默认生成随机大小的100个小点点

  2. 鼠标移动,修改鼠标小点点的xy轴坐标

  3. 鼠标点击,增加随机大小小点点

  4. 增加离屏canvas 优化性能

  5. 修复鼠标移出,去除鼠标效果的小点点

  6. 增加暂停开始功能

index.html

</>复制代码

index.js

</>复制代码

  1. var root = document.querySelector("#root")
  2. var a = new CanvasAnimate(root,{length:80,clicked:true,moveon:true})
  3. a.Run() // 开始运行
  4. a.pause() // 暂停

CanvasAnimate.js

</>复制代码

  1. 说明,配置参数

length Number 生成的小点点数量

RoundColor String 小点点颜色

LineColor String 线条颜色

LineWeight Number 线条宽度

clicked Boolean 鼠标点击是否增加连接小点点

moveon Boolean 鼠标移动是否增加连接效果

</>复制代码

  1. 方法

Run 开始运行

pause 暂停动画 或者 开始动画 切换

</>复制代码

  1. function CanvasAnimate(Dom,options){
  2. options = options || {}
  3. this.Element = Dom
  4. this.cvs = Dom.getContext("2d")
  5. this.off_cvs = document.createElement("canvas")
  6. this.off_cvs.width = Dom.width
  7. this.off_cvs.height = Dom.height
  8. this.Dom = this.off_cvs.getContext("2d")
  9. this.width = Dom.width
  10. this.height = Dom.height
  11. this.length = options.length || 100
  12. this.RoundColor = options.RoundColor || "#999"
  13. this.RoundDiameter = options.RoundDiameter || 2
  14. this.LineColor = options.LineColor || "#ccc"
  15. this.LineWeight = options.LineWeight || 1
  16. this.clicked = options.clicked || false
  17. this.moveon = options.moveon || false
  18. this.list = []
  19. this.paused = true
  20. }
  21. CanvasAnimate.prototype.Run = function(){
  22. if( this.clicked ){
  23. this.Element.addEventListener( "click",this.Clicked.bind(this) )
  24. }
  25. if( this.moveon ){
  26. this.Element.addEventListener( "mousemove",this.moveXY.bind(this) )
  27. this.Element.addEventListener( "mouseout",this.moveoutXY.bind(this) )
  28. }
  29. this.Draw( this.getLength() )
  30. }
  31. CanvasAnimate.prototype.getLength=function(){
  32. let arr = []
  33. for(let i=0;i< this.length ;i++){
  34. let obj = {}
  35. obj.x = parseInt( Math.random() * this.width )
  36. obj.y = parseInt( Math.random() * this.height )
  37. obj.r = parseInt( Math.random()*10 )
  38. obj.controlX = parseInt( Math.random()*10 ) > 5 ? "left":"right"
  39. obj.controlY = parseInt( Math.random()*10 ) > 5 ? "bottom":"top"
  40. arr.push(obj)
  41. }
  42. return arr
  43. }
  44. CanvasAnimate.prototype.Draw = function(list){
  45. let new_arr = []
  46. let line_arr = []
  47. list.map((item,index)=>{
  48. let xy = this.ControlXY(item)
  49. let obj = this.ControlRound(xy)
  50. new_arr.push( obj )
  51. });
  52. new_arr.map((item1,index1)=>{
  53. new_arr.map((item2,index2)=>{
  54. if(item1 !== item2){
  55. let x = item1.x - item2.x
  56. let y = item1.y - item2.y
  57. if( Math.abs(x)< 100 && Math.abs(y)<100 ){
  58. let obj = {
  59. x1:item1.x,
  60. y1:item1.y,
  61. x2:item2.x,
  62. y2:item2.y,
  63. }
  64. line_arr.push(obj)
  65. }
  66. }
  67. })
  68. })
  69. this.drawLine(line_arr)
  70. new_arr.map((item)=>{
  71. this.drawRound(item)
  72. })
  73. this.list = new_arr
  74. this.cvs.drawImage(this.off_cvs,0,0,this.width,this.height)
  75. setTimeout(()=>{
  76. if(this.paused){
  77. this.next()
  78. }
  79. },50)
  80. }
  81. CanvasAnimate.prototype.next = function(){
  82. this.cvs.clearRect( 0,0,this.width,this.height )
  83. this.Dom.clearRect( 0,0,this.width,this.height )
  84. this.Draw( this.list )
  85. }
  86. CanvasAnimate.prototype.drawRound = function(obj){
  87. let {x,y,r} = obj
  88. this.Dom.beginPath()
  89. this.Dom.arc( x,y,r, 0, 2*Math.PI )
  90. this.Dom.fillStyle = this.RoundColor
  91. this.Dom.fill()
  92. this.Dom.closePath()
  93. }
  94. CanvasAnimate.prototype.drawLine = function(list){
  95. list.map( (item)=>{
  96. this.Dom.beginPath()
  97. this.Dom.moveTo( item.x1,item.y1 )
  98. this.Dom.lineTo( item.x2,item.y2 )
  99. this.Dom.lineWidth = this.LineWeight
  100. this.Dom.strokeStyle = this.LineColor
  101. this.Dom.stroke()
  102. this.Dom.closePath()
  103. })
  104. }
  105. CanvasAnimate.prototype.ControlXY = function(obj){
  106. if(obj.x >= (this.width - obj.r) ){
  107. obj.controlX = "left"
  108. }else if( obj.x <= parseInt(obj.r/2) ){
  109. obj.controlX = "right"
  110. }
  111. if( obj.y >= (this.height - obj.r) ){
  112. obj.controlY = "bottom"
  113. }else if( obj.y <= parseInt(obj.r/2) ){
  114. obj.controlY = "top"
  115. }
  116. return obj
  117. }
  118. CanvasAnimate.prototype.ControlRound = function(obj){
  119. switch(obj.controlX){
  120. case "right":
  121. obj.x++;
  122. break;
  123. case "left":
  124. obj.x--;
  125. break;
  126. }
  127. switch(obj.controlY){
  128. case "top":
  129. obj.y++;
  130. break;
  131. case "bottom":
  132. obj.y--;
  133. break;
  134. }
  135. return obj
  136. }
  137. CanvasAnimate.prototype.Clicked = function(event){
  138. let obj = {}
  139. obj.x = event.clientX
  140. obj.y = event.clientY
  141. obj.r = parseInt( Math.random()*10 )
  142. obj.controlX = parseInt( Math.random()*10 ) > 5 ? "left" :"right"
  143. obj.controlY = parseInt( Math.random()*10 ) > 5 ? "bottom" :"top"
  144. this.list.push(obj)
  145. }
  146. CanvasAnimate.prototype.moveXY = function(event){
  147. let obj = {}
  148. obj.x = event.clientX
  149. obj.y = event.clientY
  150. obj.r = 0
  151. obj.move = true
  152. if( this.list[0]["move"] ){
  153. this.list[0]["x"] = obj.x
  154. this.list[0]["y"] = obj.y
  155. this.list[0]["r"] = 1
  156. }else{
  157. this.list.unshift(obj)
  158. }
  159. }
  160. CanvasAnimate.prototype.moveoutXY = function(event){
  161. this.list.shift()
  162. }
  163. CanvasAnimate.prototype.pause = function(){
  164. this.paused = !this.paused
  165. if( this.paused){
  166. this.Draw(this.list)
  167. }
  168. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82454.html

相关文章

  • canvas中普通动效与粒子动效的实现

    摘要:可以绘制动态效果,除了常用的规则动画之外,还可以采用粒子的概念来实现较复杂的动效,本文分别采用普通动效与粒子特效实现了一个简单的时钟。普通时钟普通动效即利用的,实现有规则的图案动画。表示保存当前环境的状态,在此基础上进行绘制。 canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。 canvas可以绘制动态效果,除了常用的规则动画之外,还可以采用粒子的...

    lastSeries 评论0 收藏0
  • vue个人博客项目部署上线

    摘要:前言之前有发过这个项目的文章了,根据朋友的建议改变了博客的样式,也增加了一些新功能,下面完整地介绍这个博客项目。 前言 之前有发过这个项目的文章了,根据朋友的建议改变了博客的样式,也增加了一些新功能,下面完整地介绍这个博客项目。文末附前端实习求职简历 项目简介 简要介绍:一个前后端分离的项目主要技术栈:vue全家桶 + node.js + Express + Mongodbgithub...

    caspar 评论0 收藏0
  • vue个人博客项目部署上线

    摘要:前言之前有发过这个项目的文章了,根据朋友的建议改变了博客的样式,也增加了一些新功能,下面完整地介绍这个博客项目。 前言 之前有发过这个项目的文章了,根据朋友的建议改变了博客的样式,也增加了一些新功能,下面完整地介绍这个博客项目。文末附前端实习求职简历 项目简介 简要介绍:一个前后端分离的项目主要技术栈:vue全家桶 + node.js + Express + Mongodbgithub...

    lanffy 评论0 收藏0
  • canvas绘制经典星空连线效果

    摘要:点都构建完毕了,就要构建点与点之间的连线了,我们用到双重遍历,把两个点捆绑成一组,放到数组中。最后加入鼠标移动事件,启动定时器大功告成 废话不说先上图:showImg(https://segmentfault.com/img/bVOH83?w=1312&h=586); 关于这个效果我第一次见是在https://www.mengxiaozhu.cn/后来知乎登录页也开始用了https:/...

    wenzi 评论0 收藏0
  • canvas绘制经典星空连线效果

    摘要:点都构建完毕了,就要构建点与点之间的连线了,我们用到双重遍历,把两个点捆绑成一组,放到数组中。最后加入鼠标移动事件,启动定时器大功告成 废话不说先上图:showImg(https://segmentfault.com/img/bVOH83?w=1312&h=586); 关于这个效果我第一次见是在https://www.mengxiaozhu.cn/后来知乎登录页也开始用了https:/...

    hzc 评论0 收藏0

发表评论

0条评论

dayday_up

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<