0


前端小白的学习之路(HTML5 二)

提示:<svg>与<canvas>

目录


一、svg标签

1.简介

  1. SVGScalable Vector Graphics,可缩放矢量图形)是一种用于描述二维图形和动画的 XML 标记语言。它支持基本形状、路径、文本、图像、渐变、滤镜等元素,可以创建丰富多彩、高度可定制的图形和动画效果,特点是可以无限缩放而不失真。

2.常用属性

  1. widthheight:用于指定SVG图形的宽度和高度。您可以使用像素(px)、百分比(%)等单位。<svg width="200" height="100">
  2. viewBox:用于指定SVG图形的视口框。视口框定义了用户坐标系的范围,并且可以通过它来实现图形的缩放和移动。<svg viewBox="0 0 200 100">
  3. xmlns:用于指定XML命名空间。对于SVG,通常是指定为"http://www.w3.org/2000/svg"。```<svg xmlns="http://www.w3.org/2000/svg">```
  4. fill:用于指定SVG图形的填充颜色。<svg fill="red">
  5. strokestroke-width:分别用于指定SVG图形的边框颜色和宽度。<svg stroke="black" stroke-width="2">
  6. classid:用于为SVG图形指定类名和唯一标识符ID,以便通过CSS或JavaScript进行样式和操作控制。<svg class="my-svg" id="svg1">
  7. preserveAspectRatio:用于指定如何适应SVG图形的视口框和容器大小之间的比例关系。<svg preserveAspectRatio="xMinYMin meet">

3.<path>标签

  1. <path>

标签用于在 SVG 中定义一个路径。路径可以是直线、曲线、圆弧、贝塞尔曲线等,通过指定路径数据来描述形状。

  1. <path>

标签的主要属性是

  1. d

,它用于定义路径的数据。路径数据是一系列的命令和参数,指示了如何绘制路径的形状和轮廓。路径数据中的命令包括移动到(M)、直线到(L)、水平线到(H)、垂直线到(V)、曲线到(C、S、Q、T)、弧线到(A)等。

示例:

  1. <!--使用<path>做一个三角形-->
  2. <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  3. <path d="M 10 10 L 90 10 L 50 90 Z" fill="none" stroke="black" />
  4. </svg>

4.使用示例

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  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>基本模板</title>
  8. <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
  9. </head>
  10. <body>
  11. <!-- 矢量图: 一种缩放不容易失真的图片 -->
  12. <svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px" fill="green" class="bi bi-1-circle"
  13. viewBox="0 0 16 16">
  14. <path
  15. d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8Zm15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0ZM9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383h1.312Z" />
  16. </svg>
  17. <!-- xmlns="http://www.w3.org/2000/svg":指定 SVG 命名空间。
  18. width="100px" height="100px":指定 SVG 图形的宽度和高度为 100 像素。
  19. fill="green":指定图形的填充颜色为绿色。
  20. class="bi bi-1-circle":指定图形的 CSS 类名,用于样式控制。
  21. viewBox="0 0 16 16":指定 SVG 图形的视口框,用于定义用户坐标系的范围。
  22. <path> 元素:
  23. d 属性:定义了 SVG 路径数据,描述了要绘制的路径的形状和轮廓。路径数据使用 SVG 路径命令来描述,如 M、A、L 等。在这个例子中,路径数据描述了一个圆形的轮廓和一个中空的圆环。
  24. M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8Z:描述了一个圆形轮廓,圆心在坐标 (1, 8),半径为 7。
  25. m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0Z:描述了一个中空的圆环,圆心在坐标 (15, 0),半径为 8。
  26. M9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383h1.312Z:描述了圆环内部的一些装饰效果。 -->
  27. </body>
  28. </html>

二、canvas标签

1.简介

canvas 是画布标签,需要结合JS才能使用。应用场景: 1. 展示广告2. 数据统计(柱状图、折线图、饼状图) 3. JS小游戏。

