画个矢量图——HTML5-SVG

可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG 由 W3C 制定,是一个开放标准。

应用场景

  • 图表

  • 图标 icon

  • 动效

  • 矢量图

SVG 的优势

由于 SVG 图像是矢量图像,可以无线缩放,而且在图像质量下降方面没有任何问题。因为 SVG 图像是使用 XML 标记 构建的,浏览器通过每个点和线来打印他们,而不是用预定义的像素填充某些空间。这确保 SVG 图像可以适应不同的屏幕大小和分辨率。

由于是在 XML 中定义的,SVG 图像比 JPG 或 PNG 图像更灵活,而且我们可以使用 Css 和 JavaScript 进行交互。

开始

<!-- 定义绘图区域 -->
<svg width="500px" height="500px"></svg>

代码示例

<svg width="500px" height="500px">
  <!-- 直线 -->
  <!-- x1, y1  x2, y2  定义两点坐标 -->
  <line x1="100" y1="100" x2="200" y2="100"></line>
  <!-- 矩形 -->
  <!-- x , y 是起始坐标,width 和 height 是自解释的。rx, ry是定义圆角 -->
  <rect x="50" y="50" width="100" height="100" rx="10" ry="20"></rect>
  <!-- 圆形 -->
  <!-- 半径 圆心 -->
  <circle r="50" cx="220" cy="100"></circle>
  <!-- 椭圆形 -->
  <!-- x轴,y轴 圆心 -->
  <ellipse rx="100" ry="50" cx="100" cy="200"></ellipse>
  <!-- 折线 -->
  <!-- 使用 points 定义多个点 各组点使用逗号分开 -->
  <polyline
    points="60 50, 75 35, 100 50, 125 35, 150 50, 175 35, 190 50"
  ></polyline>
  <!-- 多边形 -->
  <!-- 通过定义多个点 进行连线 -->
  <polygon points="125 125, 130 140, 120 140"></polygon>
  <!-- 文本 -->
  <text x="125" y="220">Hello Lambda</text>
</svg>
/* 使用 css 定义svg样式 */
svg {
  /* 线条颜色 */
  stroke: #000;
  /* 线条粗细 */
  stroke-width: 5;
  /* 线条样式 */
  stroke-linecap: round;
  stroke-linejoin: round;
  /* 填充 */
  fill: #f40;
  /* 线条透明度 */
  stroke-opacity: 0.8;
  /* 填充透明度 */
  fill-opacity: 0.6;
}
mO0BS1.png

path 元素

绝对坐标和相对坐标

代码示例

mO08yV.png
mOBmX6.png
mODp8A.png
mOrH0K.png
mOs9nP.png

线性渐变

mO68yR.png

径向渐变

mO6dYD.png

高斯模糊滤镜

mO6ffg.png

更多滤镜效果可以访问 http://www.w3school.com.cn/svg/svg_filters_intro.asp

SVG 路径动画

通过控制 SVG 的样式来实现动画

通过修改 stroke-dashoffset 的值让路路径慢慢地展现出来

代码示例

mORoCT.gif
  • 可以通过 getTotalLength() 函数获取到 path 路径总长度

  • 可以通过 getPointAtLength(X) 函数获取路径上距离起始点距离 x 长度的点的坐标

JS 生成 SVG 元素

  1. 创建 SVG 元素需要指定命名空间

  2. SVG 元素对象一般通过调用 setAttribute() 方法来设定属性值

mOhLrQ.png

高性能 SVG 优化清单

canvas 和 svg 区别

  1. 从图像类别区分,Canvas 是基于像素的位图,而 SVG 却是基于矢量图形。可以简单的把两者的区别看成 photoshop 与 illustrator 的区别。

  2. 从结构上说,Canvas 没有图层的概念,所有的修改整个画布都要重新渲染,而 SVG 则可以对单独的标签进行修改。

  3. 从操作对象上说,Canvas 是基于 HTML canvas 标签,通过宿主提供的 Javascript API 对整个画布进行操作的,而 SVG 则是基于 XML 元素的。

  4. 从功能上讲,SVG 发布日期较早,所以功能相对 Canvas 比较完善。

  5. 关于动画,Canvas 更适合做基于位图的动画,而 SVG 则适合图表的展示。

  6. 从搜索引擎角度分析,由于 svg 是有大量标签组成,所以可以通过给标签添加属性,便于爬虫搜索

最后更新于