我评估Fabric.js作为Raphael.js的替代方案,用于创建与IE8兼容的交互式可视化,IE8不支持SVG或画布(IE8支持是不可协商的)不幸)。
拉斐尔可以使用可视化库D3.js - 它输出SVG并且与IE8不兼容 - 通过桥接库D34Raphael,一个适合与Raphael一起使用的D3分支。 D34Raphael调整了一些(但不是全部)D3特征输出到Raphael的抽象对象而不是DOM,因此,在IE8上,Raphael可以将D3的输出解释为VML。
(编辑2014年2月 - D34Raphael现在似乎已经死了,但是有一个令人敬畏的替代 R2D3 似乎正在积极开发中)
Fabric可以在IE8上输出Canvas(使用excanvas转换为VML),并可以将SVG转换为交互式Canvas元素。所以,从理论上讲,Fabric可以在桥接D3和IE8中取代Raphael。这样做会增加灵活性,同时支持Canvas功能以及SVG。
我没有发现任何与D34Raphael等同的Fabric - 我能找到的is this demo page最接近IE8无效。
根据我在Fabric文档中看到的内容,看起来像D34Raphael可以尝试使用Fabric:它支持转换SVG路径,圆形,多边形,折线,椭圆,矩形,线条和图像元素,并使用抽象的对象,允许持续的交互性。 benchmarks comparing performance of Fabric handling vector paths compared to Raphael handling the same令人印象深刻(尽管没有给出涉及交互或动画的比较基准)。
以几个典型的D3项目为例:
我确定我不是第一个对此进行调查的人。我不太喜欢尝试实现这样的事情,只是发现有一些不可避免的问题,任何更有经验的Fabric,Canvas和/或D3都可以从一开始就指出
我尝试了什么:我已经考虑过的一些问题:
答案 0 :(得分:13)
免责声明:我是Fabric.js的作者
非常有趣的问题。为了解决你的观点:
是否有任何现有项目允许使用fabric.js渲染D3输出,类似于D34Raphael?
不是我知道的。但从我所看到的,D3.js有SVG输出。而Fabric有SVG解析器,所以将D3的标记提供给Fabric进行渲染似乎非常简单。
有什么关于D3如何与SVG一起工作,而这些SVG无法通过Fabric的SVG传输到Canvas转换和对象模型?
我对D3并不熟悉,但是看一下你链接到的一个例子,我确实看到了一些兼容性问题。我复制了“强制有向图”的整个SVG标记并将其加载到kitchensink
中
圈子被正确渲染,但有些东西是用线条来的。奇怪的是,所有的行都被解析并正确加载到画布上。但它们并不可见。为什么?因为他们在D3.js中的样式是通过“.line”类定义的,我们不支持在Fabric中进行样式表解析。
.link {
stroke: #999;
stroke-opacity: .6;
}
如果我们要将这些样式“展开”到每一行(通过“stroke”和“stroke-opacity”属性或style =“stroke:...; stroke-opacity:...;”)它会按预期工作。
我认为围绕圆圈的白色轮廓的问题具有相同的根源。
有没有更简单的方法来推动D3输出通过Fabric而不是D34Raphael方法分支D3项目并调整其输出?
无法想到任何事情。