前端装逼必备--Canvas

妖狐艹你老母 2022-12-10 02:25 289阅读 0赞

如果写代码不是为了装逼,那人生将毫无意义。都2020年了,如果你从事前端开发,连canvas都不会用,那你拿啥去装逼?下面跟着笔者一起来看看canvas是啥,可以用来做啥,有哪些产品是canvas做出来的。


Canvas介绍

1.canvas是html5的一个新标签,属于h5的新特性
2.canvas标签是一个图形的容器,简单点说就是一块画布,你可以在上画矩形,圆形,三角形,折线等等,也可以用来画logo
3.它是通过javascript来画的,即脚本绘制图形

canvas可以用来干啥呢?
1.制作web网页游戏(但是如果代码写的不咋的游戏可能会非常卡)
2.数据可视化(这么说你可能不明白,但我告诉你echarts就是基于canvas)
3.广告banner的动态效果非常适合用canvas制作
4.canvas还可以用来内嵌一些网页

canvas基本用法

示例代码:

  1. <body onload="draw()">
  2. <canvas id="canvas" width="300" height="300"></canvas>
  3. </body>
  4. </html>
  5. <script>
  6. function draw() {
  7. // 获取画布
  8. var canvas = document.getElementById('canvas');
  9. if (canvas.getContext) { // 用于验证浏览器是否支持canvas,它是h5的新特性,老版本ie不支持
  10. var ctx = canvas.getContext("2d"); // 可选2d和3d
  11. ctx.fillStyle = "rgba(200, 0, 0, 1)"; // 填充色
  12. ctx.fillRect (10, 10, 55, 50); // 画矩形的方法,四个参数含义,前两个表示x,y坐标(相对于canvas的位置,并不是相对于窗口),从哪里开始画,后面表示长宽。
  13. ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
  14. ctx.fillRect (30, 30, 55, 50);
  15. // 绘制一个矩形,清除特定矩形,绘制边框
  16. ctx.fillRect(100, 100, 100, 100);
  17. ctx.clearRect(112.5, 112.5, 75, 75); // 清除矩形
  18. ctx.strokeRect(125, 125, 50, 50); // 矩形边框
  19. }
  20. }
  21. </script>

效果如下:
在这里插入图片描述

canvas进阶用法

画三角形示例代码:

  1. function draw() {
  2. // 获取画布
  3. var canvas = document.getElementById('canvas');
  4. // 路径画填充三角形
  5. if (canvas.getContext) {
  6. var ctx = canvas.getContext("2d");
  7. ctx.beginPath(); // 新建一个路径,绘制指定到这个路径上
  8. ctx.moveTo(75, 50); // 路径从哪开始
  9. ctx.lineTo(100, 75); // 到哪个点
  10. ctx.lineTo(100, 25);
  11. ctx.fill(); // 填充内容区域,生成实心图
  12. // 画描边三角形
  13. ctx.beginPath();
  14. ctx.moveTo(150, 150);
  15. ctx.lineTo(150, 60);
  16. ctx.lineTo(60, 150);
  17. ctx.closePath(); // 路径闭合方法
  18. ctx.stroke();
  19. }
  20. }

效果图如下:

在这里插入图片描述
画笑脸示例代码:

  1. function draw() {
  2. // 获取画布
  3. var canvas = document.getElementById('canvas');
  4. if (canvas.getContext) {
  5. var ctx = canvas.getContext("2d");
  6. ctx.beginPath();
  7. ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // 前两个圆心,后面半径,0代表从多少度开始画,Math.PI*2表示完整的弧长,true代表逆时针
  8. ctx.moveTo(110, 75); // 移动到哪,从哪里开始画
  9. ctx.arc(75, 75, 35, 0,Math.PI, false); // 顺时针画半圆(口)
  10. ctx.moveTo(65, 65);
  11. ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // 左眼小圆
  12. ctx.moveTo(95, 65);
  13. ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // 右眼小圆
  14. ctx.stroke();
  15. }
  16. }

效果图如下:
在这里插入图片描述
二次贝塞尔曲线画消息框和三次贝塞尔曲线画爱心

  1. function draw() {
  2. // 获取画布
  3. var canvas = document.getElementById('canvas');
  4. if (canvas.getContext) {
  5. var ctx = canvas.getContext("2d");
  6. ctx.beginPath();
  7. ctx.moveTo(75, 25);
  8. ctx.quadraticCurveTo(25, 25, 25, 62.5);
  9. ctx.quadraticCurveTo(25, 100, 50, 100);
  10. ctx.quadraticCurveTo(50, 120, 30, 125);
  11. ctx.quadraticCurveTo(60, 120, 65, 100);
  12. ctx.quadraticCurveTo(125, 100, 125, 62.5);
  13. ctx.quadraticCurveTo(125, 25, 75, 25);
  14. ctx.stroke();
  15. }
  16. }

