javascript - 在保持旧元素位置的同时应用过渡

标签 javascript d3.js

在页面上,我有许多具有相同类的矩形,比如 one 类。

我如何对所有这些矩形应用过渡,以便它们移动到具有新类(可能是类 two)的新位置,但让那些旧矩形保持静止在同一位置?

如果我解释不正确,有人可以纠正我吗?

例如,我有这些带有“start”类的矩形

d3.select("svg")
  .selectAll("rect")
  .data([10,20,30,40,50])
  .enter()
  .append("rect")
  .attr("class", "start")
  .attr("x", d => d)
  .attr("y", 1)
  .attr("width", 5)
  .attr("height", 5);

这些矩形坐标是(10, 1), (20, 1), (30, 1) ...

然后我移动它们

d3.selectAll("rect")
  .transition()
  .attr("y", (d, i) => i + 5 * 10); 

它们会出现在新的坐标(10, 50), (20, 51), (30, 52) ...

我怎样才能使类 start 在 (10, 1), (20, 1), (30, 1) ... 的原始矩形仍然存在,但有新的在 (10, 50), (20, 51), (30, 52) ... 类 stop?

处的矩形

最佳答案

正如您在编辑中明确指出的那样,您不想将过渡应用到现有元素:您想要克隆它们并将过渡应用到它们的克隆(或者在将过渡应用到原始元素之前克隆它们,这是相同的...)。

也就是说,D3 有一个非常方便的方法,名为 clone ,其中:

Inserts clones of the selected elements immediately following the selected elements and returns a selection of the newly added clones.

因此,假设您的选择被命名为 rectangles(建议:始终为您的选择命名),而不是这样做......

rectangles.transition()
    .attr("class", "stop")
    .attr("y", (d, i) => i + 5 * 10);

...首先克隆它们:

rectangles.each(cloneNodes)
    .transition()
    .attr("class", "stop")
    .attr("y", (d, i) => i + 5 * 10);

function cloneNodes() {
    d3.select(this).clone(false);
}

这是演示:

const svg = d3.select("svg");

const rectangles = d3.select("svg")
  .selectAll(null)
  .data([10, 20, 30, 40, 50])
  .enter()
  .append("rect")
  .attr("class", "start")
  .attr("x", d => d)
  .attr("y", 1)
  .attr("width", 5)
  .attr("height", 5);

rectangles.each(cloneNodes)
  .transition()
  .attr("class", "stop")
  .attr("y", (d, i) => i + 5 * 10);

function cloneNodes() {
  d3.select(this).clone(false);
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>

关于javascript - 在保持旧元素位置的同时应用过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52656952/

相关文章:

javascript - iframe 可以检查自己是否在视口(viewport)中吗?

javascript - jQuery 替换 div 中的多个单词

javascript - GetUIkIt 3 通知关闭事件?

d3.js - 如何使用非树数据创建 d3.js 可折叠力布局?

Javascript - 错误处理 - Promise 数组

javascript - 有选择地阻止页面上其他 javascript 创建 cookie 的 javascript

javascript - d3 force 网络中的水平链接标签

javascript - 如何在d3中制作半圆?

D3.js 在 v4 中同时嵌套和汇总

javascript - 使用 d3 在旋转的线上画笔以创建缩放效果