SVG 教程(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在网页开发和图形设计领域,SVG(Scalable Vector Graphics)是一种强大的矢量图形技术。它不仅支持高分辨率缩放,还能通过代码直接操作图形元素,成为前端开发者和设计师的必备工具。无论是制作动态图标、数据可视化,还是创建交互式动画,SVG 都能提供灵活且高效的解决方案。本教程将从基础语法、核心概念到实战案例,逐步带领编程初学者和中级开发者掌握 SVG 的核心技能。


SVG 的基本概念与优势

什么是 SVG?

SVG 是一种基于 XML 的矢量图形语言,通过代码描述图形的形状、颜色、路径等属性。与位图(如 PNG、JPEG)不同,SVG 图形由数学公式定义,因此可以无限放大而不失真,特别适合需要响应式设计的场景。

SVG 的核心优势

  • 可缩放性:矢量图形在任何尺寸下均保持清晰,适合不同设备和屏幕分辨率。
  • 可编程性:通过 CSS 或 JavaScript 直接操作 SVG 元素,实现动态效果。
  • 文件体积小:复杂的图形也能保持较小的文件大小。
  • 语义化:代码结构清晰,便于 SEO 和可访问性优化。

形象比喻
可以把 SVG 想象成“数字画布”,开发者像画家一样用代码“绘制”图形,每一笔(即代码指令)都精确控制图形的形状和位置。


SVG 的基础语法与结构

SVG 的基本结构

所有 SVG 图形都包裹在 <svg> 标签内,通过 widthheight 属性定义画布尺寸。例如:

<svg width="200" height="200">  
  <!-- 图形元素(如矩形、圆形等)将在此处定义 -->  
</svg>  

常用 SVG 元素

以下是几个核心 SVG 元素及其作用:

元素描述示例代码
<rect>绘制矩形<rect x="10" y="10" width="50" height="50" />
<circle>绘制圆形<circle cx="50" cy="50" r="40" />
<ellipse>绘制椭圆形<ellipse cx="50" cy="50" rx="40" ry="20" />
<line>绘制直线<line x1="10" y1="10" x2="60" y2="60" />
<path>通过路径数据绘制复杂形状<path d="M 10 10 L 60 60" />

绘制基础图形:矩形、圆形与线条

绘制矩形 <rect>

矩形的 xy 属性定义左上角坐标,widthheight 控制尺寸。例如:

<svg width="100" height="100">  
  <rect x="20" y="20" width="60" height="60" fill="blue" stroke="black" stroke-width="2" />  
</svg>  

关键属性

  • fill:填充颜色
  • stroke:边框颜色
  • stroke-width:边框宽度

绘制圆形 <circle>

圆形通过 cxcy 指定圆心坐标,r 控制半径:

<svg width="100" height="100">  
  <circle cx="50" cy="50" r="40" fill="red" />  
</svg>  

绘制路径 <path>

路径是 SVG 最强大的元素,通过 d 属性的路径命令构建复杂形状。例如,绘制一条从 (10,10) 到 (60,60) 的直线:

<svg width="100" height="100">  
  <path d="M 10 10 L 60 60" stroke="green" fill="none" />  
</svg>  

路径命令解析

  • M x y:移动画笔到坐标 (x,y)
  • L x y:绘制直线到坐标 (x,y)
  • C:绘制贝塞尔曲线(需控制点)
  • Z:闭合路径

进阶技巧:坐标系统与变换

SVG 的坐标系统

SVG 的坐标原点默认位于左上角,X 轴向右,Y 轴向下。例如:

<svg width="100" height="100">  
  <rect x="0" y="0" width="50" height="50" fill="yellow" />  
</svg>  

黄色矩形的左上角位于坐标原点 (0,0)。

变换(Transform)

通过 transform 属性对图形进行旋转、缩放、平移等操作:

<svg width="150" height="150">  
  <rect x="20" y="20" width="60" height="60" fill="blue"  
    transform="rotate(45) translate(30,30)" />  
</svg>  

常用变换函数

  • translate(x,y):平移
  • rotate(angle):旋转(角度)
  • scale(sx,sy):缩放

动态 SVG:动画与交互

使用 SMIL 动画(SVG 内置动画)

SVG 支持 SMIL(Synchronized Multimedia Integration Language)直接定义动画:

<svg width="200" height="200">  
  <circle cx="100" cy="100" r="50" fill="purple">  
    <animate attributeName="r" from="50" to="80" dur="2s" repeatCount="indefinite" />  
  </circle>  
</svg>  

此代码会无限循环放大圆形半径。

通过 CSS 实现动画

结合 CSS 的 @keyframes 实现更灵活的动画:

<svg width="200" height="200">  
  <circle id="myCircle" cx="100" cy="100" r="50" fill="green" />  
</svg>  

<style>  
#myCircle {  
  animation: pulse 2s infinite;  
}  

