📜  D3.js-动画(1)

📅  最后修改于: 2023-12-03 15:14:35.272000             🧑  作者: Mango

D3.js-动画

D3.js 是一个流行的 JavaScript 可视化库,能够创建各种各样的交互式图形,包括条形图、散点图、折线图、饼图等。D3.js 与动画结合起来,可以创建更加生动的可视化效果。

动画基础

D3.js 中的动画使用过渡(transition)的方式实现。在过渡中,我们将指定要动画的属性和动画开始结束的值,然后给出动画的时长。过渡中还可以添加回调函数,在动画开始、结束时进行额外的处理。

d3.select("rect")
  .transition()
  .duration(1000)  // 动画时长为 1s
  .attr("x", 200)  // 将 x 属性从当前值渐变到 200
  .on("start", () => console.log("动画开始"))
  .on("end", () => console.log("动画结束"));
动画案例:进度条

下面是一个简单的进度条动画,它跟随按钮的点击而增加:

<div>
  <button id="btn">增加进度</button>
  <div id="progress" style="background-color: blue; height: 20px; width: 0;"></div>
</div>
const progress = d3.select("#progress");

d3.select("#btn").on("click", function() {
  progress.transition()
    .duration(500)  // 动画时长为 0.5s
    .style("width", (parseFloat(progress.style("width")) + 50) + "px");  // 每次增加 50 像素
});

在这个例子中,我们使用 d3.select 方法选中了要动画的元素 #progress,并在按钮 #btn 的点击事件中触发动画。在动画过程中,我们将 width 属性从当前值渐变到增加后的值。

动画案例:散点图

下面是一个更加复杂的动画案例,我们将创建一个散点图,并让它在鼠标移入时变大,移出时恢复原状:

<div id="chart"></div>
const data = [
  {x: 10, y: 20},
  {x: 30, y: 40},
  {x: 50, y: 60},
  {x: 70, y: 80},
  {x: 90, y: 100}
];
const sizeScale = d3.scaleLinear().domain([0, 100]).range([4, 20]);

const svg = d3.select("#chart")
  .append("svg")
  .attr("width", 200)
  .attr("height", 200);

svg.selectAll("circle")
  .data(data)
  .enter()
  .append("circle")
  .attr("class", "dot")
  .attr("cx", d => d.x)
  .attr("cy", d => d.y)
  .attr("r", d => sizeScale(d.y));

svg.selectAll(".dot")
  .on("mouseover", function() {
    d3.select(this).transition().attr("r", d => sizeScale(d.y) + 5);
  })
  .on("mouseout", function() {
    d3.select(this).transition().attr("r", d => sizeScale(d.y));
  });

我们利用 d3.scaleLinear 方法创建了一个比例尺,将数据的 y 值映射到散点的大小上。在每个散点上添加鼠标移入移出事件,事件触发时执行过渡来改变散点的半径。

总结

D3.js 的动画虽然需要一定的代码量和理解成本,但使得可视化效果更加生动,增强了用户体验。我们可以根据需要在各种不同的图形中使用动画,来展示图表中的特定变化。