【问题标题】:Implement a list of scrollable records using in SVG using D3.js使用 D3.js 在 SVG 中实现可滚动记录列表
【发布时间】:2018-07-17 17:21:08
【问题描述】:

我想使用 D3.js 在 SVG 中实现一个可滚动记录列表。而且我不知道一旦特定记录的高度发生变化,如何将所有记录向下或向上移动。

这就是我的意思。假设我们有一个记录列表(每条记录使用嵌套的svg 表示,并使用相对于根svg 的位置和尺寸的百分比值进行定位):

现在我更新其中一条记录中的数据,使其高度增加或减少。因此,我需要将记录下方的所有记录向下或向上移动。

我该怎么做?我考虑保留所有记录的数组,当其中一个记录更改其高度时,将通过数组并更新每个记录的y 位置。但这似乎是非常低效的解决方案。还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: javascript d3.js svg


    【解决方案1】:

    如果您使用的是 SVG,而不是 html,您可能必须实现自己的滚动解决方案。几年前,我通过在容器中保留项目列表来完成此操作,如果添加了新项目,您首先更新应该可见的内容,然后更新这些可见项目的位置。如果 y/x 坐标超出范围,则将它们从 dom 中删除,这就是我的意思:

    LINK TO ABOVE EXAMPLE

    另一种解决方案可能是使用 SVG foreignObject 并直接嵌入 HTML,我猜这样会容易得多。

    【讨论】:

    • foreignObject 在这种情况下不是解决方案。如果我创建以下层次结构:root svg > foreignObject > div 在溢出时滚动 > svg,则滚动在 Chrome 中不起作用。但我想你提供的是我能期待的最好的。谢谢。
    • 我认为会有浏览器供应商的陷阱。然后实现您自己的解决方案,每次拖动处理程序时 --> 切片项目数组以确定应该可见的内容 --> 输入/更新/退出以更新 DOM 节点。顺便说一句,如果我是你,我会为 chrome 提交错误报告,foreignObject 的行为应该与 xhtml 父级相同。
    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多