2.常用属性与方法

  1. 属性:- width:画布的宽度。- height:画布的高度。
  2. 获取上下文对象的方法:- getContext('2d'):获取绘图上下文对象,用于绘制2D图形。
  3. 绘制图形:- fillRect(x, y, width, height):绘制填充的矩形。- strokeRect(x, y, width, height):绘制边框的矩形。- clearRect(x, y, width, height):清除指定矩形区域的内容。- fillText(text, x, y [, maxWidth]):绘制填充的文本。- strokeText(text, x, y [, maxWidth]):绘制边框的文本。- drawImage(image, x, y [, width, height]):绘制图像。
  4. 路径绘制:- beginPath():开始绘制路径。- moveTo(x, y):将笔触移动到指定位置。- lineTo(x, y):绘制一条直线到指定位置。- arc(x, y, radius, startAngle, endAngle [, anticlockwise]):绘制圆弧。(x:圆心的 x 坐标,y:圆心的 y 坐标,radius:圆的半斤,startAngle:起始角度,以弧度为单位 ,endAngle:结束角度,以弧度为单位,anticlockwise(可选):布尔值,表示绘制方向。如果为 true,则逆时针绘制;如果为 false(默认值),则顺时针绘制)- closePath():闭合路径。- stroke():绘制路径的边框。- fill():填充路径。
  5. 样式设置:- fillStyle:设置图形的填充颜色或样式。- strokeStyle:设置图形的边框颜色或样式。- lineWidth:设置线条的宽度。- font:设置文本的字体样式。
  6. 其他方法:- save():保存当前绘图状态。- restore():恢复之前保存的绘图状态。- clearRect(x, y, width, height):清除指定矩形区域的内容。- translate(x, y):移动绘图原点。- rotate(angle):旋转坐标系。- scale(x, y):缩放绘图。

3.使用示例

