找回密码
 立即注册

QQ登录

只需一步,快速开始

断天涯大虾
社区贡献组   /  发表于:2016-8-3 11:07  /   查看:8840  /  回复:0
本帖最后由 断天涯大虾 于 2017-1-16 10:04 编辑

在上一篇学习了HTML5的一些非常重要的基本知识,今天将进行更深层的学习。

首先来回顾第一天学习的内容,第一天学习了新标签,新控件,验证功能,应用缓存等内容。

第2天将学习如何使用 Canvas 和 SVG 实现绘图功能。


Lab1 -- 使用Canvas

Canvas 是指定了长度和宽度的矩形画布,我们将使用新的HTML5 JavaScript,可使用HTML5 JS API 来画出各种图形。

初始化

1. 创建HTML页面

  1. <html>
  2. <head></head>
  3. <body></body>
  4. </html>
复制代码

2. 在Body标签内添加Canvas

  1. <canvas id="MyCanvas" width="500px" height="500px" style="border:1px solid black;">

  2. </canvas>
复制代码

3. 在<head>标签内添加Script 标签

  1. <head>

  2. <script type="text/javascript">

  3. </script>

  4. </head>
复制代码

4. 在Script 标签内创建JavaScript 函数 Draw ,Draw函数能够访问Canvas 对象

  1. function Draw()
  2. {
  3.     var ctx = document.getElementById('MyCanvas').getContext("2d");      
  4.     //Canvas Code Comes Here
  5. }
复制代码


Lab 1.1 使用 Path

Path 由0个或多个Sub Path组成,每个Sub path 是是由一个或多个终点组成,每个终点是通过直线或曲线连接的。

Lab1.1.1 使用Single 创建Path;

脚本片段:

  1. ctx.beginPath();

  2. ctx.strokeStyle = <span class="str">"blue"</span>;

  3. ctx.moveTo(75, 50);

  4. ctx.lineTo(75, 100);

  5. ctx.stroke();

  6. ctx.strokeStyle = <span class="str">"red"</span>;

  7. ctx.lineTo(25, 100);

  8. ctx.stroke();
复制代码

输出:

上述示例中Path 是由2个子路径组成的。

BeginPath—— 创建新路径

strokeStyle 用于设置样式

每次调用Stroke 方法,所有的子路径都会使用当前的Style 重新画。


Lab 1.1.2 使用Multiple Begin Path创建Path

核心代码:

  1. ctx.beginPath();

  2. ctx.strokeStyle = <span class="str">"blue"</span>;

  3. ctx.moveTo(75, 50);

  4. ctx.lineTo(75, 100);

  5. ctx.stroke();

  6. ctx.beginPath();

  7. ctx.moveTo(75, 100);

  8. ctx.strokeStyle = <span class="str">"red"</span>;

  9. ctx.lineTo(25, 100);

  10. ctx.stroke();
复制代码

输出:

Lab1.1.3 理解ClosePath

核心代码:

  1. ctx.beginPath();

  2. ctx.strokeStyle = <span class="str">"blue"</span>;

  3. ctx.moveTo(75, 50);

  4. ctx.lineTo(75, 100);

  5. ctx.lineTo(25, 100);

  6. ctx.closePath();

  7. ctx.stroke();
复制代码
输出:


Lab1.1.4 理解Fill

核心代码

  1. ctx.beginPath();

  2. ctx.moveTo(75, 50);

  3. ctx.lineTo(75, 100);

  4. ctx.lineTo(25, 100);

  5. ctx.fillStyle = <span class="str">"red"</span>;

  6. ctx.fill();
复制代码

输出:

Lab1.1.5 画曲线

quadraticCurveTo 函数定义了四个参数,前两个点是控制点,用于曲率计算,后两个参数是终点的曲度核心代码:

  1. ctx.beginPath();

  2. ctx.moveTo(175, 50)

  3. ctx.quadraticCurveTo(60, 360, 175, 300);

  4. ctx.stroke()
复制代码

输出:


Lab 1.2 使用Rectangle

Lab1.2.1 画矩形

  1. ctx.fillStyle=<span class="str">"red"</span>;

  2. ctx.fillRect(75, 75, 150, 150);      

  3. ctx.strokeStyle = <span class="str">"black"</span>;

  4. ctx.lineWidth = 5;

  5. ctx.strokeRect(175,175,150,150);
复制代码

输出:

Lab1.2.2 清除矩形

代码

  1. ctx.fillStyle=<span class="str">"red"</span>;

  2. ctx.fillRect(75, 75, 250, 250);

  3. ctx.clearRect(125, 125, 100, 100);
