通过 Fabric.js 推送 D3.js 输出以支持 IE8?

2024-05-01

我正在评估Fabric.js http://fabricjs.com/作为替代拉斐尔.js http://raphaeljs.com/用于创建与 IE8 兼容的交互式可视化,IE8 不支持 SVG 或画布(不幸的是,IE8 支持是不可协商的)。

Raphael 可以与可视化库一起使用D3.js http://d3js.org/- 输出 SVG 并且与 IE8 不兼容 - 通过桥接库D34拉斐尔 http://webmonarch.github.io/d34raphael/,适合与 Raphael 一起使用的 D3 分叉。 D34Raphael 采用了一些(但不是全部)D3 功能来输出到 Raphael 的抽象对象而不是 DOM,这样,在 IE8 上,Raphael 可以将 D3 的输出解释为 VML。

(编辑 2014 年 2 月 - D34Raphael 现在似乎已经死了,但有一个名字很棒的替代品R2D3 https://github.com/mhemesath/r2d3/似乎正在积极开发中)

Fabric可以在IE8上输出Canvas(使用excanvas http://excanvas.sourceforge.net/转换为 VML),并且可以将 SVG 转换为交互式 Canvas 元素。因此,从理论上来说,Fabric 似乎有可能取代 Raphael 来桥接 D3 和 IE8。这样做将带来额外的灵活性,还支持 Canvas 功能以及 SVG。


我还没有找到任何与 D34Raphael 相当的 Fabric - 我能找到的最接近的这是演示页面吗 http://shimz.me/example/d3js/fabric/01/这在 IE8 中不起作用。

从我所看到的 Fabric 文档来看,Fabric 似乎可以尝试使用 D34Raphael 之类的东西:它支持转换 SVG 路径、圆形、多边形、折线、椭圆、矩形、直线和图像元素,并且可以处理抽象对象允许持续的交互。这比较 Fabric 处理矢量路径与 Raphael 处理相同路径的性能的基准 http://fabricjs.com/benchmarks/令人印象深刻(尽管没有给出涉及交互或动画的比较基准)。

以几个典型的 D3 项目为例:

  • 力定向图 http://bl.ocks.org/mbostock/4062045
  • 径向节点链接树图 http://mbostock.github.io/d3/talk/20111116/bundle.html

我确信我不是第一个研究这个问题的人。我不太喜欢尝试实现这样的东西,却发现存在一些不可避免的问题,任何对 Fabric、Canvas 和/或 D3 更有经验的人都可以从一开始就指出。

  • 是否有任何现有项目允许使用 Fabric.js 渲染 D3 输出,类似于 D34Raphael?
  • 关于 D3 如何与 SVG 配合使用,是否存在无法通过 Fabric 的 SVG 到 Canvas 转换和对象模型进行传输的问题?
  • 有没有比 D34Raphael 分叉 D3 项目并调整其输出的方法更简单的方法来通过 Fabric 推送 D3 输出?

我尝试过的:我已经研究过的一些问题:

  • Fabric 会遇到与 D34Raphael 类似的问题,即其适应 D3 DOM 查询工具的能力非常有限(因为它适用于抽象对象,而不是 DOM 元素)——但这可以通过组织良好的对象结构来解决。
  • Raphael和Fabric都在IE8中使用VML,但是通过不同的引擎,因此Raphael和Fabric的excanvas在VML中实现的功能可能存在差异。在我迄今为止的测试中,两者在 IE8 中的动画和交互性表现都很差,但功能似乎相当,而且 Fabric 似乎比 Raphael 好得多在 IE8 中渲染 VML 文本 https://stackoverflow.com/questions/6110037/raphaeljs-renders-all-text-as-italic-in-ie.
  • Fabric 对从 SVG 转换的形状的性能看起来很棒,而且基于 D3 的重绘、交互性和动画似乎应该很流畅,因为这些需要与初始绘制类似的过程(但可能有一些我没有想到的事情)。
  • 看来 Fabric 的组更像是 D3 所使用的原生 SVG 组,而不是 Raphael 的组(但我可能在这里忽略了一些东西)。


免责声明:我是 Fabric.js 的作者

非常有趣的问题。为了解决你的观点:

是否有任何现有项目允许使用 Fabric.js 渲染 D3 输出,类似于 D34Raphael?

从来没听说过。但据我所知,D3.js 有 SVG 输出。 Fabric 具有 SVG 解析器,因此将 D3 的标记提供给 Fabric 进行渲染似乎非常简单。

关于 D3 如何与 SVG 配合使用,是否存在无法通过 Fabric 的 SVG 到 Canvas 转换和对象模型进行传输的问题?

我对 D3 不太熟悉,但是看看您链接到的示例之一,我确实看到了一些兼容性问题。我复制了“力定向图”的整个 SVG 标记并将其加载到厨房水槽 http://fabricjs.com/kitchensink/

圆圈渲染得不错,但线条有些不对劲。奇怪的是,所有的行都被正确解析并加载到画布上。但它们是不可见的。为什么?因为它们在 D3.js 中的样式是通过“.line”类定义的,并且我们不支持 Fabric 中的样式表解析。

.link {
  stroke: #999;
  stroke-opacity: .6;
}

如果我们将这些样式“展开”到每一行(通过“笔画”和“笔画不透明度”属性或样式=“笔画:...;笔画不透明度:...;”),它将按预期工作。

我想圆圈周围白色轮廓的问题有相同的根源。

有没有比 D34Raphael 分叉 D3 项目并调整其输出的方法更简单的方法来通过 Fabric 推送 D3 输出?

实在是想不出什么了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Fabric.js 推送 D3.js 输出以支持 IE8? 的相关文章

  • d3 同步 2 个独立的缩放行为

    我有以下 d3 d3fc 图表 https codepen io parliament718 pen BaNQPXx https codepen io parliament718 pen BaNQPXx 该图表的主要区域有缩放行为 y 轴有
  • 如何在没有 DOM 的情况下将 javascript 作为 node.js 脚本运行?

    https github com jasondavies d3 cloud https github com jasondavies d3 cloud是一个使用 D3 库的 javascript 文字云 这是一个交互式演示 http www
  • 限制在三角形内

    我正在寻找一段通用代码 javascript 它可以与 jquery UI 一起使用来限制三角形内 div 的移动 拖动 与此类似 http stackoverflow com questions 8515900 how to constr
  • d3.js 更新视觉效果

    我有一个与 d3 js 放在一起的树形图 我通过 getJSON 填充数据 效果很好 但是 我在 setInterval 方法中具有此功能 并且它似乎并没有刷新自身 var treemap d3 layout treemap padding
  • 元素不适应 Firefox 上的

    使用 ES6 ish D3js 模块运行 Angular 6 应用程序会导致 Firefox 出现问题 Chromium Chrome Safari 和 IE Edge 工作正常 伪代码看起来类似于 生产代码可以在下面找到
  • D3 v4 在同一元素上进行画笔和缩放(鼠标事件不冲突)

    我的目标是构建一个使用两者的 D3 v4 图表d3 zoom https github com d3 d3 zoom and d3 brush https github com d3 d3 brush一起 如下 当鼠标位于 x 轴上时 用户
  • SVG 中三角形的圆角

    我正在尝试制作一个具有圆角的三角形 三角形将如下所示 左下角是唯一看起来相当容易制作的角 主要是因为这是一个 90 度的 转弯 该转弯是使用QSVG 中的命令具有以下参数 Q x y height x y height RADIUS从我正在
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a
  • 在 d3.js 中操纵鼠标悬停在“点击区域”

    我想show and hideSVG 中的一个节点 当鼠标移到 mouseout 问题是我的节点内部的形状是一条宽度只有1 5px的路径 因此在鼠标悬停事件中不容易击中该区域 这对用户体验肯定不方便 我想知道是否有办法做到这一点打击范围更广
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 当以编程方式触发 d3.behavior.zoom 事件时,如何设置平移和缩放的初始值?

    下面示例中的方块是具有初始平移和比例设置的 SVG 组的一部分 单击正方形会启动缩放过渡 但过渡设置的初始值与我的默认值不同 这一点从过渡开始时的不和谐就可以明显看出 如何在以编程方式启动的缩放过渡上设置平移和缩放的初始值 var svg
  • 增加 D3 图中边缘的可点击区域

    我有一个由 d3 制作的图 dagre d3 位于其顶部用于绘制有向图 这给出了我对渲染图表的期望 要编辑构建图表的数据 每个元素都是可单击的 这对于使用标签渲染边缘的情况来说很好 但它们并不总是有标签 导致未标记的边缘很难单击进行编辑 分
  • c3js数据标签的位置

    有没有可能的方法来更改数据上方标签的位置c3条形图 在官方文档中 很好地解释了如何通过操作 y 和 x 整数来更改 x 和 y 测量轴上标签的位置 但我没有找到任何数据标签 我试图用简单的方式指出它d3其上c3是基于但是console lo
  • 为什么我的 D3 SVG 图上的轴不会更新?

    I have 简单的 D3 散点图 http www raxacoricofallapatorius com test scattertest html我在显示数据的几个不同属性之间切换 但是虽然我可以更改数据点 并按照我想要的方式进行转换
  • 获取现有 SVG 元素的属性并使用 d3.js 绑定为数据

    我有一个现有的 svg 元素 例如
  • D3js 从数组而不是文件中获取数据

    我发现了这个优秀的 d3js 图表here http bl ocks org Caged 6476579 但就我而言 我希望此图表从数组而不是 tsv 文件中获取值 我想让它从表 中获取值 我怎样才能做到这一点 因为它使用一个函数来实现这一
  • 如何进行多个 d3 窗口大小调整事件

    我有三个svg一页上的元素 每个元素都由 D3 陪伴 每个都有自己的页面调整大小逻辑 由我写的简单模块 https github com TimeMagazine d3 base让他们做出反应 问题在于 只有最后一个调整大小事件被触发 因为
  • 与拉斐尔的路径位置

    我如何使用 raphael js 更改路径位置 很奇怪的是 明显的方法不起作用 var p paper path some path string p attr fill red p attr x 200 y 100 not working
  • dc lineChart 单击时弹出数据点信息

    我正在尝试检测折线图数据点上的点击 Per this answer dc scatter plot binding onClick event https stackoverflow com a 22772340 1873386 I am

随机推荐