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

D3.js柱状图滚动触发逐根动画及反向动画实现需求

嗨,我来帮你搞定这个D3柱状图的动画需求!结合你给出的基础示例,咱们一步步实现逐柱动画、反向效果和滚动触发功能:

实现D3柱状图的逐柱动画、反向动画及滚动触发效果

首先确认已引入所需脚本:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://d3js.org/d3.v3.min.js"></script>

1. 逐柱正向动画(从0到目标高度)

原示例的动画是所有柱子同时启动,咱们通过索引延迟实现逐个触发的效果:

// 假设你已定义好柱子选择器,比如var bars = svg.selectAll(".bar")
function animateBarsForward() {
  // 先确保柱子初始状态是高度0
  bars.attr("y", height)
      .attr("height", 0);
  
  // 逐个触发过渡动画
  bars.transition()
    .duration(800) // 单根柱子的动画时长
    .delay(function(d, i) { return i * 200; }) // 第i根柱子延迟i*200ms启动
    .attr("y", function(d) { return y(d.value); })
    .attr("height", function(d) { return height - y(d.value); });
}

你可以根据视觉需求调整duration(动画时长)和delay(延迟间隔)的数值。


2. 反向动画(从目标高度缩回到0)

反向逻辑和正向类似,只是把过渡目标改成高度0:

function animateBarsBackward() {
  bars.transition()
    .duration(800)
    .delay(function(d, i) { return i * 200; })
    .attr("y", height) // 柱子顶部移至x轴位置
    .attr("height", 0); // 高度归0
}

3. 滚动可视区域自动触发动画

用jQuery监听滚动事件,判断图表容器是否进入可视范围,自动触发动画:

// 工具函数:判断元素是否在可视区域内
function isElementInViewport(el) {
  var rect = el.getBoundingClientRect();
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

// 滚动监听逻辑
var chartAnimated = false; // 防止重复触发动画
$(window).scroll(function() {
  var chart = document.getElementById("bar-chart"); // 给你的SVG容器加个ID:bar-chart
  if (isElementInViewport(chart) && !chartAnimated) {
    animateBarsForward(); // 进入可视区触发正向动画
    chartAnimated = true;
  }
  // 可选:离开可视区触发反向动画
  // else if (!isElementInViewport(chart) && chartAnimated) {
  //   animateBarsBackward();
  //   chartAnimated = false;
  // }
});

// 页面加载时,如果图表已经在可视区,直接触发动画
$(document).ready(function() {
  var chart = document.getElementById("bar-chart");
  if (isElementInViewport(chart)) {
    animateBarsForward();
    chartAnimated = true;
  }
});

4. 手动触发按钮(可选)

如果需要手动控制动画,添加两个按钮并绑定事件:

<button id="btn-play">播放正向动画</button>
<button id="btn-reset">播放反向动画</button>
$("#btn-play").click(function() {
  animateBarsForward();
});

$("#btn-reset").click(function() {
  animateBarsBackward();
});

关键注意点

  • 确保你的D3代码中已正确定义y比例尺、height等核心变量,和原示例结构保持一致
  • 动画的时长、延迟数值可以根据需求灵活调整,找到最舒适的视觉节奏
  • 如果柱子初始状态不是高度0,一定要在页面加载时先初始化,避免动画异常

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:56:48