复制代码

输出

Lab 1.3 使用渐变色

Lab1.3.1 使用线性渐变色

  1. var grd = ctx.createLinearGradient(75, 75, 225, 75);

  2. grd.addColorStop(0, <span class="str">"black"</span>);

  3. grd.addColorStop(0.2, <span class="str">"magenta"</span>);

  4. grd.addColorStop(0.4, <span class="str">"blue"</span>);

  5. grd.addColorStop(0.6, <span class="str">"green"</span>);

  6. grd.addColorStop(0.8, <span class="str">"yellow"</span>);

  7. grd.addColorStop(1, <span class="str">"red"</span>);

  8. ctx.fillStyle = grd

  9. ctx.fillRect(75, 75, 150, 150);
复制代码

输出

注意:

reateLinearGradient 包含四个参数x1,y1,x2,y2

1. 如果x1=x2 并且y1!=y2,渐变色改变的方向则是水平。

2. 如果y1=y2 并且x1!=x2, 渐变色方向是垂直的。

3. 如果x1!=x2且y1!=y2,渐变色方向则为对角。


AddColorStop 函数包含两个参数。

1. 0到1 之间的数字,用来表示渐变色起始和终点的位置。

2. Color;


Lab1.3.2 使用圆形渐变

代码

  1. var grd = ctx.createRadialGradient(150, 150, 5, 150, 150,85);

  2. grd.addColorStop(0, <span class="str">"orange"</span>);

  3. grd.addColorStop(0.2, <span class="str">"magenta"</span>);

  4. grd.addColorStop(0.4, <span class="str">"blue"</span>);

  5. grd.addColorStop(0.6, <span class="str">"green"</span>);

  6. grd.addColorStop(0.8, <span class="str">"yellow"</span>);

  7. grd.addColorStop(1, <span class="str">"red"</span>);

  8. ctx.fillStyle = grd

  9. ctx.fillRect(75, 75, 150, 150);
复制代码

输出

CreateRadialGradiant包含6个参数,x1,y1,r1,x2,y2,r2

1, x1,y1,r1代表开始圆形的圆心和半径

2. x2,y2,r2 表示结束圆的圆心和半径


Lab 1.4 使用圆形

核心代码

  1. ctx.beginPath();

  2. ctx.fillStyle=<span class="str">"yellow"</span>;

  3. ctx.strokeStyle=<span class="str">"green"</span>;

  4. ctx.lineWidth = <span class="str">"8"</span>;

  5. ctx.arc(100, 175, 85, 0, 2*Math.PI);

  6. ctx.fill();

  7. ctx.stroke();


  8. ctx.beginPath();

  9. ctx.fillStyle = <span class="str">"green"</span>;

  10. ctx.strokeStyle = <span class="str">"yellow"</span>;

  11. ctx.lineWidth = <span class="str">"8"</span>;

  12. ctx.arc(285, 175, 85, 0, 1 * Math.PI);

  13. ctx.fill();

  14. ctx.stroke();
复制代码
输出

DrawArc 函数包含5个参数,x,y,r,sa,eax 和y 表示圆心r表示半径sa 和ea 是开始边缘和结束边缘Lab1.5 使用Text

代码

  1. ctx.beginPath();

  2. ctx.font = "30px Segoe UI";

  3. ctx.fillText("www.StepByStepSchools.Net",0, 150);
复制代码
输出

fillText/stokeText具有三个参数1. 实际输出的文本2. x,y 是可选值。Lab 1.6 Scale
  1. ctx.strokeRect(75, 75, 75, 75);

  2. ctx.scale(2,2);

  3. ctx.strokeRect(75, 75, 75, 75);
复制代码

输出


Lab 1.7 旋转

代码片段

  1. ctx.rotate(0.2);

  2. ctx.strokeRect(75, 75, 75, 75);
复制代码

输出


Lab 1.8 转换

代码

  1. ctx.strokeRect(0, 0, 150, 150);

  2. ctx.translate(150, 150);

  3. ctx.strokeRect(0, 0, 150, 150);
复制代码

输出


Lab 1.9 保存和重置Canvas 的状态
  1. ctx.fillStyle=<span class="str">"red"</span>;

  2. ctx.fillRect(75, 75, 150, 150);

  3. ctx.fillStyle = <span class="str">"blue"</span>;            

  4. ctx.fillRect(90, 90, 50, 50);

  5. ctx.save();

  6. ctx.fillStyle = <span class="str">"yellow"</span>;

  7. ctx.fillRect(90, 160, 50, 50);

  8. ctx.save();

  9. ctx.fillStyle = <span class="str">"green"</span>;

  10. ctx.restore();

  11. ctx.restore();

  12. ctx.fillRect(160, 160, 50, 50);
