SVG图像文件结构

SVG(Scalable Vector Graphics,可缩放矢量图形)是一种基于 XML 的矢量图像格式,由 W3C 制定。与 JPEG、PNG、GIF 等栅格图像 不同,SVG 使用数学描述(如路径、形状、文本等)来定义图像,因此可以无损缩放到任意尺寸。

一、总体结构:纯文本 XML

SVG 文件本质上是一个 XML 文档 ,通常以 .svg 为扩展名,也可以内嵌在 HTML 中(inline SVG)。

最简 SVG 示例:

xml 复制代码
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="40" fill="red" />
</svg>

二、基本文件结构

一个完整的 SVG 文件通常包含以下部分:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<svg
  xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  width="200"
  height="200"
  viewBox="0 0 200 200"
>
  <!-- 可选:定义区(defs) -->
  <defs>
    <linearGradient id="grad1">
      <stop offset="0%" stop-color="yellow" />
      <stop offset="100%" stop-color="red" />
    </linearGradient>
    <symbol id="icon-star" viewBox="0 0 16 16">
      <path d="M8 0L10 6H16L11 9L13 15L8 12L3 15L5 9L0 6H6Z"/>
    </symbol>
  </defs>

  <!-- 图形元素 -->
  <rect x="10" y="10" width="180" height="180" fill="url(#grad1)" />
  <use href="#icon-star" x="80" y="80" width="40" height="40" />

  <!-- 其他元素:文本、路径、组等 -->
  <text x="50%" y="50%" text-anchor="middle" dominant-baseline="middle">
    Hello SVG
  </text>
</svg>

三、核心组成部分详解

1. XML 声明(可选)

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
  • 非必需(尤其在 HTML 内嵌时),但建议保留以确保编码正确。

2. 根元素 <svg>

必须包含命名空间声明:

xml 复制代码
xmlns="http://www.w3.org/2000/svg"
常用属性:
属性 说明
width / height 显示尺寸(可带单位:px, em, % 等)
viewBox 定义用户坐标系:"min-x min-y width height",支持缩放和裁剪
preserveAspectRatio 控制 viewBox 如何适配容器(如 "xMidYMid meet"
version SVG 版本(如 "1.1",现代浏览器通常忽略)

关键概念viewBox 使 SVG 具备响应式能力。例如 viewBox="0 0 100 100" 表示内部使用 100×100 的逻辑坐标系,无论外部容器多大都能自适应。


3. <defs> 区域(Definitions)

用于定义可复用 的图形对象,不会直接渲染 ,需通过引用(如 <use>)显示。

支持定义:

  • <linearGradient> / <radialGradient>:渐变
  • <pattern>:图案填充
  • <symbol>:带独立 viewBox 的可复用图标
  • <clipPath>:裁剪路径
  • <mask>:遮罩
  • <filter>:滤镜效果(如模糊、阴影)

4. 图形元素(可渲染)

SVG 提供多种基本图形和路径:

元素 用途
<rect> 矩形
<circle> / <ellipse> 圆 / 椭圆
<line> 直线
<polyline> / <polygon> 折线 / 多边形
<path> 最强大 :通过 d 属性描述任意路径(贝塞尔曲线、弧线等)
<text> 文本(支持字体、旋转、路径文本等)
<image> 嵌入位图(如 PNG、JPEG)
<g> 分组:对多个元素统一变换或样式
<path> 示例:
xml 复制代码
<path d="M10 10 C 20 20, 40 20, 50 10" stroke="black" fill="none"/>
  • M = Move to
  • C = Cubic Bezier curve

5. <use> 元素

引用 <defs> 中定义的内容(如 <symbol><g>):

xml 复制代码
<use href="#my-icon" x="20" y="30" />
  • 现代标准使用 href(旧版用 xlink:href,需声明 xmlns:xlink

6. 样式与交互

  • 内联样式style="fill:red; opacity:0.8"

  • CSS 类class="icon" + 外部 CSS

  • 事件 :支持 onclickonmouseover 等(可用于交互动画)

  • SMIL 动画 (已逐渐被 CSS/JS 动画取代):

    xml 复制代码
    <circle r="10">
      <animate attributeName="r" values="10;50;10" dur="2s" repeatCount="indefinite"/>
    </circle>

四、SVG 文件类型

类型 说明
Standalone SVG 独立 .svg 文件,可被浏览器直接打开
Inline SVG 直接写在 HTML 中,便于 CSS/JS 控制
SVG Sprite 多个图标合并到一个 <defs><symbol> 中,按需引用
Compressed SVGZ 使用 GZIP 压缩的 SVG(.svgz),需服务器正确配置 MIME 类型

五、优势与局限

✅ 优势:

  • 无限缩放不失真
  • 文件小(尤其简单图形)
  • 可搜索、可编辑、可脚本化
  • 支持 CSS 和 DOM 操作
  • 良好的可访问性 (可加 <title><desc>

❌ 局限:

  • 不适合照片级复杂图像(此时用 JPEG/WebP 更高效)
  • 渲染性能:超复杂路径可能影响性能
  • 安全风险:内嵌 JS 的 SVG 可能被用于 XSS(需过滤)

六、MIME 类型与最佳实践

  • MIME Type : image/svg+xml
  • 编码建议:保存为 UTF-8,避免乱码
  • 优化工具
    • SVGO:压缩 SVG
    • SVGOMG:在线可视化优化

七、参考规范


如需深入了解 路径语法(Path d 属性)渐变与滤镜响应式 SVG 设计如何将位图转为 SVG,我可以进一步展开说明。

相关推荐
还是大剑师兰特3 天前
地图的分类
大剑师·地图分类
还是大剑师兰特14 天前
ruoyi‑vue3 添加【车辆管理】菜单组完整方案
大剑师·若依系统
还是大剑师兰特17 天前
若依(ruoyi)前后台系统从零到一部署配置(坑点带解析)
大剑师
还是大剑师兰特18 天前
ideaIC‑2024.1.7(社区版zip绿色解压版)完整使用教程
大剑师·idealc
还是大剑师兰特20 天前
MySQL8.0 Windows完整安装教程
windows·mysql·大剑师
还是大剑师兰特2 个月前
VSCode 插件冲突导致崩溃、卡死、假死 全套根治方案
vscode·大剑师
还是大剑师兰特2 个月前
ThinkPad T490 Windows 自动修复失败完整解决步骤
windows·大剑师·t490
还是大剑师兰特2 个月前
二年级奥数(12) : 巧填符号+竖式数字谜
大剑师·二年级奥数
还是大剑师兰特2 个月前
二年级奥数(9):鸡兔同笼+ 归一问题
大剑师·二年级奥数
还是大剑师兰特2 个月前
二年级奥数(7):移多补少8题 + 和差入门8题 + 年龄问题8题
大剑师·二年级奥数