SVG是基于XML的矢量图形格式,本身支持部分基础动画属性,但结合JavaScript可以实现更复杂、更可控的动画与交互效果,适配更多动态业务场景。

SVG基础结构认知
SVG图形由各种元素构成,比如<circle>表示圆形,<rect>表示矩形,<path>表示路径图形。这些元素都可以通过JavaScript获取并操作其属性,常见的可操作属性包括位置坐标、尺寸、颜色、透明度等。
以下是一个简单的SVG圆形结构示例:
<svg width="200" height="200" id="svgContainer"> <circle id="myCircle" cx="100" cy="100" r="30" fill="blue" /> </svg>
JavaScript操作SVG元素基础
操作SVG元素和操作用户DOM元素逻辑类似,首先需要通过选择器获取目标元素,然后修改其对应属性即可。注意SVG的属性修改需要使用setAttribute方法,而不是直接修改元素的属性对象。
获取SVG元素并修改填充颜色的示例代码如下:
// 获取SVG圆形元素
const circle = document.getElementById('myCircle');
// 修改圆形的填充颜色
circle.setAttribute('fill', 'red');
// 修改圆形的半径
circle.setAttribute('r', '50');
JavaScript实现SVG动画
SVG动画可以通过两种方式实现,一种是使用requestAnimationFrame逐帧更新属性,另一种是使用Web Animations API直接定义动画参数。逐帧更新的方式更灵活,适合复杂动画逻辑。
逐帧动画实现
以下示例实现圆形从左到右的移动动画,持续2秒:
const circle = document.getElementById('myCircle');
// 初始x坐标
let startX = 100;
// 目标x坐标
const targetX = 180;
// 动画总时长 2000毫秒
const duration = 2000;
// 动画开始时间戳
let startTime = null;
function animateCircle(timestamp) {
if (!startTime) {
startTime = timestamp;
}
// 计算已过去的时间占比
const progress = Math.min((timestamp - startTime) / duration, 1);
// 计算当前x坐标 线性变化
const currentX = startX + (targetX - startX) * progress;
// 更新圆形的cx属性
circle.setAttribute('cx', currentX);
// 如果动画未完成 继续请求下一帧
if (progress < 1) {
requestAnimationFrame(animateCircle);
}
}
// 启动动画
requestAnimationFrame(animateCircle);
Web Animations API实现
Web Animations API可以更简洁地定义动画,不需要手动处理逐帧逻辑,示例代码如下:
const circle = document.getElementById('myCircle');
// 定义动画关键帧
const keyframes = [
{ transform: 'translateX(0)' },
{ transform: 'translateX(80px)' }
];
// 定义动画参数
const options = {
duration: 2000,
easing: 'linear',
fill: 'forwards'
};
// 执行动画
circle.animate(keyframes, options);
JavaScript实现SVG交互
SVG元素支持标准的DOM事件,比如click、mouseover、mouseout等,可以直接为SVG元素绑定事件监听器,实现交互效果。
点击事件交互
以下示例实现点击圆形切换填充颜色的交互:
const circle = document.getElementById('myCircle');
// 定义颜色切换列表
const colorList = ['blue', 'red', 'green', 'orange'];
let colorIndex = 0;
circle.addEventListener('click', () => {
colorIndex = (colorIndex + 1) % colorList.length;
circle.setAttribute('fill', colorList[colorIndex]);
});
悬停交互效果
以下示例实现鼠标悬停时圆形放大,移出时恢复的交互:
const circle = document.getElementById('myCircle');
// 原始半径
const originalR = 30;
circle.addEventListener('mouseover', () => {
circle.setAttribute('r', originalR * 1.5);
});
circle.addEventListener('mouseout', () => {
circle.setAttribute('r', originalR);
});
注意事项
- SVG的坐标系和HTML不同,修改位置属性时需要确认坐标系的参考点
- 操作SVG属性时优先使用
setAttribute方法,避免兼容性问题 - 动画过程中如果需要同时修改多个属性,建议统一在帧更新逻辑中处理,避免画面闪烁
- 复杂SVG图形如果元素过多,频繁操作属性可能会影响性能,可以考虑使用SVG的transform属性批量修改变换状态
SVG结合JavaScript的动画与交互能力,可以覆盖大部分网页动态图形需求,开发者可以根据场景选择合适的实现方式,平衡开发效率和性能表现。
JavaScriptSVG动画SVG交互SVG操作修改时间:2026-07-12 04:27:21