三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之

MDC的canvas经典教程辑和个人学习笔记
作者:Neoxone    发表时间: 2010年09月10号,星期五     阅读:6,306 次

mozilla developer center的关于canvas的教程集Canvas tutorial,可说是目前入门canvas教程中最棒的了。
教程列表:
Basic usage(中译:基本用法)
Drawing shapes(中译:绘制图形)
Using images(中译:使用图像)
Applying styles and colors(中译:运用样式与颜色)
Transformations(中译:变形)
Compositing(中译:组合)
Basic animations(中译:基本动画)

以下是个人的一点笔记,涵盖了教程中所有知识点。但只适用于个人,存此备忘。

canvas_ABC

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset='UTF-8' />
  5. <title>cssass.com</title>
  6. </head>
  7. <body>
  8. <canvas id="myCanvas" width='800' height="500" style="border:1px solid #c3c3c3;">ie(有ie9求测试)用户请绕行</canvas>
  9. <script type="text/javascript">
  10. var c=document.getElementById("myCanvas");
  11.  
  12. var con=c.getContext('2d');   //-----画矩形框
  13. var grd=con.createLinearGradient(10,10,150,10);
  14. grd.addColorStop(0,"#f00")//起色
  15. grd.addColorStop(1,"#0f0")//终色
  16. con.fillStyle=grd;   //渐变填充
  17.  
  18. con.rect(0, 0, 180,100)   //矩形1
  19. con.fillRect(10,10,150,75)//矩形2
  20. con.clearRect(20,20,80,40)//清除出一个矩形3
  21.  
  22. con.lineWidth=2;
  23. con.lineCap ='round'//线端点,默认butt; square和round会多出一半宽度的长度
  24. con.lineJoin = 'round'//折线连接点样式,默认miter延伸来连接;(round磨圆, beve削平) ;miter有miterLimit做限制,超过则应用beve
  25. con.strokeStyle = '#00f'
  26. con.strokeRect(30,30,20,20)//矩形边框
  27.  
  28. var con2=c.getContext('2d')//-------画折线
  29. con2.moveTo(20,10); //起点位置
  30. con2.lineTo(45,80)//点
  31. con2.lineTo(20,50)//点
  32. con2.lineTo(40,30);
  33. con2.stroke()//描边
  34. // con2.fill(); //填充
  35.  
  36. var con3=c.getContext('2d')//-------画圆
  37.  
  38. var radi=con3.createRadialGradient(290,50,10,295,60,30)// 径向渐变(x1,y1,r1,x2,y2,r2)
  39. radi.addColorStop(0, '#A7D30C');
  40. radi.addColorStop(0.9, '#019F62');
  41. //radi.addColorStop(1, 'rgba(1,159,98,0)');
  42. con3.fillStyle = radi;
  43.  
  44. con3.beginPath()//初始化路径
  45. con3.arc(290,50,50,0,Math.PI*2,true);   //(x,y,radius,起,末弧度,逆,顺时针)
  46. con3.closePath()//终止路径
  47. con3.stroke()
  48. con3.fill()
  49.  
  50. var con4=c.getContext('2d')//-------应用图片
  51. var img=new Image();
  52. img.src='http://bbs.blueidea.com/images/default/logo.gif';
  53. img.onload=function(){
  54.     con4.drawImage(img,10,90,200,200)//图片对象,位置,[尺寸],
  55.     var ptrn = con4.createPattern(img,'repeat')//图案填充
  56.     con4.fillStyle = ptrn;
  57.     con4.fillRect(0,350,150,150);
  58. }
  59.  
  60. //var con4_2=c.getContext('2d');
  61. //var img2=new Image();
  62. //img2.src='https://developer.mozilla.org/samples/canvas-tutorial/images/rhino.jpg';
  63. //con4_2.drawImage(document.getElementById('source'),33,71,104,124);
  64. //con4_2.drawImage(document.getElementById('source'),0,0,20,100,0,90,120,124);
  65.  
  66. var con5=c.getContext('2d')//二次,三次贝赛尔曲线
  67. con5.moveTo(200,0)  //起点
  68. con5.quadraticCurveTo(20, 20, 200, 200)//(1个)控制点,终点
  69. con5.stroke();
  70.  
  71. con5.moveTo(200,100)  //起点
  72. con5.bezierCurveTo(250, 250, 350, 350, 220, 220); //(2个)控制点,终点
  73. con5.stroke();
  74.  
  75. var con6=c.getContext('2d')//文字阴影
  76. con6.shadowOffsetX=2;
  77. con6.shadowOffsetY=2;
  78. con6.shadowBlur=2;
  79. con6.shadowColor='rgba(0,0,0,0.5)';
  80.  
  81. con6.font='20px Times New Roman';
  82. con6.fillStyle='black';
  83. con6.fillText('hello HTML5',0,300);
  84. </script>
  85. </body>
  86. </html>

