飞道的博客

一篇canvas带你画出整个特效世界

401人阅读  评论(0)

目录

一,canvas是啥?

1.初识canvas

2.路径绘制

3.拆分画法

4.清除画布 

5.绘制圆形笑脸

6.贝塞尔曲线

①二次贝塞尔曲线

②三次贝塞尔曲线


一,canvas是啥?

Canvas是HTML5中新出的一个元素,我们可以在上面绘制一系列图形。Canvas 在HTML文件中的写法很简单: <canvasid="canvas" width="宽度" height="高度"></canvas>,三个重要的属性,id,高度,宽度(这里就是指的你要在多宽多高的画布上来进行操作),canvas翻译过来就是画布的意思,所以我们也可以称他为画布

1.初识canvas

既然有画布了,那就得有画笔,所以我们的操作步骤为,创建画布,拿到该画布的元素,然后再拿起画笔,这里我们先画一个小矩形来看一下小效果,使用的是fillRect,参数分别为(x,y,w,h)这第一对参数啊就是坐标点,在哪一个坐标点开始画,第二对参数就是你画的东西多大,如果参数分别为(0,0,100,100)就是从远点开始,画一个宽高为100 的正方形


  
  1. <body>
  2. <canvas id="c1" width="600" height="400"> </canvas>
  3. <script>
  4. // 1.找到画布
  5. var c1 = document. querySelector( '#c1');
  6. // 2.获取画笔
  7. var ctx = c1. getContext( '2d');
  8. // 3.绘制图形 画一个矩形fillRect(位置x,位置y,宽度,高度)
  9. ctx. fillRect( 400, 100, 100, 100)
  10. </script>
  11. </body>

2.路径绘制

路径顾名思义就是只把该图形的路径画出来,也就是不进行内部填充,只进行边框的绘制,这里使用的是strokeRect 他的参数和fillRect的参数一样


  
  1. <body>
  2. <canvas id="c1" width="600" height="400">该浏览器不支持canvas </canvas>
  3. <script>
  4. var c1 = document. querySelector( '#c1');
  5. var ctx = c1. getContext( '2d');
  6. // 路径绘制矩形
  7. ctx. strokeRect( 100, 100, 100, 100)
  8. </script>
  9. </body>

3.拆分画法

步骤为: beginPath开始绘制,rect绘制图形,绘制方式(fill、stroke)closePath绘制结束


  
  1. <body>
  2. <canvas id="c1" width="600" height="400">该浏览器不支持canvas </canvas>
  3. <script>
  4. var c1 = document. querySelector( '#c1');
  5. var ctx = c1. getContext( '2d');
  6. // 拆分路径绘制矩形
  7. // 这里要使用beginPath,closePath
  8. ctx. beginPath(); // 开始绘画
  9. ctx. rect( 100, 100, 200, 100);
  10. ctx. stroke();
  11. ctx. closePath(); // 绘画结束
  12. // 拆分填充绘制矩形
  13. ctx. beginPath();
  14. ctx. rect( 200, 150, 200, 100);
  15. ctx. fill();
  16. ctx. closePath();
  17. </script>
  18. </body>

绘制效果 

4.清除画布 

甲:画完了之后,我感觉效果并不是很好,我不想要的我想重新绘制,该咋办呢?

乙:这还不简单啊,直接选中del不就好啦

山鱼:简单粗暴(๑•̀ㅂ•́)و✧,但是呢这里有个比较文雅的方式使用clearRect,清除画布

不仅可以清除画布,配合定时器还能实现动态效果呢,ok先来看一下clearRect里面的参数,仨,分别是(x,y,清除谁,清除多少),这里是从整个画布的远点开始清除,清除c1这个画布的高度,每次清除高度++,开启一个定时器就能获得动态清除的效果啦


  
  1. <body>
  2. <canvas id="c1" width="600" height="400">该浏览器不支持canvas </canvas>
  3. <script>
  4. var c1 = document. querySelector( '#c1');
  5. var ctx = c1. getContext( '2d');
  6. // 路径绘制矩形
  7. ctx. strokeRect( 100, 100, 200, 100);
  8. ctx. fillRect( 200, 150, 200, 100);
  9. // 逐渐的清除绘制的内容
  10. let height = 0;
  11. let t1= setInterval( () => {
  12. height++;
  13. ctx. clearRect( 0, 0, c1. clientHeight,height);
  14. if(height >c1. clientHeight){
  15. clearInterval(t1);
  16. }
  17. }, 10)
  18. </script>
  19. </body>

清除效果

5.绘制圆形笑脸

