SVG.js:比 Snap.svg 还快 5x 的零依赖开源库!
myzbx 2025-04-27 15:05 16 浏览
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
今天给大家带来的主题是SVG.js,即用于操作和为 SVG 添加动画的轻量级库。话不多说,直接进入正题。
1.什么是 SVG.js
SVG.js 是用于操作和为 SVG 添加动画的轻量级库。SVG.js 的特点是:没有任何外部依赖,同时体积非常小,提供几乎完整的 SVG 规范覆盖。最重要的是,SVG.js 速度非常快,虽然不如 Vanilla js ,但比其他同类替代方案,比如 Snap.svg 要快很多倍。
上图表示的 rects、fill、gradient 的含义如下:
- rects:生成 10000 个 rects
- fill:生成 10000 个填充颜色的矩形
- gradient:生成 10000 个带有渐变填充的矩形
同时,SVG.js 非常易于阅读、语法整洁。 如果单独使用 JavaScript 创建和操作 SVG 代码会非常冗长。例如,下面代码示例仅仅创建一个简单的粉色方块:
// Vanilla js
var ns = "http://www.w3.org/2000/svg";
var div = document.getElementById("drawing");
var svg = document.createElementNS(ns, "svg");
svg.setAttributeNS(null, "width", "100%");
svg.setAttributeNS(null, "height", "100%");
div.appendChild(svg);
var rect = document.createElementNS(ns, "rect");
rect.setAttributeNS(null, "width", 100);
rect.setAttributeNS(null, "height", 100);
rect.setAttributeNS(null, "fill", "#f06");
svg.appendChild(rect);
SVG.js 提供了非常简洁易读的语法,下面代码执行与上面的 vanilla js 示例相同的操作:
// SVG.js
var draw = SVG().addTo("#drawing"),
rect = draw.rect(100, 100).fill("#f06");
同时,使用 SVG.js 创建动画也非常简单,比如下面的例子实现了文字的复杂动画:
var input = document.querySelector("input[type=text]");
var draw = SVG().addTo("#drawing").viewbox(0, 0, 300, 140);
var text = draw.text(function (add) {
add.tspan(input.value);
});
textPath = text.path("M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80");
textPath
.animate(1000)
.ease("<>")
.plot("M10 80 C 40 150, 65 150, 95 80 S 150 10, 180 80")
.loop(true, true);
input.addEventListener("keyup", updateText(textPath));
function updateText(textPath) {
return function () {
textPath.tspan(this.value);
};
}
除了上面列举的 SVG.js 的功能外,SVG.js 还有一系列非常优秀的特性,比如:
- 支持大小、位置、变换、颜色等动画
- 得益于模块化结构,无痛扩展
- 各种有用的插件可用
- 具有移动、大小、中心等形状类型之间的统一 api
- 将事件绑定到元素
- 完全支持不透明蒙版和剪切路径
- 文本路径,甚至动画
- 元素组(element groups)
- 动态渐变和图案
- 非常完善的文档机制
在浏览器支持上,SVG.js 也做的非常不错,比如在桌面设备上:
- Firefox 3+
- Chrome 4+
- Safari 3.2+
- Opera 9+
- IE9+
在移动设备上也非常不错,比如:
- iOS Safari 3.2+
- Android Browser 3+
- Opera Mobile 10+
- Chrome for Android 18+
- Firefox for Android 15+
目前 SVG.js 在 Github 上通过 MIT 协议开源,有超过 10.3k 的 star、1.1k 的 fork、2.2k 的项目依赖量,代码贡献者 100+,妥妥的前端优质开源项目。
2.开始使用 SVG.js
2.1 准备工作
创建一个基本的 Html 标记并包含 svg.js 脚本:
<!DOCTYPE html>
<html>
<head>
<title>SVG.js</title>
<script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js@3.0/dist/svg.min.js"></script>
</head>
<body>
</body>
</html>
或者只在 javascript 应用程序中导入 svg.js:
import { SVG } from "@svgdotjs/svg.js";
注意:以前在全局 SVG 对象上可用的所有属性现在都需要导入,请参见下面的示例:
import {
SVG,
extend as SVGextend,
Element as SVGElement,
} from "@svgdotjs/svg.js";
2.2 创建 SVG 文档
接下来,使用 SVG() 函数创建一个 SVG 文档并将其添加到 html 页面:
var draw = SVG().addTo("body").size(300, 300);
var rect = draw.rect(100, 100).attr({ fill: "#f06" });
可以将任何 css 选择器传递给 addTo 或节点。
<body>
<svg
xmlns="http://www.w3.org/2000/svg"
version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="300"
height="300"
>
<rect width="100" height="100" fill="#f06"></rect>
</svg>
</body>
SVG.js 不会自动设置文档的大小。因此,请确保使用适当的值调用 size()。 例如:要将大小设置为其父级的尺寸,可以使用以下命令:
var draw = SVG().addTo("#someId").size("100%", "100%");
2.3 等待 DOM 加载
这对许多人来说似乎是显而易见的,但仍然值得一提。如果在文档的头部包含 js 文件,请确保等待 DOM 加载完成:
SVG.on(document, "DOMContentLoaded", function () {
var draw = SVG().addTo("body");
});
如果在页面底部包含 js,这不是问题。
2.4 纯 SVG 使用
SVG.js 也可以在 HTML DOM 之外工作,例如在 SVG 文档内:
<?xml version="1.0" encoding="utf-8" ?>
<svg id="drawing" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" >
<script type="text/javascript" xlink:href="svg.min.js"></script>
<script type="text/javascript">
<![CDATA[
var draw = SVG('#drawing')
draw.rect(100,100).animate().fill('#f03').move(100,100)
]]>
</script>
</svg>
2.5 使用 SVG() 函数
此函数不仅创建新文档,还可以从 dom 中检索 svg.js 对象或从 svg 片段创建新对象:
// new document
var draw = SVG();
// get rect from dom
var rect = SVG("#myRectId");
// or
var rect = SVG("rect");
// any css selector will do
var path = SVG("#group1 path.myClass");
// create new object from fragment
var circle = SVG("<circle>");
// convert node to svg.js object
var obj = SVG(node);
3.扩展 SVG.js
由于 SVG.js 的面向对象性质,对象/原型可以在任何级别上扩展。此外,所有 SVG.js 类都可以进行子类化以创建自定义元素。
3.1 SVG.extend()
SVG.js 具有模块化结构,可以在不同级别添加自定义方法。假设想要向所有形状类型添加一个方法,那么可以将方法添加到 SVG.Shape:
SVG.extend(SVG.Shape, {
paintRed: function () {
return this.fill("red");
},
});
现在所有形状都可以使用 paintRed() 方法。假设想让椭圆上的 paintRed() 方法应用稍微不同的颜色,可以按照如下方式:
SVG.extend(SVG.Ellipse, {
paintRed: function () {
return this.fill("orangered");
},
});
SVG.Ellipse 的完整继承栈是: SVG.Base > SVG.EventTarget > SVG.Dom > SVG.Element > SVG.Shape > SVG.Ellipse。 可以使用以下方法扩展 SVG 文档:
SVG.extend(SVG.Svg, {
paintAllPink: function () {
this.each(function () {
this.fill("pink");
});
},
});
还可以一次扩展多个元素:
SVG.extend([SVG.Ellipse, SVG.Path, SVG.Polygon], {
paintRed: function () {
return this.fill("orangered");
},
});
3.2 子类化 Subclassing
使用 SVG.js 创建自定义元素非常简单,假如想要一个圆角矩形,它总是与元素的高度成比例,新形状位于 SVG 命名空间中,称为 Rounded。 以下是实现这一目标的方法。
SVG.Rounded = class extends SVG.Rect{
// 创建按比例缩放圆角的方法
size: function(width, height) {
return this.attr({
width: width
, height: height
, rx: height / 5
, ry: height / 5
})
}
})
// 添加创建圆角矩形的方法
SVG.extend(SVG.Container, {
// 创建圆形元素
rounded: function(width, height) {
return this.put(new SVG.Rounded).size(width, height)
}
}
3.3 插件生态
SVG.js 的插件生态非常完善,下面是一些官方提供的优秀插件。
- svg.colorat.js:svg.colorat.js 是 SVG.js 的扩展,允许开发者从特定给定位置的渐变中选择颜色。
- svg.draggable.js:使元素可拖动
- svg.easing.js:支持更多动画缓动方法。
- svg.filter.js:向元素添加 svg 过滤器。
- svg.math.js:支持 SVG 的数学扩展
- svg.panzoom.js:svg.js 的插件,它为视图框元素启用平移。
- svg.path.js:支持手动绘制路径
- svg.shapes.js:支持更多基于多边形的形状。
- svg.topath.js:将任何其他形状转换为 path 路径。
- svg.topoly.j:将路径转换为多边形或折线。
- ngx-svg:ngx-svg 是 Angular 2+ 的一个库,它使得在 Angular 中使用 SVG.js 库变得容易。
4.本文总结
本文主要和大家介绍下 SVG.js,即用于操作和为 SVG 添加动画的轻量级库。相信通过本文的阅读,大家对 SVG.js 都会有一个初步的了解。
因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!
参考资料
https://github.com/svgdotjs/svg.js/
https://svgjs.dev/docs/3.0/getting-started/#create-an-svg-document
https://svgjs.dev/docs/3.0/extending/#subclassing
https://svgjs.dev/docs/3.0/plugins/ngx-svg/
https://svgjs.dev/docs/3.0/compatibility/
https://github.com/adobe-webplatform/Snap.svg/
相关推荐
- 怎么恢复7z文件 7z文件删除了怎么恢复
-
7z是一种压缩格式的文件,它运用LZMA压缩算法,该压缩算法的输出稍后被算数编码进行处理以便后续进一步压缩,压缩比十分高。我们可以将文件压缩成这种格式,便于传输,保存,占空间少。了解更多7z文件知识...
- 郎酒让消费者喝得明明白白 算术题里有答案
-
日前,『郎酒酱香产品企业内控准则』颁布,郎酒首次公开酱香产品生产全过程,公布酱香产品产能、储能及投放计划。随后,郎酒官微向消费者发出「品控算术题」有奖问答。郎酒亮出家底,消费者踊跃留言。8天后,谜底揭...
- 学龄前,比识字、算术更重要的是这三件事
-
“为了给孩子选择一家合适的幼儿园,我曾穿梭于纽约各家幼儿园的开放日,这些幼儿员既包括主流的公立幼儿园,还包括那些遥不可及的私人幼儿园。我的目的就是想了解他们的教育理念是什么,到底厉害在哪里,看看对于我...
- 参加CSP-J信奥赛需要掌握数学知识
-
在C++语法的学习中需要储备的数学知识如下①数据类型:需要知道整数、正整数、负整数、小数、判断对错②算术运算符:加法、减法、乘法、除法、取模运算③关系表达式:大于、大于等于、小于、小...
- 1g米饭能做多少深蹲?今天我们来算一算
-
减重我们都知道3分在练,7分在吃,吃这件事情上,真的是每一口都算数。今天我们来算一笔账,1粒米饭可以做多少事情?本着认真负责的态度,今天在食物秤上称了1g米饭,是16粒。根据能量换算:100g米饭是4...
- web 自动化测试,一定得掌握的 8 个核心知识点
-
使用cypress进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用JavaScript作为编程语言。传统主流的selenium框架是支持多语言的,大多数QA会的pytho...
- 大话C语言:赋值运算符(c语言中赋值运算符是什么)
-
赋值运算符是最基本的运算符之一,用于将右侧的值或表达式的计算结果赋给左侧的变量。它是一个二元运算符,意味着它需要两个操作数:一个是目标变量(左侧),另一个是要赋给该变量的值或表达式(右侧)。赋值运算符...
- Vue进阶(幺幺伍):js 将字符串转换为boolean
-
Boolean();参数为0、null和无参数返回false,有参数返回true。Boolean("");//输出为:falseBoolean(null);//输出为...
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
-
1).大于,小于,大于或等于,小于或等于$gt:大于$lt:小于$gte:大于或等于$lte:小于或等于例子:db.collection.find({"field":{$gt:valu...
- Python学不会来打我(21)python表达式知识点汇总
-
在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...
- C|数据存储地址与字节偏移、数据索引
-
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表示位置偏移,异质结构的结构体通过其...
- 下班后累懵?4 个 JS 手写题帮你搞定前端面试高频考点
-
打工人下班后最痛苦的事,莫过于拖着疲惫的身子还要啃前端面试题吧?看着那些密密麻麻的JS代码,脑子都快转不动了!别担心,今天咱就用轻松的方式,带你吃透4道高频手写题,让你在面试时自信满满,再也不...
- 嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门
-
sqlite在《嵌入式数据库sqlite3命令操作基础篇-增删改查,小白一文入门》一文中讲解了如何实现sqlite3的基本操作增删改查,本文介绍一些其他复杂一点的操作。比如where、orderby...
- 前缀表达式与后缀表达式(前缀表达式后缀表达式中缀表达式计算)
-
昨天晚上和儿子一起学习了前缀表达式和后缀表达式。这应该是字符串算式如何被计算机识别并计算的2种方法。本来是想先给他讲一个逆波兰式(后缀表达式),以后再讲前缀表达式。没想到他还挺聪明,很快就把2个都掌握...
- Python快速入门教程1:基本语法、数据类型、运算符、数字字符串
-
Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、运算符、数字和字符串等内容,并附有使用实例场景。Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)