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>
标签内,通过 width
和 height
属性定义画布尺寸。例如:
<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>
矩形的 x
和 y
属性定义左上角坐标,width
和 height
控制尺寸。例如:
<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>
圆形通过 cx
、cy
指定圆心坐标,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>
实战案例:绘制一个动态仪表盘
案例需求
创建一个圆形仪表盘,显示当前数值,并通过动画显示数值变化。
实现步骤
- 绘制圆形背景:
<svg width="200" height="200">
<circle cx="100" cy="100" r="80" fill="lightgray" stroke="black" stroke-width="4" />
</svg>
- 添加指针:
<line x1="100" y1="100" x2="100" y2="40" stroke="blue" stroke-width="4" />
- 动态旋转指针(通过 JavaScript):
function updatePointer(value) {
const angle = (value / 100) * 360; // 将数值转换为角度
document.querySelector('line').style.transform = `rotate(${angle}deg)`;
}
// 示例:调用 updatePointer(50) 旋转 180 度
- 添加动画效果:
结合 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 都能提供高效且灵活的解决方案。
下一步建议:
- 实践本教程中的代码示例,尝试修改参数观察效果变化。
- 探索 SVG 进阶功能,如滤镜(Filter)、渐变(Gradient)和混合模式(Blend Mode)。
- 结合 CSS 动画库(如 GSAP)或数据可视化库(如 D3.js)扩展 SVG 的应用场景。
掌握 SVG,你将解锁网页设计与开发中更多可能性,为用户提供更丰富、更直观的交互体验。