canvas_DEF

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset='UTF-8' />
  5. <title>cssass.com</title>
  6. </head>
  7. <body>
  8. <canvas id="myCanvas" width='1000' height="600" style="border:1px solid #c3c3c3;">ie(有ie9求测试)用户请绕行</canvas>
  9. <script type="text/javascript">
  10. var c=document.getElementById("myCanvas");
  11.  
  12. var con1=c.getContext('2d');   //-----用于保存一些状态属性。
  13.   con1.fillRect(0,0,40,40);   
  14.   con1.save();                 
  15.  
  16.   con1.fillStyle = 'blue'   
  17.   con1.globalAlpha = 0.1;
  18.   con1.translate(50,0)//【平移】圆点位置(位置1)
  19.   con1.fillRect(0,0,40,40);
  20.   con1.save();            //注意:圆点位置状态也会被保存     
  21.  
  22.   con1.fillStyle = 'red' 
  23.   con1.globalAlpha = 1;
  24.   con1.translate(50,0);
  25.   con1.fillRect(0,0,40,40);   
  26.  
  27.   con1.restore();   //恢复到位置1状态
  28.   con1.translate(100,0); //从位置1开始移动100
  29.   con1.fillRect(0,0,40,40);  
  30.  
  31.   con1.restore();
  32.   con1.save();
  33.   con1.translate(200,0)
  34.   con1.rotate(Math.PI*2/6);  //以圆点(200,0)为中心,【旋转】六分之一个角度
  35.   con1.fillRect(0,0,40,40); 
  36.  
  37. con1.restore();
  38. con1.save();
  39. con1.scale(1,0.25);  //【缩放】
  40. con1.translate(250,0); 
  41. con1.fillRect(0,0,40,40); 
  42.  
  43. con1.restore();
  44. ~function draw() {  //【变形】示例:http://www.html5.jp/blog/contents/HTML5-Tech-Talk-201001/transform-jquery.html
  45.   con1.translate(200, 200);
  46.  
  47.   var sin = Math.sin(Math.PI/6);
  48.   var cos = Math.cos(Math.PI/6);
  49.   for (var i=0; i <= 12; i++) {
  50.     con1.fillRect(0, 0, 100, 10);
  51.     con1.transform(cos, sin, -sin, cos, 0, 0);  // (m11, m12, m21, m22, dx, dy) 水平缩放,垂直斜切,水平斜切,垂直缩放,水平平移,垂直平移。
  52.   }
  53.  
  54.   con1.setTransform(1,0.5 , 0, 1,0, 0);  //set重置后设置。
  55.   con1.fillRect(300,300, 100, 100);
  56. }()
  57. </script>
  58. </body>
  59. </html>