方块可以绘制那么圆形也肯定能绘制,接下来就进行圆形笑脸的绘制 ,先来绘制一个圆弧,使用的是arc这个参数为六个(x,y,半径,起始角度,结束角度,顺/逆时针【默认的是顺时针】)经过绘制就能得到一个⚪,一个圆为360度也就是2π所以结束的度数为Math.PI*2


  
  1. <canvas id="c1" width="600" height="400"> </canvas>
  2. <script>
  3. var c1 = document. querySelector( '#c1');
  4. var ctx = c1. getContext( '2d');
  5. // 使用arc()绘制圆形他有6个参数分别为
  6. // 圆心x,圆心y,半径,起始角度,结束角度,顺/逆时针(默认为顺时针)
  7. // false是顺时针true是逆时针
  8. ctx. arc( 300, 200, 50, 0, Math. PI* 2, false);
  9. ctx. stroke();
  10. </script>

 

开始绘制笑脸,这里使用的是moveTo和arc来共同完成的,moveTo() 方法把路径移动到画布中的指定点,不创建线条。绘制步骤为:创建画布,获取画布,获取画笔,开始绘制,绘制脸部


  
  1. <body>
  2. <canvas id="c1" width="600" height="400"> </canvas>
  3. <script>
  4. var c1 = document. querySelector( '#c1');
  5. var ctx = c1. getContext( '2d');
  6. // 使用arc()绘制圆形他有6个参数分别为
  7. // 圆心x,圆心y,半径,起始角度,结束角度,顺/逆时针(默认为顺时针)
  8. // false是顺时针true是逆时针
  9. // 1.绘制脸部
  10. ctx. beginPath();
  11. ctx. arc( 75, 75, 50, 0, Math. PI* 2);
  12. ctx. moveTo( 110, 75);
  13. // 2.绘制嘴巴
  14. ctx. arc( 75, 75, 35, 0, Math. PI);
  15. ctx. moveTo( 65, 65);
  16. // 3.绘制眼睛
  17. // 左眼
  18. ctx. arc( 60, 65, 5, 0, Math. PI* 2)
  19. ctx. moveTo( 95, 65);
  20. // 右眼
  21. ctx. arc( 90, 65, 5, 0, Math. PI* 2);
  22. ctx. stroke();
  23. ctx. closePath();
  24. </script>
  25. </body>

 

6.贝塞尔曲线

①二次贝塞尔曲线

使用二次贝塞尔曲线画一个气泡框

二次曲线:quadraticCurveTo (cp1x, cp1y, x, y) 贝塞尔曲线:bezierCurveTo (cp1x, cp1y, cp2x, cp2y, x, y) 画圆弧:arcTo (x1,y1,x2,y2,radius);


  
  1. <body>
  2. <canvas id="c1" width="600" height="400"> </canvas>
  3. <script>
  4. var c1 = document. querySelector( '#c1');
  5. var ctx = c1. getContext( '2d');
  6. ctx. beginPath();
  7. ctx. moveTo( 200, 300);
  8. ctx. quadraticCurveTo( 150, 300, 150, 200);
  9. ctx. quadraticCurveTo( 150, 100, 300, 100);
  10. ctx. quadraticCurveTo( 450, 100, 450, 200);
  11. ctx. quadraticCurveTo( 450, 300, 250, 300);
  12. ctx. quadraticCurveTo( 250, 350, 150, 350);
  13. ctx. quadraticCurveTo( 200, 350, 200, 300);
  14. ctx. stroke();
  15. ctx. closePath();
  16. </script>
  17. </body>

 

 

②三次贝塞尔曲线

使用三次贝塞尔曲线画一个小爱心


  
  1. <body>
  2. <canvas id="c1" width="600" height="400"> </canvas>
  3. <script>
  4. var c1 = document. querySelector( '#c1');
  5. var ctx = c1. getContext( '2d');
  6. ctx. beginPath();
  7. // 起初点
  8. ctx. moveTo( 300, 200);
  9. // 两个控制点
  10. ctx. bezierCurveTo( 350, 150, 400, 200, 300, 300);
  11. ctx. bezierCurveTo( 200, 200, 250, 150, 300, 200);
  12. ctx. stroke();
  13. ctx. closePath();
  14. </script>
  15. </body>

我是Aic山鱼,感谢您的支持
​原 创 不 易 ✨还希望支持一下
点赞👍:您的赞赏是我前进的动力!
收藏⭐:您的支持我是创作的源泉!
评论✍:您的建议是我改进的良药!
山鱼🦈社区:山鱼社区💌💌


转载:https://blog.csdn.net/zhaochen1127/article/details/128465959
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场