复制代码

输出


Lab 1.10 使用图像

  1. <blockquote>vari = new Image();
复制代码

输出


Lab1.11 使用Canvas 生成动画

一旦在Canvas 填充好东西就无法修改,可采用以下方法来修改:

1. 使用ClearRect 函数删除存在的元素

2. 添加新属性重画元素

当以上策略与传统的JS 函数结合,可使用TimeOut 或SetInterval 方法来实现,可产生动画。


代码

  1. <blockquote>var interval;
复制代码

输出


Lab 2 使用SVG 工作

如Canvas,SVG 支持在矩形中画图像,接下来将了解到Canvas 与SVG 的区别。

初始化

1. 新建HTML页面

  1. <html>

  2. <head></head>

  3. <body></body>

  4. </html>
复制代码
2. 在body 标签内新建Canvas :
  1. <blockquote><SVG id="MySVG" width="500px" height="500px" style="border:1px solid black;">
复制代码


Lab2.1 画出多种形状
代码:
  1. <blockquote><svg width="205" height="200">
复制代码

输出


Lab 2.2SVG 动画

SVG 使得动画制作变得简单:

初始化设置

  1. <blockquote><svg width="205" height="220">
复制代码

眨眼动画

  1. <pre class="csharpcode" style="background-color: rgb(255, 255, 255);"><font color="#000000" face="consolas, Courier New, courier, monospace" size="2"><span style="line-height: 24px; white-space: pre-wrap;"><!--Left Eye-->

  2.         <ellipse cx="75" cy="95" rx="15" ry="15"

  3.                     style="fill:white;stroke:black;stroke-width:1" />

  4.         <!--Left Eye ball-->

  5.         <ellipse cx="75" cy="95" rx="5" ry="5"

  6.                     style="fill:black;stroke:black;stroke-width:1">

  7.             <animate attributeName="cx" attributeType="XML"

  8.                         from="75" to="85" id="Left1" repeatCount="1"

  9.                         begin="0s;Left5.end" dur="0.5s" />

  10.             <set attributeName="cx" attributeType="XML"

  11.                     to="85"

  12.                     begin="Left1.end" />


  13.             <animateTransform attributeName="transform"

  14.                                 type="rotate" id="Left2"

  15.                                 from="0 75 95" to="360 75 95"

  16.                                 begin="Left1.end" dur="1s"

  17.                                 repeatCount="3">

  18.             </animateTransform>

  19.             <animate attributeName="cx" attributeType="XML"

  20.                         from="85" to="65" id="Left3"

  21.                         begin="Left2.end" dur="0.5s" />

  22.             <set attributeName="cx" attributeType="XML"

  23.                     to="65"

  24.                     begin="Left3.end" />


  25.             <animateTransform attributeName="transform"

  26.                                 type="rotate" id="Left4"

  27.                                 from="360 75 95" to="0 75 95"

  28.                                 begin="Left3.end" dur="1s"

  29.                                 repeatCount="3">

  30.             </animateTransform>

  31.             <animate attributeName="cx" attributeType="XML"

  32.                         from="65" to="75" id="Left5"

  33.                         begin="Left4.end" dur="0.5s" />

  34.             <set attributeName="cx" attributeType="XML"

  35.                     to="75"

  36.                     begin="Left4.end" >

  37.             </set>

  38.         </ellipse>
  39. <!--Right Eye-->

  40.         <ellipse cx="125" cy="95" rx="15" ry="15"

  41.                     style="fill:white;stroke:black;stroke-width:1" />

  42.         <!--Right Eye ball-->

  43.         <ellipse cx="125" cy="95" rx="5" ry="5" style="fill:black;stroke:black;stroke-width:1">

  44.             <animate attributeName="cx" attributeType="XML"

  45.                         from="125" to="135" id="Right1" repeatCount="1"

  46.                         begin="0s;Right5.end" dur="0.5s" />

  47.             <set attributeName="cx" attributeType="XML" to="135" begin="Right1.end" />


  48.             <animateTransform attributeName="transform"

  49.                                 type="rotate" id="Right2"

  50.                                 from="0 125 95" to="360 125 95"

  51.                                 begin="Right1.end" dur="1s"

  52.                                 repeatCount="3">

  53.             </animateTransform>

  54.             <animate attributeName="cx" attributeType="XML"

  55.                         from="135" to="115" id="Right3"

  56.                         begin="Right2.end" dur="0.5s" />

  57.             <set attributeName="cx" attributeType="XML"

  58.                     to="115"

  59.                     begin="Right3.end" />


  60.             <animateTransform attributeName="transform"

  61.                                 type="rotate" id="Right4"

  62.                                 from="360 125 95" to="0 125 95"

  63.                                 begin="Right3.end" dur="1s"

  64.                                 repeatCount="3">

  65.             </animateTransform>

  66.             <animate attributeName="cx" attributeType="XML"

  67.                         from="115" to="125" id="Right5"

  68.                         begin="Right4.end" dur="0.5s" />

  69.             <set attributeName="cx" attributeType="XML" to="125" begin="Right4.end" />

  70.         </ellipse></span></font></pre>
