鱼C论坛

 找回密码
 立即注册
查看: 5985|回复: 47

[庖丁解牛] 0 0 6 5 - Canvas粒子动画 - 只挖待填

[复制链接]
发表于 2017-3-7 11:22:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2021-8-11 11:04 编辑

一直在犹豫,是否介绍Canvas???

59因涉及jQuery,所以挖了个坑。

而这次呢,是因为涉及JavaScript

简单的Dom结构下,Js都绕不过去,更别提下面B格这么高的了
1.gif


So,本帖只做展示分享,有缘在深入学习Canvas。。。(不要问我在何时)


Canvas是HTML5中一项非常非常重要的特性!

重要到可以独立作为一门语言去学习。。。

说的在露骨些,Canvas就是解决:

transition&animation代码太多的尴尬时刻


你可以讲Canvas理解为小时候儿玩的翻页动画
timg.gif


当飞速的纸页的翻动时,就行成了动画


Canvas就相当于一个白本子,不停的绘制不同图案后,在极短的时间内连续播放,就形成了动画。

好吧,概念就扯到这里,开始制作一个简单的初雪动画

先在HTML代码中创建一个canvas的Dom结构
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Canvas</title>
  6.     <style type="text/css">

  7.     </style>
  8. </head>
  9. <body>
  10.     <canvas id="firstCanvas" width="999" height="666">大兄弟你的浏览器不支持Canvas!!!</canvas>
  11. </body>
  12. </html>
复制代码


啥效果也没有。。。

上面那个提示,纯属娱乐,但也有点用。

只有在你的浏览器真的不支持情况下,才会显示,给你看看Canvas支持哪些浏览器:
Snip20170307_689.png


好吧,接下来就要加入Js了,在body标签下,创建雪花(如有不适,自行关闭网页)
  1. <script type="text/javascript">
  2.         var canvas=document.getElementById("firstCanvas");//调用Canvas元素
  3.         var context=canvas.getContext("2d");//返回一个对象
  4.             </script>
复制代码


由于Canvas本身没有绘图能力,只有调用getContext()方法来绘制对象。

后续的制作雪花,都在context中来搞。

创建雪花前,需要创建个数组保存雪花信息
  1. var particles = [];
  2.         for( var i = 0; i < 666; i++ ) {
  3.         particles.push( {
  4.             x: Math.random()*window.innerWidth,
  5.             y: Math.random()*window.innerHeight,
  6.             vx: (Math.random()*1-.3), //横向随机
  7.             vy: (Math.random()*1-.3),//纵向随机
  8.             size: 1+Math.random()*2,
  9.             color: "#DDD"
  10.         } );
  11.         }
复制代码


用for循环随机生成666个雪花(小球),每个雪花随机出现在屏幕上。

随机位置通过窗口高度,宽度来计算,颜色偏灰#DDD。

现在仍然是看不见滴~

相当于咱们只是创建了666个虚拟描述雪花

只有在画布中,一个一个的绘制,才能看到哦
  1. function timeUpdate(e){
  2.             context.clearRect(0, 0, window.innerWidth, window.innerHeight); //第一步先清理画布
  3.             var len = particles.length;
  4.             var particle;
  5.         for( var i = 0; i < len; i++ ) { //循环遍历所有的雪花
  6.             particle = particles[i];
  7.             particle.x += particle.vx;
  8.             particle.y += particle.vy;
  9.             //下面都是边界检查,防止雪花跑出屏幕
  10.         if(particle.x<=0 || particle.x>=window.innerWidth){
  11.             particle.vx *= -1;
  12.         }
  13.         if(particle.y<=0 || particle.y>=window.innerHeight){
  14.             particle.vy *= -1;
  15.         }
  16.         context.fillStyle = particle.color;//设置雪花为上面设置的#DDD
  17.         context.beginPath();//开始绘制
  18.         context.arc(particle.x,particle.y,particle.size,0,Math.PI*1.99,true);//绘制图形
  19.         context.closePath();//停止绘制
  20.         context.fill();//对所有绘制好的图形,进行上色
  21.         }
  22.         }
  23.         setInterval( timeUpdate, 40 );
复制代码

效果图:
游客,如果您要查看本帖隐藏内容请回复



没错,善良如我决定从0 0 7 5 - 手把手带你玩儿Canvas 开始填坑。