效果图如下:
在这里插入图片描述
画爱心代码:

  1. function draw() {
  2. // 获取画布
  3. var canvas = document.getElementById('canvas');
  4. if (canvas.getContext) {
  5. var ctx = canvas.getContext("2d");
  6. ctx.beginPath();
  7. ctx.moveTo(75, 40);
  8. ctx.bezierCurveTo(75, 37, 70, 25, 50, 25);
  9. ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5);
  10. ctx.bezierCurveTo(20, 80, 40, 102, 75, 120);
  11. ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5);
  12. ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25);
  13. ctx.bezierCurveTo(85, 25, 75, 37, 75, 40);
  14. ctx.fill();
  15. }
  16. }

效果图如下:
在这里插入图片描述
动态样式颜色代码:

  1. function draw() {
  2. // 获取画布
  3. var ctx = document.getElementById('canvas').getContext("2d");
  4. for (var i = 0; i < 6; i++) {
  5. for (var j = 0; j < 6; j++) {
  6. ctx.fillStyle = 'rgb(' + Math.floor(255-42.5*i) + ',' +
  7. Math.floor(255-42.5*j) + ', 0)';
  8. ctx.fillRect(j * 25, i * 25, 25, 25);
  9. }
  10. }
  11. // for (var i=0;i<6;i++){
  12. // for (var j=0;j<6;j++){
  13. // ctx.strokeStyle = 'rgb(0,' + Math.floor(255-42.5*i) + ',' +
  14. // Math.floor(255-42.5*j) + ')';
  15. // ctx.beginPath();
  16. // ctx.arc(12.5+j*25,12.5+i*25,10,0,Math.PI*2,true);
  17. // ctx.stroke();
  18. // }
  19. // }
  20. // 画背景
  21. // ctx.fillStyle = '#FD0';
  22. // ctx.fillRect(0,0,75,75);
  23. // ctx.fillStyle = '#6C0';
  24. // ctx.fillRect(75,0,75,75);
  25. // ctx.fillStyle = '#09F';
  26. // ctx.fillRect(0,75,75,75);
  27. // ctx.fillStyle = '#F30';
  28. // ctx.fillRect(75,75,75,75);
  29. // ctx.fillStyle = '#FFF'; // 这里是圆的填充色![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923164433952.png#pic_center)
  30. // 设置透明度值
  31. // ctx.globalAlpha = 0.2;
  32. // 画半透明圆
  33. // for (var i=0;i<7;i++){
  34. // ctx.beginPath();
  35. // ctx.arc(75,75,10+10*i,0,Math.PI*2,true);
  36. // ctx.fill();
  37. // }
  38. }

效果图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
制作自己喜欢的个性文字logo代码:

  1. function draw() {
  2. // 获取画布
  3. var ctx = document.getElementById('canvas').getContext("2d");
  4. ctx.shadowOffsetX = 4;
  5. ctx.shadowOffsetY = 4;
  6. ctx.shadowBlur = 4;
  7. ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
  8. ctx.font = "30px Times New Roman";
  9. ctx.fillStyle = "black";
  10. ctx.fillText("西伯利亚狼", 5, 30);
  11. // ctx.font = "48px serif";
  12. // ctx.textBaseline = "hanging";
  13. // ctx.strokeText("西伯利亚狼", 10, 100);
  14. // 折线图雏形
  15. // ctx.beginPath();
  16. // ctx.moveTo(20, 200);
  17. // ctx.lineTo(60, 160);
  18. // ctx.lineTo(100, 160);
  19. // ctx.lineTo(160, 100);
  20. // ctx.stroke();
  21. }

效果图如下(示例):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高级动画

太阳系动画代码如下(示例):

  1. var sun = new Image();
  2. var moon = new Image();
  3. var earth = new Image();
  4. function init(){
  5. sun.src = 'https://mdn.mozillademos.org/files/1456/Canvas_sun.png';
  6. moon.src = 'https://mdn.mozillademos.org/files/1443/Canvas_moon.png';
  7. earth.src = 'https://mdn.mozillademos.org/files/1429/Canvas_earth.png';
  8. window.requestAnimationFrame(draw);
  9. }
  10. function draw() {
  11. var ctx = document.getElementById('canvas').getContext('2d');
  12. ctx.globalCompositeOperation = 'destination-over';
  13. ctx.clearRect(0,0,300,300); // clear canvas
  14. ctx.fillStyle = 'rgba(0,0,0,0.4)';
  15. ctx.strokeStyle = 'rgba(0,153,255,0.4)';
  16. ctx.save();
  17. ctx.translate(150,150);
  18. // Earth
  19. var time = new Date();
  20. ctx.rotate( ((2*Math.PI)/60)*time.getSeconds() + ((2*Math.PI)/60000)*time.getMilliseconds() );
  21. ctx.translate(105,0);
  22. ctx.fillRect(0,-12,50,24); // Shadow
  23. ctx.drawImage(earth,-12,-12);
  24. // Moon
  25. ctx.save();
  26. ctx.rotate( ((2*Math.PI)/6)*time.getSeconds() + ((2*Math.PI)/6000)*time.getMilliseconds() );
  27. ctx.translate(0,28.5);
  28. ctx.drawImage(moon,-3.5,-3.5);
  29. ctx.restore();
  30. ctx.restore();
  31. ctx.beginPath();
  32. ctx.arc(150,150,105,0,Math.PI*2,false); // Earth orbit
  33. ctx.stroke();
  34. ctx.drawImage(sun,0,0,300,300);
  35. window.requestAnimationFrame(draw);
  36. }
  37. init();

