当我看到这件作品的时候,我表示非常喜欢。这个作品的产生不仅仅需要编程和算法,作者肯定是个充满了艺术细胞的人。倘若有什么canvas艺术作品比赛的话,我想它就是获奖的那个。

先观赏下演示吧。注意,要看到效果,请确保你的浏览器支持 HTML 5。如果你还在使用旧版 IE,请更换新版浏览器。

代码如下:

001 function fillCircle(ctx, r)
002 {
003    ctx.beginPath();
004    ctx.moveTo(r, 0);
005    ctx.fillStyle = 'rgb(245,50,50)';
006    ctx.arc(0,0,r,0,Math.PI*2,true);
007    ctx.fill();
008 }
009  
010 function branch(ctx, r, d, t, a)
011 {
012   ctx.save();
013   ctx.rotate(t*a);
014   ctx.translate(0, -r*(1+d));
015   wing(ctx, r*d, a);
016   ctx.restore();
017 }
018  
019 function feather(ctx, r)
020 {
021   if ( r < 3 ) return;
022   var d = 0.85;
023   ctx.rotate(-0.03*Math.PI);
024   ctx.translate(0, -r*(1+d));
025   fillCircle(ctx, r);
026   feather(ctx, r*d);
027 }
028  
029 function wing(ctx, r, a)
030 {
031   if ( r < 2.9 ) return;
032   fillCircle(ctx, r);
033   branch(ctx, r, 0.9561, 0.03*Math.PI, a);
034   ctx.save();
035   ctx.rotate(0.55*Math.PI);
036   feather(ctx, 0.8*r);
037   ctx.restore();
038 }
039  
040 function tail(ctx, s, a)
041 {
042   if ( s < 0.5 ) return;
043   var d = 0.98; // decay
044   fillCircle(ctx, s);
045   ctx.rotate(-0.15*a);
046   ctx.translate(0, s*(1+d));
047   tail(ctx, s*d, a);
048 }
049  
050 function head(ctx)
051 {
052    fillCircle(ctx, 22);
053  
054    // mouth
055    ctx.save();
056    ctx.translate(-15, -3);
057    ctx.beginPath();
058    ctx.fillStyle = "white";
059    ctx.arc(0,0,10,0,Math.PI*2,true);
060    ctx.fill();
061    ctx.restore();
062  
063    // eye
064    ctx.translate(9, -4);
065    ctx.beginPath();
066    ctx.fillStyle = "black";
067    ctx.arc(0,0,5,0,Math.PI*2,true);
068    ctx.fill();
069  
070    // horn
071    ctx.translate(6, -8);
072    ctx.rotate(0.6*Math.PI);
073    wing(ctx, 5.5, 1.8);
074 }
075  
076 function neck(ctx, s)
077 {
078   if ( s < 10 ) { head(ctx); return; }
079    
080   var d = 0.85;
081   fillCircle(ctx, s);
082  
083   ctx.save();
084   ctx.rotate(-Math.PI/2);
085   ctx.translate(0, s);
086   fillCircle(ctx, s/2);
087   ctx.restore();
088  
089   ctx.rotate(-0.15);
090   ctx.translate(0, -s*(1+d));
091   neck(ctx, s*d);
092 }
093  
094 function loop(ctx, i) {
095  var inner = function() {
096    i++;
097  
098    ctx.fillStyle = "white";
099    ctx.fillRect(-1500,-1500,3000,3000);
100  
101    ctx.save();
102    ctx.translate(0, Math.cos(i*0.1)*40);
103  
104    var a = Math.sin(i*0.1);
105  
106    // right wing
107     ctx.save();
108    ctx.rotate(Math.PI*0.4);
109    wing(ctx, 18, a);
110    ctx.restore();
111  
112    // left wing
113    ctx.save();
114    ctx.scale(-1, 1);
115    ctx.rotate(Math.PI*0.4);
116    wing(ctx, 18, a);
117    ctx.restore();
118  
119    // tail
120    ctx.save();
121    tail(ctx, 20, Math.sin(i*0.05));
122    ctx.restore();
123  
124    // head
125    neck(ctx, 22);
126   
127    ctx.restore();
128    setTimeout(inner, 35); // change speed here
129  };
130  
131   return inner;
132 }
133  
134 function draw() {
135    var canvas = document.getElementById("canvas");
136    var ctx    = canvas.getContext("2d");
137  
138    ctx.translate(490, 410);
139    ctx.scale(0.4,0.4);
140    setTimeout(loop(ctx, 1), 1);
141 }

