4

我有两个g元素,每个元素都包含圆圈。圈子是使用 组织的force.layoutg元素正在过渡。

你可以在这里看到:演示。减少代码:



    var dots = svg.selectAll(".dots")
    .data(data_groups)
    .enter().append("g")
    .attr("class", "dots")
    .attr("id", function (d) {
     return d.name;
    })
    ...
    .each(addCircles);

    dots.transition()
    .duration(30000)
    .ease("linear")
    .attr("transform", function (d, i) {
        return "translate(" + (150 + i * 100) + ", " + 450 + ")";
    });

    function addCircles(d) {

        d3.select(this).selectAll('circle')
        .data(data_circles.filter(function (D) {
            return D.name == d.name
        }))
        .enter()
        .append('circle')
        .attr("class", "dot")
        .attr("id", function (d) {
            return d.id;
        })
        ...
        .call(forcing);
    }

    function forcing(E) {

        function move_towards(alpha) {
            ...
        }

        var force = d3.layout.force()
        .nodes(E.data())
        .gravity(-0.01)
        .charge(-1.9)
        .friction(0.9)
        .on("tick", function (e) {
            ...
        });
        force.start();
    }

我需要使用转换将圆(例如 id=1)从第一个g元素移动到第二个元素。

任何建议表示赞赏。

4

2 回答 2

2

可以办到。

我所做的是:

1) 使用 jquery 将点附加到目标组 2) 使用转换(无转换)将点移回其原始位置 3) 将点转换到其新位置

jQuery 用于该appendTo方法。它可以被删除并替换为一些纯 Javascript 的东西,但它非常方便。

这里有一个部分工作的小提琴。绿点工作正常,但蓝点出了点问题。不知道为什么。

于 2013-07-30T16:25:57.900 回答
0

在我看来,过渡作用于单个元素。如果一个元素在 DOM 树中改变了它的位置,从一个下面g到另一个,我想不出一种方法来使它成为一个平滑的过渡,因为它基本上是一个二进制拆分:现在 one 下有一个元素g,现在它已经消失了,但是在别的地方还有一个。

为了实现我认为您想要做的事情,我会做什么:将所有内容分组在同一个“g”下,单独分配颜色和翻译,然后为您要更改的单个元素更改颜色和翻译。

但是不要把它当作一个可靠的声明,你不能按照你最初想要的方式去做。

于 2013-07-30T12:55:53.880 回答