效果图如下:
在这里插入图片描述

炫酷鼠标跟随动画代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <script>
  9. var cn;
  10. //= document.getElementById('cw');
  11. var c;
  12. var u = 10;
  13. const m = {
  14. x: innerWidth / 2,
  15. y: innerHeight / 2
  16. };
  17. window.onmousemove = function(e) {
  18. m.x = e.clientX;
  19. m.y = e.clientY;
  20. }
  21. function gc() {
  22. var s = "0123456789ABCDEF";
  23. var c = "#";
  24. for (var i = 0; i < 6; i++) {
  25. c += s[Math.ceil(Math.random() * 15)]
  26. }
  27. return c
  28. }
  29. var a = [];
  30. window.onload = function myfunction() {
  31. cn = document.getElementById('cw');
  32. c = cn.getContext('2d');
  33. for (var i = 0; i < 10; i++) {
  34. var r = 30;
  35. var x = Math.random() * (innerWidth - 2 * r) + r;
  36. var y = Math.random() * (innerHeight - 2 * r) + r;
  37. var t = new ob(innerWidth / 2,innerHeight / 2,5,"red",Math.random() * 200 + 20,2);
  38. a.push(t);
  39. }
  40. //cn.style.backgroundColor = "#700bc8";
  41. c.lineWidth = "2";
  42. c.globalAlpha = 0.5;
  43. resize();
  44. anim()
  45. }
  46. window.onresize = function() {
  47. resize();
  48. }
  49. function resize() {
  50. cn.height = innerHeight;
  51. cn.width = innerWidth;
  52. for (var i = 0; i < 101; i++) {
  53. var r = 30;
  54. var x = Math.random() * (innerWidth - 2 * r) + r;
  55. var y = Math.random() * (innerHeight - 2 * r) + r;
  56. a[i] = new ob(innerWidth / 2,innerHeight / 2,4,gc(),Math.random() * 200 + 20,0.02);
  57. }
  58. // a[0] = new ob(innerWidth / 2, innerHeight / 2, 40, "red", 0.05, 0.05);
  59. //a[0].dr();
  60. }
  61. function ob(x, y, r, cc, o, s) {
  62. this.x = x;
  63. this.y = y;
  64. this.r = r;
  65. this.cc = cc;
  66. this.theta = Math.random() * Math.PI * 2;
  67. this.s = s;
  68. this.o = o;
  69. this.t = Math.random() * 150;
  70. this.o = o;
  71. this.dr = function() {
  72. const ls = {
  73. x: this.x,
  74. y: this.y
  75. };
  76. this.theta += this.s;
  77. this.x = m.x + Math.cos(this.theta) * this.t;
  78. this.y = m.y + Math.sin(this.theta) * this.t;
  79. c.beginPath();
  80. c.lineWidth = this.r;
  81. c.strokeStyle = this.cc;
  82. c.moveTo(ls.x, ls.y);
  83. c.lineTo(this.x, this.y);
  84. c.stroke();
  85. c.closePath();
  86. }
  87. }
  88. function anim() {
  89. requestAnimationFrame(anim);
  90. c.fillStyle = "rgba(0,0,0,0.05)";
  91. c.fillRect(0, 0, cn.width, cn.height);
  92. a.forEach(function(e, i) {
  93. e.dr();
  94. });
  95. }
  96. </script>
  97. <style>
  98. #cw {
  99. position: fixed;
  100. z-index: -1;
  101. }
  102. body {
  103. margin: 0;
  104. padding: 0;
  105. background-color: rgba(0,0,0,0.05);
  106. }
  107. </style>
  108. </head>
  109. <body>
  110. <canvas id="cw"></canvas>
  111. qwerewr
  112. </body>
  113. </html>

效果图如下:
在这里插入图片描述

总结

canvas是一个功能非常强大的画板,看完了笔者的示例代码,希望你也能有所收获,canvas能做非常多的鼠标跟随以及动态粒子动画,学通了canvas你还愁装不了逼了吗,喜欢的小伙伴记得收藏一下,欢迎一起交流学习。

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 前端必备--Canvas

    如果写代码不是为了装逼,那人生将毫无意义。都2020年了,如果你从事前端开发,连canvas都不会用,那你拿啥去装逼?下面跟着笔者一起来看看canvas是啥,可以用来做啥,有哪

    相关 程序员回家反击指南

    一年很快,眼见这周就过年了, 就不推技术文,大家都好不容易抢到回家的票,咋们回家过个年,真心不容易,最后抢到了票,但是回家还有更多的难关在等大家。 心心念念的想着终于可以阖家