复制代码

张嘴动画

  1. <blockquote><clipPath id="cut-off-bottom">
复制代码

盒子动画效果

  1. <pre class="csharpcode" style="background-color: rgb(255, 255, 255);"><font color="#000000" face="consolas, Courier New, courier, monospace" size="2"><span style="line-height: 24px; white-space: pre-wrap;"><!--Box Anmation-->

  2.         <rect x="0" y="165" width="14" height="14"

  3.               stroke-width="2" fill="brown">

  4.             <animate attributeName="width" attributeType="XML"

  5.                      from="0" to="210" id="leftToRight"

  6.                      begin="0;bottomToTop.end" dur="1s" />

  7.             <set attributeName="width" attributeType="XML"

  8.                  to="14"

  9.                  begin="leftToRight.end-0.2" />

  10.             <set attributeName="x" attributeType="XML"

  11.                  to="191"

  12.                  begin="leftToRight.end-0.2" />


  13.             <animate attributeName="height" attributeType="XML"

  14.                      from="14" to="55" id="topToBottom"

  15.                      begin="leftToRight.end" dur="1s" />

  16.             <set attributeName="height" attributeType="XML"

  17.                  to="14"

  18.                  begin="topToBottom.end-0.2" />

  19.             <set attributeName="y" attributeType="XML"

  20.                  to="206"

  21.                  begin="topToBottom.end-0.2" />


  22.             <animate attributeName="width" attributeType="XML"

  23.                      from="0" to="210" id="rightToLeft"

  24.                      begin="topToBottom.end" dur="1s" />

  25.             <animate attributeName="x" attributeType="XML"

  26.                      from="206" to="0" id="rightToLeft"

  27.                      begin="topToBottom.end" dur="1s" />

  28.             <set attributeName="width" attributeType="XML"

  29.                  to="14"

  30.                  begin="rightToLeft.end-0.2" />

  31.             <set attributeName="x" attributeType="XML"

  32.                  to="0"

  33.                  begin="rightToLeft.end-0.2" />


  34.             <animate attributeName="height" attributeType="XML"

  35.                      from="14" to="55" id="bottomToTop"

  36.                      begin="rightToLeft.end" dur="1s" />

  37.             <animate attributeName="y" attributeType="XML"

  38.                      from="206" to="165" id="bottomToTop"

  39.                      begin="rightToLeft.end" dur="1s" />

  40.             <set attributeName="height" attributeType="XML"

  41.                  to="14"

  42.                  begin="bottomToTop.end-0.2" />

  43.             <set attributeName="y" attributeType="XML"

  44.                  to="165"

  45.                  begin="bottomToTop.end-0.2" />

  46.         </rect>


  47.         <line x1="0" y1="165" x2="205" y2="165" style="stroke:brown;

  48. stroke-width:2" />

  49.         <text x="14" y="200" font-family="Comic Sans MS'" fill="Blue">A coder can be creative</text></span></font></pre>
复制代码

输出




SVG VS Canvas

SVG 和 Canvas 区别:

  • Vector VS Pixel

Canvas 是基于 Pixel 而 SVG 是基于 Vector

简单来说SVG图片是与屏幕分辨率无关的,而Canvas 不是。

  • XML VS JavaScript

SVG使用语义标记可绘出图形,然而Canvas就只能使用JS脚本代码。

  • 支持事件处理

Canvas 不支持事件处理,SVG 支持。


HTML

  1. <blockquote>  <svg width="120" height="120">
复制代码

JavaScript

  1. <blockquote><script type="text/javascript">
复制代码
输出

  • 支持图片保存
Canvas 最后可输出为图像,可使用浏览器默认的选项将图像保存。而SVG 不支持。


   
关于葡萄城:全球最大的控件提供商,世界领先的企业应用定制工具、企业报表和商业智能解决方案提供商,为超过75%的全球财富500强企业提供服务。

0 个回复

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