以下是一个快速概述(免责声明:我是Fabric.js的作者)
SVG库
Raphael.js、Bonsai.js、svg.js、Snap.svg等使用 SVG作为底层技术来渲染图形。这是矢量图形。它们既是抽象,也是“入口”,使您能够执行类似于这样的操作(来自Bonsai的示例):
var shape1 = new Rect(10,10,100,100).attr({fillColor: 'red'});
var group = new Group();
group.addChild(shape1);
stage.addChild(group);
并获得这个:
<svg data-bs-id="0" width="796" height="796" class=" bs-1416663517803-1" viewBox="-0.5 -0.5 796 796">
<defs></defs>
<g data-bs-id="1087">
<g data-bs-id="1089">
<path data-bs-id="1088" d="M 0 0 l 100 0 l 0 100 l -100 0 Z"
fill="rgba(255,0,0,1)"
data-stroke="rgba(0,0,0,1)"
transform="matrix(1,0,0,1,10,10)"
stroke-width="0"
stroke-dashoffset="0"></path>
</g>
</g>
</svg>
这将转化为:
![img](https://istack.dev59.com/WliCf.webp)
这些库允许您通过更高级的抽象间接地使用SVG节点、属性和值进行操作。
画布库
Fabric.js、Paper.js、Kinetic.js等。
它们使用画布作为底层技术来渲染图形。这是光栅图形。它们也是抽象和"网关",使您能够执行类似于以下内容的操作(来自Fabric的示例):
var rect = new fabric.Rect({
left: 100,
top: 100,
width: 100,
height: 100,
fill: 'red'
});
canvas.add(rect);
并将其呈现为这样:
![img](https://istack.dev59.com/WliCf.webp)
由于这些库基于画布,所以文档中只会有
<canvas>
元素。其他所有内容都是用类似于以下的(更低级别的)代码在内部表示的:
var canvasEl = document.getElementById('c');
var ctx = canvasEl.getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(100, 100, 100, 100);
支持SVG解析的Canvas库
Fabric.js、canvg等是Canvas库的一部分,但支持解析SVG。这意味着库能够处理以下类似的SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="800" height="700" xml:space="preserve">
<rect x="10" y="10" width="100" height="100" stroke="blue" fill="purple" fill-opacity="0.5" stroke-opacity="0.8"/>
</svg>
并按如下方式进行渲染:
![img](https://istack.dev59.com/hw3gO.webp)
这本质上是将SVG转换为画布。它还是矢量图转换为伪光栅图。之所以是伪光栅,是因为没有损失质量(至少在Fabric的情况下)。当转换矢量SVG时,Fabric会将其制作成虚拟的
非光栅对象,该对象可以在任何大小、角度、位置等情况下呈现,而不会失去质量。甚至可以导出回SVG。只有在画布上呈现时,它才变成光栅图形。
WebGL库
Three.js、Babylon.js、c3DL、Pixi.js等。
这些是Canvas库的超集(基于<canvas>
,而不是SVG),它们使用WebGL渲染上下文而不是“2d”上下文:
// webgl canvas libraries
canvas.getContext('webgl');
// non-webgl canvas libraries
canvas.getContext('2d');
WebGL画布库使用完全不同的API来通过画布绘制图形,与非WebGL画布库相比。它们通常也支持“2d”上下文,作为备用方案。
WebGL 2D vs 3D
WebGL库还可以分为2D和3D - 那些“专门”于2D或3D输出。最流行的3D WebGL库的例子是Three.js,而2D则是Pixi.js。
顺便说一句,一旦我们在Fabric.js中添加对WebGL渲染器的支持,该库将从“具有SVG支持的画布库”变为“具有SVG支持的WebGL-capable画布库” :)