canvas_HIJ

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset='UTF-8' />
  5. <title>cssass.com</title>
  6. </head>
  7. <body>
  8. <canvas id="myCanvas" width='350' height="300" style="border:1px solid #c3c3c3;">ie(有ie9求测试)用户请绕行</canvas>
  9. <canvas id="myCanvas2" width='350' height="300" style="border:1px solid #c3c3c3;">ie(有ie9求测试)用户请绕行</canvas>
  10. <br />
  11. <select id='types' onchange='comp();'>
  12.     <option value='source-over' selected>source-over</option>
  13.     <option value='source-in'>source-in</option>
  14.     <option value='source-out'>source-out</option>
  15.     <option value='source-atop'>source-atop</option>
  16.     <option value='destination-over'>destination-over</option>
  17.     <option value='destination-in'>destination-in</option>
  18.     <option value='destination-out'>destination-out</option>
  19.     <option value='destination-atop'>destination-atop</option>
  20.     <option value='lighter'>lighter</option>
  21.     <option value='darker'>darker</option>
  22.     <option value='copy'>copy</option>
  23.     <option value='xor'>xor</option>
  24. </select>
  25.  
  26. <script type="text/javascript">
  27. var $id=function(n){
  28.     return document.getElementById(n) || n;
  29. }
  30. //组合
  31. var con1=$id("myCanvas").getContext('2d');   
  32. function comp(){ 
  33.     con1.save();
  34.     con1.clearRect(0,0,200,300);
  35.     con1.fillStyle = "#09f";
  36.     con1.fillRect(15,15,70,70);
  37.  
  38.     con1.globalCompositeOperation =$id('types').value; //对所以绘制的图形均起作用。
  39.    
  40.     con1.fillStyle = "#f30";
  41.     con1.beginPath();
  42.     con1.arc(75,75,35,0,Math.PI*2,true);
  43.     con1.fill();
  44.  
  45.     con1.restore(); 
  46.     con1.font='20px Times New Roman';
  47.     con1.fillText($id('types').value,0,200)
  48. }
  49. comp();
  50.  
  51. //clip
  52. var con2=$id("myCanvas2").getContext('2d'); 
  53. function draw() {
  54.   con2.save();
  55.   con2.translate(100,100);
  56.   con2.fillRect(0,0,150,150);
  57.   con2.translate(75,75);
  58.    
  59.   con2.beginPath();
  60.   con2.arc(0,0,60,0,Math.PI*2,true);
  61.   con2.clip();
  62.  
  63.   con2.fillStyle = '#143778';
  64.   con2.fillRect(-75,-75,150,150);
  65.  
  66.   for (j=1;j<50;j++){
  67.     con2.save();
  68.     con2.fillStyle = '#fff';
  69.     con2.translate(75-Math.floor(Math.random()*150),75-Math.floor(Math.random()*150));
  70.   
  71.     drawStar(con2,Math.floor(Math.random()*4)+2);
  72.     con2.restore();
  73.   }
  74.  
  75.   con2.restore();
  76. }
  77. draw();
  78.  
  79. function drawStar(con2,r){  //五角星的画法
  80.   con2.save();
  81.   con2.beginPath()
  82.   con2.moveTo(r,0);
  83.   for (i=0;i<9;i++){
  84.     con2.rotate(Math.PI/5);
  85.     if(i%2 == 0) {
  86.       con2.lineTo((r/0.525731)*0.200811,0);
  87.     } else {
  88.       con2.lineTo(r,0);
  89.     }
  90.   }
  91.   con2.closePath();
  92.   con2.fill();
  93.   con2.restore();
  94. }
  95. </script>
  96. </body>
  97. </html>

标签: , ,

4 条评论 发表在“MDC的canvas经典教程辑和个人学习笔记”上

  1. [...] 关于canvas的其他方法,可以参考这篇文章:MDC的canvas经典教程辑和个人学习笔记 相关文章:小试canvas鼠标绘图volume滑动块——html5中input [...]

  2. zlite 说:

    请教一下,在canvas_DEF实例中function闭包前面加一个~是什么意思呢

    回复

    ONEBOYS 回复:

    这个~是个位运算符,其实和(function(){})() 中的第一个() 操作符,还有 void function(){}() 里的void操作符一样,与function(){}这个表达式(函数)进行操作,再赋给一个匿名,因为这个操作不影响函数本质,后面的()就能进行调用了。只是~操作后,将返回一个Number值(通过void 则会返回一个undefined),但其实我们并不关心这个返回值。如果需要闭包内的返回值,就需要用()操作符了,如:var cc = (function(){return 1;})(); 我们这个用~只是因为这个~短罢了。

    回复

  3. zlite 说:

    3QU,明白了。花了两天时间把你博客全看完了,代码也写了运行测试了一下,收获不小,非常感激

    回复

留下回复

):9:( ):8:( ):7:( ):6:( ):5:( ):4:( ):3:( ):2:( ):20:( ):1:( ):19:( ):18:( ):17:( ):16:( ):15:( ):14:( ):13:( ):12:( ):11:( ):10:(