1)绘制基础图案

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  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>基本模板</title>
  8. <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
  9. <style>
  10. canvas {
  11. background-color: #ccc;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <!--
  17. 特别提醒:
  18. canvas不是容器标签,是画布标签,用于绘制图形图像。
  19. 需要结合JS才能使用。
  20. 默认尺寸: 300 * 150
  21. 不是通过css给图片上颜色, 也不是通过css给图片设置尺寸!!
  22. 如果浏览器提示canvas标签包裹着的文本,就说明该浏览器不支持canvas标签,那就需要换一个浏览器试试!
  23. -->
  24. <canvas id="canvas">当前浏览器不支持canvas标签(画布标签),请换一个浏览器再尝试!</canvas>
  25. <script>
  26. // canvas 是画布标签,需要结合JS才能使用。
  27. // 应用场景:
  28. // 1. 展示广告
  29. // 2. 数据统计(柱状图、折线图、饼状图)
  30. // 3. JS小游戏
  31. // 有哪些api?
  32. // 绘制线
  33. // 绘制矩形
  34. // 绘制圆形
  35. // 绘制图片
  36. // 绘制文本
  37. // ...
  38. // 怎么使用?
  39. // 获取canvas对象
  40. var canvas = document.getElementById("canvas");
  41. // 设置画布尺寸
  42. canvas.width = 600;
  43. canvas.height = 800;
  44. // 获取绘制图形图像的对象 (画笔)
  45. var pen = canvas.getContext("2d");
  46. console.log(pen);
  47. // 坐标(0,0)在画布的左上角
  48. // // 1) 绘制线
  49. // // 开始绘制
  50. // pen.beginPath();
  51. // // 设置描边颜色
  52. // pen.strokeStyle = "red";
  53. // // 设置线的宽度
  54. // pen.lineWidth = 5
  55. // // 设置线的样式
  56. // // pen.lineCap = ""
  57. // // 设置起点
  58. // // pen.moveTo(x,y)
  59. // pen.moveTo(100,200);
  60. // // 设置下一个点(终点)
  61. // pen.lineTo(500,200);
  62. // // 结束绘制
  63. // pen.closePath();
  64. // // 描边
  65. // pen.stroke();
  66. // // 2) 绘制三角形
  67. // // 开始绘制
  68. // pen.beginPath();
  69. // // 设置描边颜色
  70. // pen.strokeStyle = "red";
  71. // // 填充颜色
  72. // pen.fillStyle="yellow"
  73. // // 设置线的宽度
  74. // pen.lineWidth = 5
  75. // // 设置线的样式
  76. // // pen.lineCap = ""
  77. // // 设置起点
  78. // // pen.moveTo(x,y)
  79. // pen.moveTo(100,200);
  80. // // 设置下一个点
  81. // pen.lineTo(500,200);
  82. // // 设置下一个点(终点)
  83. // pen.lineTo(300,400);
  84. // // 结束绘制
  85. // pen.closePath();
  86. // // 描边
  87. // pen.stroke();
  88. // // 填充
  89. // pen.fill();
  90. // // 4) 绘制矩形 (第一种写法)
  91. // // 开始绘制
  92. // pen.beginPath();
  93. // // 设置描边颜色
  94. // pen.strokeStyle = "red";
  95. // // 填充颜色
  96. // pen.fillStyle = "yellow"
  97. // // 设置线的宽度
  98. // pen.lineWidth = 5
  99. // // 设置线的样式
  100. // // pen.lineCap = ""
  101. // // 设置起点
  102. // // pen.moveTo(x,y)
  103. // pen.moveTo(100, 200);
  104. // // 设置下一个点
  105. // pen.lineTo(500, 200);
  106. // // 设置下一个点
  107. // pen.lineTo(500, 400);
  108. // // 设置下一个点(终点)
  109. // pen.lineTo(100, 400);
  110. // // 结束绘制
  111. // pen.closePath();
  112. // // 描边
  113. // pen.stroke();
  114. // // 填充
  115. // pen.fill();
  116. // // 4) 绘制矩形 (第二种写法)
  117. // // 开始绘制
  118. // pen.beginPath();
  119. // // 设置描边颜色
  120. // pen.strokeStyle = "red";
  121. // // 填充颜色
  122. // pen.fillStyle = "yellow"
  123. // // 设置线的宽度
  124. // pen.lineWidth = 5
  125. // // 设置线的样式
  126. // // pen.lineCap = ""
  127. // // 设置距离的坐标和尺寸
  128. // // pen.rect(x, y, w,h);
  129. // pen.rect(100, 200, 400,200);
  130. // // 结束绘制
  131. // pen.closePath();
  132. // // 描边
  133. // pen.stroke();
  134. // // 填充
  135. // pen.fill();
  136. // // 4) 绘制矩形 (第三种写法)
  137. // // 开始绘制
  138. // pen.beginPath();
  139. // // 设置描边颜色
  140. // pen.strokeStyle = "red";
  141. // // 填充颜色
  142. // pen.fillStyle = "yellow"
  143. // // 设置线的宽度
  144. // pen.lineWidth = 5
  145. // // 设置线的样式
  146. // // pen.lineCap = ""
  147. // // 设置距离的坐标和尺寸
  148. // // pen.rect(x, y, w,h);
  149. // pen.fillRect(100, 200, 400, 200);
  150. // pen.strokeRect(100, 200, 400, 200);
  151. // // 结束绘制
  152. // pen.closePath();
  153. // 5) 绘制弧形、圆形
  154. // 一个圆形 360 °
  155. // 涉及弧度的计算(公式)
  156. // 弧度 = 角度 * Math.PI / 180
  157. pen.beginPath();
  158. // 设置描边颜色
  159. pen.strokeStyle = "red";
  160. // 填充颜色
  161. pen.fillStyle = "yellow";
  162. // 定义对象记录坐标,半径
  163. var point = {
  164. x: 100,
  165. y: 200,
  166. r: 100,// 半径
  167. }
  168. // 设置圆心坐标
  169. pen.moveTo(point.x, point.y);
  170. // 绘制一个圆形
  171. pen.arc(
  172. point.x, // x坐标
  173. point.y, // y坐标
  174. point.r, // 半径
  175. 180 * Math.PI / 180, // 开始弧度
  176. 360 * Math.PI / 180,// 结束弧度
  177. true // false 顺时针,否则反之
  178. )
  179. // 结束绘制
  180. pen.closePath();
  181. // 描边
  182. pen.stroke();
  183. // 填充
  184. pen.fill();
  185. // 6) 绘制文本
  186. pen.beginPath();
  187. // 填充颜色
  188. pen.fillStyle = "red";
  189. // 设置字体
  190. pen.font = "20px 微软雅黑";
  191. // 设置文本水平位置
  192. pen.textAlign="center";
  193. // 设置垂直文本位置
  194. pen.textBaseline = "bottom";
  195. // 填充文本
  196. pen.fillText("休息一哈!",point.x,point.y);
  197. pen.closePath();
  198. </script>
  199. </body>
  200. </html>

2)绘制组合图案(一个爱心)

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  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>基本模板</title>
  8. <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
  9. </head>
  10. <body>
  11. <canvas id="canvas" class="bg-success"></canvas>
  12. <script>
  13. // 获取canvas对象
  14. var canvas = document.getElementById("canvas");
  15. // 设置画布尺寸
  16. canvas.width = 600;
  17. canvas.height = 800;
  18. // 获取绘制图形图像的对象 (画笔)
  19. var pen = canvas.getContext("2d");
  20. // console.log(pen);
  21. // 绘制矩形
  22. var drawRect = function (x, y, w, h, color) {
  23. pen.beginPath();
  24. pen.fillStyle = color || "red";
  25. pen.fillRect(x, y, w, h);
  26. pen.closePath();
  27. }
  28. // 绘制圆形
  29. var drawCircle = function (x, y, r, s, e, color) {
  30. pen.beginPath();
  31. pen.fillStyle = color || "red";
  32. // pen.strokeStyle= color || "red";
  33. pen.arc(
  34. x,
  35. y,
  36. r,
  37. s * Math.PI / 180,
  38. e * Math.PI / 180,
  39. true
  40. )
  41. pen.closePath();
  42. pen.fill();
  43. // pen.stroke();
  44. }
  45. // 定义对象记录坐标尺寸
  46. var point = {
  47. x: 100,
  48. y: 200,
  49. w: 100,
  50. h: 100,
  51. r: 50
  52. }
  53. // 先绘制矩形
  54. drawRect(
  55. point.x,
  56. point.y,
  57. point.w,
  58. point.h
  59. )
  60. // 在绘制圆形状
  61. drawCircle(
  62. point.x + 50,
  63. point.y,
  64. point.r,
  65. 0,
  66. 360
  67. )
  68. drawCircle(
  69. point.x,
  70. point.y + 50,
  71. point.r,
  72. 0,
  73. 360
  74. )
  75. // 判断绘制的角度是为顺时针
  76. // pen.beginPath();
  77. // pen.strokeStyle= "red";
  78. // pen.arc(
  79. // 400,
  80. // 400,
  81. // 100,
  82. // 0 * Math.PI / 180,
  83. // 90 * Math.PI / 180,
  84. // false // false 顺时针 , true 是逆时针
  85. // )
  86. // pen.stroke();
  87. </script>
  88. </body>
  89. </html>

