SVG详细解析系列


可缩放矢量图形(SVG)是一种基于XML的标记语言,用于描述基于二维的矢量图形。

根据百度百科的定义:矢量图形,就是使用直线和曲线来描述的图形,构成这些图形的元素是一些点、线、矩形、多边形、圆和弧线等,它们都是通过数学公式计算获得的,具有编辑后不失真的特点。

矢量图以几何图形居多,图形可以无限放大,不变色、不模糊。常用于图案、标志、VI、文字等设计。

其优点有文件小对图像缩放,旋转或变形操作时,图形不会产生锯齿效果可采取高分辨率印刷

与经典的位图图像格式(如JPEG或PNG)相比,SVG格式的矢量图像可以以任何大小渲染而不会降低质量,并且可以通过更新其中的文本轻松本地化,而无需图形编辑器来执行此操作。有了适当的库,SVG文件甚至可以即时本地化。

SVG文件的基本规则

  • 首先要注意的是渲染元素的顺序。SVG文件的全局有效规则是:后面的元素在前面的元素上呈现。元素越往下看,可见度就越高。

  • SVG文件可以直接显示在浏览器中,也可以通过多种方法嵌入到HTML文件中:

    • 如果HTML是XHTML 并且作为application/xhtml+xml类型提供,则SVG可以直接嵌入到XML源代码中。
    • SVG也可以直接嵌入到HTML中。
    • 可以使用<img>元素。
    • 可以使用<object>元素引用。
    • 可以使用<iframe>元素嵌入。

坐标定位

对于所有元素,SVG使用类似于Canvas使用的坐标系或网格系统。即文档的左上角被视为点(0,0)或原点,从左上角开始以像素为单位测量位置,往右为正X方向,往下为正Y方向,反之为负方向。

MDN:在SVG文档中的1个像素对应输出设备(比如显示屏)上的1个像素。但是这种情况是可以改变的,否则 SVG 的名字里也不至于会有"Scalable"(可缩放)这个词。如同 CSS 可以定义字体的绝对大小和相对大小,SVG 也可以定义绝对大小(比如使用ptcm标识维度)同时 SVG 也能使用相对大小,只需给出数字,不标明单位,输出时就会采用用户的单位。

一般一个用户单元等于一个屏幕单元。但可以通过viewBox属性来改变它的行为,这里的解释详见下文:

html 复制代码
<!-- 分辨率为 100x100 像素。一个用户单位等于一个屏幕单位。 --> 
<svg width="100" height="100">...</svg>

<!-- 宽和高还是200像素,但是图像被放大了2倍 -->
<svg width="200" height="200" viewBox="0 0 100 100">...</svg>

SVG元素详解

其实学SVG作为一种XMLlei'x跟学HTML是差不多的,主要还是元素和属性方面的学习。SVG跟HTMLSVG注重图形设计和矢量图形的概念,而HTML注重网页结构和内容的呈现。

<svg>

<svg>元素是定义新坐标系和视区的容器。它属于容器元素,但是他是SVG文档的最外层元素,因此先来学习它。它还可用于在SVG或HTML文档中嵌入SVG片段。

属性

属性名 简介
height 长度/百分比 矩形视区的显示高度。
width 长度/百分比 矩形视区的显示宽度。
preserveAspectRatio (nonexMinYMinxMidYMinxMaxYMinxMinYMidxMidYMidxMaxYMidxMinYMaxxMidYMaxxMaxYMax) [(meetslice)] 如果SVG片段以不同的纵横比显示,它必须如何变形。
viewBox min-x min-y width height 定义了用户坐标空间中的一个矩形区域,用于确定视口的位置和尺寸。可以在不同大小的视窗中呈现相同的图形,同时保持图形的比例和外观不变。
x 长度/百分比 显示的svg容器的x坐标。对最外层<svg>元素没有影响。
y 长度/百分比 显示的svg容器的y坐标。对最外层<svg>元素没有影响。
  • 从SVG2开始,xywidthheight是几何属性,这意味着这些属性也可以用作CSS属性。

  • preserveAspectRatio属性的取值如上表,在第一个括号中选一个关键词,以空格分隔,再从第二个括号中选择一个关键词(第二个括号中的关键词是可选的)。默认值是xMidYMid meet

  • 这里简单说明一下viewBox属性,它的作用其实就是在坐标空间中裁剪指定区域,然后将该区域映射到视口大小。比如现在有:

    html 复制代码
    <svg width="200" height="200" viewBox="50 50 100 100" xmlns="http://www.w3.org/2000/svg" style="border: 1px solid #000">
      <circle cx='50' cy='50' r='50' fill='lightblue' />
    </svg>

命名空间

将SVG解析为XML时,为了符合XML中的命名空间建议,必须提供SVG命名空间声明,以便将所有SVG元素标识为属于SVG命名空间。命名空间由xmlns属性声明,SVG 2命名空间是http://www.w3.org/2000/svg,与早期版本的 SVG相同。

命名空间前缀

这部分是将SVG解析为XML时提供命名空间声明的可能方法。

<svg>元素上指定没有命名空间前缀的xmlns属性,意味着SVG是具有xmlns属性的元素范围内所有元素的默认命名空间:

html 复制代码
<svg xmlns="http://www.w3.org/2000/svg">
  ...
</svg>

如果在xmlns属性上指定了命名空间前缀(例如,xmlns:svg="http://www.w3.org/2000/svg"),则相应的命名空间不是默认命名空间,因此必须为元素分配显式命名空间前缀:

html 复制代码
<svg:svg xmlns:svg="http://www.w3.org/2000/svg"">
  ...
</svg:svg>

注意:

  1. 在HTML文档中使用时命名空间由HTML解析器自动提供,可以不用xmlns属性声明。
  2. xmlns属性仅在SVG文档的最外层<svg>元素上是必需的。对于内部<svg>元素或HTML文档内部是不必要的。更多详情参考XML 中的命名空间建议

系列文章

  1. SVG元素详解系列(1)-- 图形元素、容器元素和描述性元素
  2. ...(更新中)
相关推荐
袁煦丞25 分钟前
DS file文件管家远程自由:cpolar内网穿透实验室第492个成功挑战
前端·程序员·远程工作
用户0137412843726 分钟前
九个鲜为人知却极具威力的 CSS 功能:提升前端开发体验的隐藏技巧
前端
永远不打烊29 分钟前
Window环境 WebRTC demo 运行
前端
风舞30 分钟前
一文搞定JS所有类型判断最佳实践
前端·javascript
coding随想31 分钟前
哈希值变化的魔法:深入解析HTML5 hashchange事件的奥秘与实战
前端
一树山茶38 分钟前
uniapp在微信小程序中实现 SSE进行通信
前端·javascript
coding随想38 分钟前
小程序中的pageshow与pagehide事件,HTML5中也有?揭秘浏览器往返缓存(BFCache)
前端
萌萌哒草头将军44 分钟前
Rspack 1.5 版本更新速览!🚀🚀🚀
前端·javascript·vue.js
阿卡不卡1 小时前
基于多场景的通用单位转换功能实现
前端·javascript
♡喜欢做梦1 小时前
jQuery 从入门到实践:基础语法、事件与元素操作全解析
前端·javascript·jquery