@keyframes pulse {  
  0% { transform: scale(1); }  
  50% { transform: scale(1.2); }  
  100% { transform: scale(1); }  
}  
</style>  

响应式交互:JavaScript 控制 SVG

通过 JavaScript 监听事件并动态修改 SVG 属性:

<svg width="200" height="200">  
  <rect id="myRect" x="50" y="50" width="100" height="50" fill="orange" />  
</svg>  

<script>  
document.getElementById('myRect').addEventListener('click', function() {  
  this.setAttribute('fill', 'red');  
});  
</script>  

实战案例:绘制一个动态仪表盘

案例需求

创建一个圆形仪表盘,显示当前数值,并通过动画显示数值变化。

实现步骤

  1. 绘制圆形背景
<svg width="200" height="200">  
  <circle cx="100" cy="100" r="80" fill="lightgray" stroke="black" stroke-width="4" />  
</svg>  
  1. 添加指针
<line x1="100" y1="100" x2="100" y2="40" stroke="blue" stroke-width="4" />  
  1. 动态旋转指针(通过 JavaScript)
function updatePointer(value) {  
  const angle = (value / 100) * 360; // 将数值转换为角度  
  document.querySelector('line').style.transform = `rotate(${angle}deg)`;  
}  

// 示例:调用 updatePointer(50) 旋转 180 度  
  1. 添加动画效果
    结合 CSS 动画,使指针平滑旋转:
line {  
  transition: transform 1s ease-in-out;  
}  

进阶技巧与最佳实践

坐标系的缩放与视口控制

通过 <svg>viewBox 属性定义逻辑坐标系,实现更灵活的缩放:

<svg width="200" height="200" viewBox="0 0 100 100">  
  <rect x="20" y="20" width="60" height="60" fill="blue" />  
</svg>  

此代码将 SVG 的逻辑坐标缩放为 200x200 的物理尺寸,同时保持坐标原点在 (0,0)。

使用 CSS 变量简化样式管理

通过 CSS 变量(Custom Properties)集中管理颜色和尺寸:

:root {  
  --primary-color: #4CAF50;  
  --shape-width: 80px;  
}  

svg circle {  
  fill: var(--primary-color);  
  r: var(--shape-width);  
}  

性能优化与代码复用

  • 代码复用:使用 <symbol><use> 定义可复用图形:
    <svg style="display: none;">  
      <symbol id="star" viewBox="0 0 24 24">  
        <polygon points="10 0 4 8 0 8 8 16 4 24 10 18 16 24 12 16 20 8 16 8" />  
      </symbol>  
    </svg>  
    
    <svg>  
      <use href="#star" x="10" y="10" />  
    </svg>  
    
  • 减少冗余属性:利用 CSS 类或继承避免重复代码。

结论

通过本教程,读者已掌握了 SVG 的基础语法、核心元素、动画与交互技巧,以及实际案例的实现方法。SVG 不仅是静态图形的工具,更是动态网页设计的基石。无论是制作响应式图标、数据可视化图表,还是交互式游戏元素,SVG 都能提供高效且灵活的解决方案。

下一步建议

  1. 实践本教程中的代码示例,尝试修改参数观察效果变化。
  2. 探索 SVG 进阶功能,如滤镜(Filter)、渐变(Gradient)和混合模式(Blend Mode)。
  3. 结合 CSS 动画库(如 GSAP)或数据可视化库(如 D3.js)扩展 SVG 的应用场景。

掌握 SVG,你将解锁网页设计与开发中更多可能性,为用户提供更丰富、更直观的交互体验。

最新发布