HTML

1 <body onload="draw()">
2   <canvas id="canvas" width="1000" height="1000"></canvas>
3 </body>

HTML5 canvas 创意:飞翔的凤凰的更多相关文章

  1. 16个富有创意的HTML5 Canvas动画特效集合

    HTML5技术正在不断的发展和更新,越来越多的开发者也正在加入HTML5阵营,甚至在移动开发上HTML5的地位也是越来越重要了.HTML5中的大部分动画都是通过Canvas实现,因为Canvas就像一 ...

  2. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  3. 赠书:HTML5 Canvas 2d 编程必读的两本经典

    赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...

  4. 如何使用 HTML5 Canvas 制作水波纹效果

    今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ...

  5. HTML5 Canvas 高仿逼真 3D 布料图案效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.下面给大家分享一个 HTML5 C ...

  6. 经典!HTML5 Canvas 模拟可撕裂布料效果

    这是一个模拟可撕裂布料效果的 HTML5 Canvas 应用演示,效果逼真.你会看到,借助 Canvas 的强大绘图和动画功能,只需很少的代码就能实现让您屏息凝神的效果. 温馨提示:为保证最佳的效果, ...

  7. 7 个顶级的 HTML5 Canvas 动画赏析

    HTML5确实是一项改革浏览器乃至整个软件行业的新技术,它可以帮助我们Web开发者很方便地在网页上实现动画特效,而无需臃肿的Flash作为支撑.本文分享7个顶级的HTML5 Canvas 动画,都有非 ...

  8. 分享8款令人惊叹的HTML5 Canvas动画特效

    HTML5的确可以制作出非常绚丽的网页动画效果,尤其是利用HTML5 Canvas特性和HTML5 3D特性,我们更加可以欣赏到超酷的动画特效.今天我从html5tricks网站上整理了8款令人惊叹的 ...

  9. 16个非常有趣的HTML5 Canvas动画特效集合

    HTML5技术正在不断的发展和更新,越来越多的开发者也正在加入HTML5阵营,甚至在移动开发上HTML5的地位也是越来越重要了.HTML5中的大部分动画都是通过Canvas实现,因为Canvas就像一 ...

随机推荐

  1. .NET中发送邮件的实现

    .NET中发送邮件 注意: 1.引用下列命名空间: using System.Net; using System.Net.Mail; 2.确保你使用的发送邮件的邮箱开启了stamp服务等. /// & ...

  2. sparksql读写hbase

    //写入hbase(hfile方式) org.apache.hadoop.hbase.client.Connection conn = null; try { SparkLog.debug(" ...

  3. 【Python 开发】第三篇:python 实用小工具

    一.快速启动一个web下载服务器 官方文档:https://docs.python.org/2/library/simplehttpserver.html 1)web服务器:使用SimpleHTTPS ...

  4. 在 CentOS 下手工安装 Docker v1.1x

    Docker在 centos 6.x 下面默认最新的版本是1.7, 然而这个并不符合我的实际需求, 尤其我需要 docker-compose 来作为编配工具部署swarm, 所以我只有手工安装了. 首 ...

  5. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  6. java — 重载和覆盖

    重载(overload):对于类的方法,方法名相同,参数列表不同的方法之间构成了重载关系. 参数列表:参数的类型.参数的个数.参数的顺序. 子类从父类继承来的方法也可以发生重载. 如果多个方法有相同的 ...

  7. TCP系列33—窗口管理&流控—7、Silly Window Syndrome(SWS)

    一.SWS介绍 前面我们已经通过示例看到如果接收端的应用层一直没有读取数据,那么window size就会慢慢变小最终可能变为0,此时我们假设一种场景,如果应用层读取少量数据(比如十几bytes),接 ...

  8. TCP系列10—连接管理—9、syncookie、fastopen与backlog

    这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...

  9. ZOJ 1457 E-Prime Ring Problem

    https://vjudge.net/contest/67836#problem/E A ring is compose of n circles as shown in diagram. Put n ...

  10. 织梦dede:list标签在列表页同一文章显示两次的解决方法

    在列表页用{dede:list}标签调用文章的时候出现了同一篇文章显示两次的问题,经过一天的奋战最后终于解决了,下面CMS集中营站长简单说下我的解决过程来供各位学友参考:1.怀疑是不是每次添加都会自动 ...