这位鱼油,如果喜欢本帖子,请订阅 专辑-->传送门)(不喜欢更要订阅


官方 Web 课程:

评分

参与人数 3荣誉 +6 鱼币 +11 贡献 +5 收起 理由
weiter + 1 + 1 无条件支持楼主!
睦ちゃん她爹 + 5 + 5 + 3 无条件支持楼主!
alltolove + 5 + 2 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-7 12:20:30 | 显示全部楼层
我讲的QML也支持H5的canvas对象,这玩意忒复杂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 17:42:27 | 显示全部楼层
123
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-16 17:41:06 | 显示全部楼层
照样复制了 还是没有显示出来。。。-=-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-17 07:50:19 | 显示全部楼层
向一朵朵鲜花 发表于 2017-3-16 17:41
照样复制了 还是没有显示出来。。。-=-

…发求助贴吧,看下代码+效果图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-25 10:43:56 | 显示全部楼层
厉害了!!!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 17:14:41 | 显示全部楼层

厉害了!!!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-6 11:28:11 | 显示全部楼层
回复看帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-15 12:32:58 | 显示全部楼层

context.arc(particle.x,particle.y,particle.size,0,Math.PI*1.99,true);//绘制图形.
arc参数后面不能设置true.设置true就看不到了.

还有一个错误.
vx vy在particle[]数组里.

particle.vx应该改为particle[i].vx。
vy同理~
123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-15 12:35:27 | 显示全部楼层
交作业~
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Canvas</title>
  6.     <style type="text/css">
  7.         *{
  8.             margin: 0;
  9.             padding: 0;
  10.         }
  11.         html,body{
  12.             height: 100%;
  13.         }
  14.         #firstCanvas{
  15.             background-color: #000;

  16.         }
  17.     </style>
  18. </head>
  19. <body>
  20.     <canvas id="firstCanvas" width="999" height="666">大兄弟你的浏览器不支持Canvas!!!</canvas>
  21.     <script type="text/javascript">
  22.         var canvas = document.getElementById("firstCanvas");
  23.         var context = canvas.getContext("2d");
  24.         var practicles = [];
  25.         for(var i = 0; i < 666; i++)
  26.         {
  27.             practicles.push({
  28.                 x: Math.random() * window.innerWidth,
  29.                 y: Math.random() * window.innerHeight,
  30.                 vx: (Math.random() - 0.5),
  31.                 vy: (Math.random() - 0.5),
  32.                 size: 1 + Math.random() * 3,
  33.                 color: "#ddd"
  34.             })
  35.         }
  36.         function timeUpdate()
  37.         {
  38.             context.clearRect(0, 0, window.innerWidth, window.innerHeight);
  39.             var len = practicles.length;
  40.             var practicle;
  41.             for( var i = 0; i < len; i++)
  42.             {
  43.                 var practicle = practicles[i];
  44.                 practicle.x += practicles[i].vx;
  45.                 practicle.y += practicles[i].vy;
  46.                 if(practicle.x <= 0 || practicle.x >= window.innerWidth)
  47.                 {
  48.                     practicles[i].vx *= -1;
  49.                 }
  50.                 if(practicle.y <= 0 || practicle.y >= window.innerHeight)
  51.                 {
  52.                     practicles[i].vy *= -1;
  53.                 }

  54.                 context.beginPath();
  55.                 context.arc(practicle.x, practicle.y, practicle.size, 0, Math.PI * 1.99);
  56.                 context.closePath();
  57.                 context.fillStyle = practicle.color;
  58.                 context.fill();
  59.             }
  60.         }
  61.         setInterval(timeUpdate, 40);
  62.     </script>

  63. </body>
  64. </html>
复制代码


6.png

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2017-8-15 14:28

评分

参与人数 1鱼币 +5 收起 理由
不二如是 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 17:30:59 | 显示全部楼层
看看效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-3 11:38:35 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-11 18:58:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-22 23:54:58 | 显示全部楼层
闪瞎了闪瞎了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 14:55:00 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-3 21:59:19 | 显示全部楼层
没有效果嘞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-21 16:07:50 | 显示全部楼层
a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-14 23:31:44 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-13 21:03:01 | 显示全部楼层
RE: 0 0 6 5 - Canvas粒子动画 - 只挖待填 [修改]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-15 09:30:33 | 显示全部楼层
wow
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 01:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表