通过 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? 的相关文章

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

    我正在评估Fabric js http fabricjs com 作为替代拉斐尔 js http raphaeljs com 用于创建与 IE8 兼容的交互式可视化 IE8 不支持 SVG 或画布 不幸的是 IE8 支持是不可协商的 Rap
  • d3 (v4) 树布局和打字稿:类型“HierarchyNode”上不存在属性“x”

    我正在尝试在使用时使用正确的 ts 类型d3 hierarchy具有树布局的根 例如 interface MyCustomGraphType id string children MyCustomGraphType let treeData
  • Webpack 不包括 ProvidePlugins

    我正在开发一个小型试用 Web 应用程序 它使用 vue webpack 模板 https github com vuejs templates webpack https github com vuejs templates webpac
  • 需要帮助在 D3.js 条形图中将 x 轴刻度与条形对齐

    我有一个可用的线性条形图D3 js http d3js org 它也有基于时间的 x 轴 条形图绑定到计数属性 而轴绑定到日期属性 轴上的刻度未与条形对齐 知道如何将它们两者排列起来吗 这是 jsFiddle http jsfiddle n
  • NVD3/D3改变y轴最小值

    我目前正在使用 NVD3 制作一些折线图 我想知道是否可以使 y 轴刻度始终从 0 开始 目前它始终从最低的 y 值开始 我尝试过使用tickValues 但我不想更改其他值 我还尝试添加值为 0 的数据点 但这似乎是一种解决方法 它会影响
  • 如何使用数据对象中的值指定 d3.js 选择器?

    我在 Web 应用程序中使用 d3 js 描述我想要做的事情的最简单方法是查看下面链接的 Fiddle 但基本设置是我有一个包含数据对象的数组 my data id B text I want this text in B id C tex
  • D3js 多折线图 mouseOver

    我正在努力适应this http bl ocks org mbostock 3902569D3js 折线图示例 将鼠标悬停在我的多线图表上的使用情况 看起来d3 mouse this 0 on the mousemove函数生成以下错误 无
  • Raphael JS 中的动画字体大小是否有流畅的过渡可能性?

    到目前为止似乎它不流畅 但波涛汹涌 例如 如果您有一个 font size 14 的状态属性 并且想要以动画方式显示 font size 16 的状态 则过渡看起来并不平滑 它分两步跳跃 首先更改为 15 然后更改为 16px 可以强迫它看
  • 如何使用 d3.v4 中的 JSON 数据创建树布局 - 不使用 stratify()

    我正在尝试将一些 d3 代码从 v3 更新到版本 4 我有一个使用 JSON 数据的树形图 d3 v4 示例展示了如何使用 stratify 将表格数据 例如flare csv 转换为分层数据https bl ocks org mbosto
  • Fabric js-在保存和加载回画布时缺少添加附加属性的扩展 toObject 方法

    我创建了一个带有矩形和文本的织物组 最后 我使用以下代码将自定义属性 名称 添加到组类中 我使用 JSON stringify canvas 将画布数据序列化为 JSON 并将 Json 字符串发送到 java 最后将 Json 字符串保存
  • 如何运行 D3 示例

    例如https observablehq com d3 zoomable treemap https observablehq com d3 zoomable treemap 如果将脚本片段粘贴到
  • D3.js分组条形图

    I am making a bar chart using D3 js like this source statcan gc ca http www statcan gc ca pub 12 593 x 2007001 figures f
  • D3 旭日弧尺寸

    我正在尝试根据以下示例创建 D3 旭日图 https bl ocks org maybelinot 5552606564ef37b5de7e47ed2b7dc099 https bl ocks org maybelinot 55526065
  • 将文本放置在矩形的中心

    在下面的代码中 文本没有放置在矩形的中心 我使用的是 attr dx x bandwidth 2 attr dy y bandwidth 2 有没有办法将文本中心放置在矩形中 而不是反复试验 目前它看起来像这样 朝底部和朝右 以下是我的代码
  • 如何正确删除动画集中引用的 Raphael SVG 元素?

    我有一组动画 Raphael SVG 元素 我正在通过用户发起的 ajax 调用添加新元素并删除旧元素 我 set push 新元素 但因为我需要删除的元素通常不是集合中的最后一个元素 所以我使用 element remove 而不是 se
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞
  • 使用 CSS Grid,从任何地方滚动 div(不使用 jQuery 插件)

    div 怎样才能 scroll content https jsfiddle net blehmanade x1k3rhj7 33 可以从页面上的任何位置滚动吗 现在 scroll content仅当鼠标位于其上方时才可滚动 但是 当鼠标位
  • GeoJson 世界数据库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个项目 需要使用 d3 js 显示国家和城市的地图 实际上 D3支持GeoJson格式 通常
  • 在 d3.js 中操纵鼠标悬停在“点击区域”

    我想show and hideSVG 中的一个节点 当鼠标移到 mouseout 问题是我的节点内部的形状是一条宽度只有1 5px的路径 因此在鼠标悬停事件中不容易击中该区域 这对用户体验肯定不方便 我想知道是否有办法做到这一点打击范围更广
  • 根据边界动态设置初始 d3 缩放 - V4

    我要在页面上显示大量节点 大多数情况下 由于节点放置 圆圈会超出屏幕的可见区域 有没有办法根据节点的整个边界框动态设置初始缩放级别 以便所有节点都适合屏幕的可见区域 Updated 我为此添加了一个小提琴https jsfiddle net

随机推荐