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

如何实现Google Chart仅在滚动进入可视区域时触发动画效果

实现方案

使用性能更优的Intersection ObserverAPI监听图表容器的可见性,仅当容器进入可视区域时才执行图表绘制逻辑,就能实现进入视口才触发入场动画的效果。

修改后完整代码

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<!-- 给容器设置高度,避免渲染异常 -->
<div id="chart_div" style="height: 400px;"></div>

<script>
google.charts.load('current', {packages: ['corechart', 'bar']});
// 预加载资源,仅标记加载状态,不直接触发绘制
let chartLoaded = false;
google.charts.setOnLoadCallback(() => {
  chartLoaded = true;
});

function drawMultSeries() {
  var data = google.visualization.arrayToDataTable([
    ['City', '2010 Population', '2000 Population'],
    ['New York City, NY', 8175000, 8008000],
    ['Los Angeles, CA', 3792000, 3694000],
    ['Chicago, IL', 2695000, 2896000],
    ['Houston, TX', 2099000, 1953000],
    ['Philadelphia, PA', 1526000, 1517000]
  ]);

  var options = {  
    animation: {
      duration: 2000,
      startup: true
    },
  };  

  var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
  chart.draw(data, options);
}

// 初始化可见性监听器
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    // 容器进入可视区且谷歌图表资源已加载完成时触发绘制
    if (entry.isIntersecting && chartLoaded) {
      drawMultSeries();
      // 绘制完成后停止监听,避免滚动时重复触发
      observer.unobserve(entry.target);
    }
  })
}, {
  threshold: 0.1 // 容器10%进入可视区就触发,可根据需求调整比例
})

// 绑定需要监听的图表容器
observer.observe(document.getElementById('chart_div'));
</script>

逻辑说明

  • 调整了资源加载回调的逻辑,仅标记加载完成状态,不直接绘制图表
  • 仅在图表容器进入可视区、且资源加载完成两个条件都满足时,才执行绘制逻辑触发入场动画
  • 绘制完成后自动取消监听,避免滚动时重复触发绘制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:57:01