You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现D3柱状图从下往上生长动画及标签随动效果?

解决方案:实现D3柱状图从下往上生长的动画+标签同步移动

没问题,我来帮你搞定这两个需求——让柱状图从下往上自然生长,同时让顶部的数值标签跟着柱子同步移动。咱们先梳理下现有代码的问题,再一步步调整:

核心问题分析

你当前的动画逻辑弄反了:SVG的坐标系是左上角为原点,y轴向下延伸,所以要实现"从下往上生长",柱子的初始状态应该是「高度为0、底部贴在SVG底部」,然后过渡到最终的高度和位置;而标签也需要和柱子的顶部位置绑定,跟着一起动画。

修改后的完整代码

d3.select("body")
  .append("h2")
  .text("BAR GRAPH");
const dataset = [12, 31, 22, 17, 25, 18, 29, 14, 9];
const w = 500;
const h = 120;
const svg = d3
  .select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);

// 1. 柱子的初始状态:高度为0,y坐标贴SVG底部(h)
var bars = svg
  .selectAll("rect")
  .data(dataset)
  .enter()
  .append("rect")
  .attr("x", (d, i) => i * 30)
  .attr("y", h)  // 初始位置:底部在SVG底部
  .attr("width", 25)
  .attr("height", 0)  // 初始高度为0
  .attr("fill", "navy");

// 2. 柱子的过渡动画:从下往上生长
bars
  .transition()
  .duration(400)
  .attr("y", (d, i) => h - 3 * d)  // 最终y坐标:柱子顶部位置
  .attr("height", (d, i) => 3 * d);  // 最终高度

// 3. 标签的初始状态+同步动画
var labels = svg
  .selectAll("text")
  .data(dataset)
  .enter()
  .append("text")
  .text(d => d)
  .attr("x", (d, i) => i * 30)
  .attr("y", h)  // 初始位置:和初始柱子顶部一致(SVG底部)
  .style("font-size", "25px")
  .style("fill", "red")
  .append("title")
  .text(d => d);

// 给标签加上同步过渡动画
labels.transition()
  .duration(400)
  .attr("y", (d, i) => h - 3 * d - 3);  // 最终位置:柱子顶部上方3像素

关键修改点说明

  • 柱子初始状态:把初始的y设为h(SVG底部),height设为0,这样初始时柱子完全隐藏在底部。
  • 柱子过渡逻辑:过渡时把y调整到h - 3*d(柱子顶部的位置,因为柱子高度是3*d,所以从底部往上推3*d的距离),同时height过渡到3*d,这样就实现了从下往上"生长"的效果。
  • 标签同步动画:给标签也添加transition,初始y设为h(和初始柱子顶部对齐),过渡到最终的h - 3*d -3(和柱子最终顶部对齐,留3像素间距),这样标签就会跟着柱子一起移动了。

内容的提问来源于stack exchange,提问作者ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:07:30