【问题标题】:How to dynamically display a multiline text in D3.js?如何在 D3.js 中动态显示多行文本?
【发布时间】:2013-11-16 10:53:57
【问题描述】:

我需要使用 D3.js 在 SVG:Text 中显示多行文本。

示例数据如下所示,我想在单个节点下为每个作者显示“所有”“标题”,而不是在强制定向布局中显示为单个节点。

样本数据

{
    {"author":"Author1", "group":"fiction", "books" : [
        {"title":"Book Title1", "rating":3},
        {"title":"Book Title2", "rating":4}
    ]},
    {"author":"Author2", "group":"non-fiction", "books" : [
        {"title":"Book Title3", "rating":3},
    ]}
}

SVG:text 只需要一个文本输入并显示在一行中,所以我添加了更多文本并调整了“dy”?还是反向收集节点信息并替换?

感谢您的提示。

【问题讨论】:

    标签: json svg d3.js


    【解决方案1】:

    您有以下选择。

    • 正如您所提到的,您可以添加多个具有适当间距的text 元素。
    • 您还可以在text 元素中使用多个tspan 元素以达到相同的效果。同样,您必须自己设置间距。
    • 您可以使用foreignObject 嵌入合适的HTML 元素(例如div),它会为您处理换行、间距等问题。有关示例,请参见例如here

    除非您有特定的理由不这样做,否则我会选择 HTML 嵌入选项。它使实际的文本格式比其他选项容易得多。

    【讨论】:

    • foreignObject 完美运行。谢谢。如何从多个节点收集信息,即动态收集作者的所有“标题”?例如。 “书名1
      书名2”等,谢谢。
    • 给定一个作者,您只需查看书籍。在 D3 中,这类似于 d3.selectAll("p").data(author.books).enter().append("p").text(function(d) { return d.title; })
    • 根据我的经验,使用 foreignObject 可能会导致 Safari 上的渲染错误。另一种选择是使用绝对定位的 div 创建一个单独的 html 层,其顶部和左侧样式属性使用强制布局对象进行调整。这种分层方法类似于许多映射库(例如 Leaflet)处理 svg 和 html 覆盖的方式。
    • IE 不支持foreignObject。
    • 我喜欢第三个选项!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2012-10-05
    • 2014-11-12
    相关资源
    最近更新 更多