3)做一幅动图

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  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>基本模板</title>
  8. <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
  9. </head>
  10. <body>
  11. <canvas id="canvas"></canvas>
  12. <!-- <img src="./assets/2.jpg" alt=""> -->
  13. <script>
  14. // 获取画布标签
  15. var canvas = document.querySelector("#canvas");
  16. // 创建图片
  17. var img = new Image();
  18. // 请求图片资源
  19. img.src = "./assets/2.jpg";
  20. // 设置画布尺寸
  21. canvas.width = 800;
  22. canvas.height = 600;
  23. // 获取canvas上下对象(画笔)
  24. var ctx = canvas.getContext("2d");
  25. // console.log(ctx);
  26. // 记录每一帧动画的坐标和尺寸
  27. var arr = [
  28. { sx: 30, sy: 5, sw: 192, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  29. { sx: 210, sy: 5, sw: 192, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  30. { sx: 380, sy: 5, sw: 192, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  31. { sx: 568, sy: 5, sw: 192, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  32. { sx: 10, sy: 340, sw: 200, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  33. { sx: 216, sy: 340, sw: 200, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  34. { sx: 410, sy: 340, sw: 200, sh: 270, x: 100, y: 100, w: 192, h: 270 },
  35. { sx: 590, sy: 340, sw: 200, sh: 270, x: 100, y: 100, w: 192, h: 270 }
  36. ]
  37. // 记录数组的索引
  38. var index = 7;
  39. // 绘制图像
  40. img.onload = function () {
  41. // 绘制图片
  42. // ctx.drawImage(
  43. // img,// 图片资源
  44. // 0,// 在画布的x坐标
  45. // 0,// 在画布的y坐标
  46. // img.width * (1/2),// 在画布的尺寸
  47. // img.height* (1/2)// 在画布的尺寸
  48. // )
  49. // 绘制图片部分的效果(裁剪图片绘制在画布上)
  50. // ctx.drawImage(
  51. // img,// 图片资源
  52. // 0, // 在图片的x坐标
  53. // 0, // 在图片的y坐标
  54. // 192, // 裁剪图片的宽度
  55. // 260,// 裁剪图片的高度
  56. // 0,// 在画布的x坐标
  57. // 0,// 在画布的y坐标
  58. // 192,// 在画布的尺寸
  59. // 260// 在画布的尺寸
  60. // )
  61. // 把裁剪的坐标尺寸和画布的坐标尺寸做成变量
  62. ctx.drawImage(
  63. img,// 图片资源
  64. arr[index].sx, // 在图片的x坐标
  65. arr[index].sy, // 在图片的y坐标
  66. arr[index].sw, // 裁剪图片的宽度
  67. arr[index].sh, // 裁剪图片的高度
  68. arr[index].x, // 在画布的x坐标
  69. arr[index].y, // 在画布的y坐标
  70. arr[index].w, // 在画布的尺寸
  71. arr[index].h // 在画布的尺寸
  72. )
  73. }
  74. // 使用定时器
  75. var timer = setInterval(function(){
  76. index ++;
  77. index = index > arr.length-1 ? 0: index;
  78. // 先清除画布
  79. ctx.clearRect(
  80. 0,
  81. 0,
  82. canvas.width,
  83. canvas.height
  84. )
  85. // 再绘制图片
  86. ctx.drawImage(
  87. img,// 图片资源
  88. arr[index].sx, // 在图片的x坐标
  89. arr[index].sy, // 在图片的y坐标
  90. arr[index].sw, // 裁剪图片的宽度
  91. arr[index].sh, // 裁剪图片的高度
  92. arr[index].x, // 在画布的x坐标
  93. arr[index].y, // 在画布的y坐标
  94. arr[index].w, // 在画布的尺寸
  95. arr[index].h // 在画布的尺寸
  96. )
  97. }, 1000 / 12);// 一秒钟执行12次
  98. </script>
  99. </body>
  100. </html>

三、svg与canvas的区别

1、canvas时h5提供的新的绘图方法

svg已经有了十多年的历史

2、vanvas画图基于像素点,是位图,如果进行放大或缩小会失真

svg基于图形,用html标签描绘形状,放大缩小不会失真

3、canvas需要在js中绘制

svg在html正绘制

4、canvas支持颜色较svg多

5、canvas无法对已经绘制的图像进行修改、操作

svg可以获取到标签进行操作

标签: 学习 html5 javascript

本文转载自: https://blog.csdn.net/weixin_245249828/article/details/136688229
版权归原作者 吃清心的椰羊 所有, 如有侵权,请联系我们删除。

“前端小白的学习之路(HTML5 二)”的评论:

还没有评论