【问题标题】:How to make the Chart.js animate when scrolled to that section?滚动到该部分时如何使 Chart.js 动画?
【发布时间】:2013-09-17 07:53:18
【问题描述】:

我正在尝试使用 Chart.js (http://www.chartjs.org/docs/#pieChart-exampleUsage) 中的饼图。一切都很顺利,但动画会在页面加载后立即发生,但由于用户必须向下滚动才能看到图表,所以他们不会看到动画。无论如何我可以让动画只有在滚动到那个位置时才开始?另外,如果可能的话,是否可以在每次看到该图表时都制作动画?

我的代码如下:

<canvas id="canvas" height="450" width="450"></canvas>
    <script>
        var pieData = [
                {
                    value: 30,
                    color:"#F38630"
                },
                {
                    value : 50,
                    color : "#E0E4CC"
                },
                {
                    value : 100,
                    color : "#69D2E7"
                }

            ];

    var myPie = new Chart(document.getElementById("canvas").getContext("2d")).Pie(pieData);

    </script>

【问题讨论】:

    标签: javascript jquery html charts html5-canvas


    【解决方案1】:

    您可以将检查某物是否可见与一个标志结合起来,以跟踪图表是否在出现在视口中后被绘制(尽管使用发布的插件 bitiou 执行此操作会更简单):

    http://jsfiddle.net/TSmDV/

    var inView = false;
    
    function isScrolledIntoView(elem)
    {
        var docViewTop = $(window).scrollTop();
        var docViewBottom = docViewTop + $(window).height();
    
        var elemTop = $(elem).offset().top;
        var elemBottom = elemTop + $(elem).height();
    
        return ((elemTop <= docViewBottom) && (elemBottom >= docViewTop));
    }
    
    $(window).scroll(function() {
        if (isScrolledIntoView('#canvas')) {
            if (inView) { return; }
            inView = true;
            new Chart(document.getElementById("canvas").getContext("2d")).Pie(data);
        } else {
            inView = false;  
        }
    });
    

    【讨论】:

    • 谢谢。像魅力一样工作
    • 在您的 jsfiddle 示例中,每次我滚动并滚动回元素时,它都会变得越来越大。这不适用于雷达图。
    【解决方案2】:

    最好使用延迟插件

    https://chartjs-plugin-deferred.netlify.com/

    <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-deferred@1"></script>
    
    new Chart(ctx, {
      // ... data ...
      options: {
        // ... other options ...
        plugins: {
          deferred: {
            xOffset: 150,   // defer until 150px of the canvas width are inside the viewport
            yOffset: '50%', // defer until 50% of the canvas height are inside the viewport
            delay: 500      // delay of 500 ms after the canvas is considered inside the viewport
          }
        }
      }
    });
    

    【讨论】:

    • 您不必添加任何选项,当您链接到脚本
    【解决方案3】:

    我不知道你是否可以这样做,我遇到了同样的问题,并以这种简单的方式在没有任何插件的情况下解决了它,看看:

    $(window).bind("scroll", function(){            
        $('.chartClass').each(function(i){ 
            var dougData = [
                {value: 100, color:"#6abd79"},
                {value: 20, color:"#e6e6e6"}
            ];
            var graphic = new Chart(document.getElementById("html-charts").getContext("2d")).Doughnut(dougData, options);
            $(window).unbind(i);
        });
    });
    

    【讨论】:

      【解决方案4】:

      我在使用 Chart.js 时遇到了同样的问题,并找到了一个非常棒的解决方案。 GitHub 上有一个被 FVANCOP 称为 ChartNew.js 的包。 他对其进行了扩展并添加了几个功能。

      看样例,图表是向下滚动绘制的。

      责任就是声明

      dynamicDisplay : true
      

      【讨论】:

        【解决方案5】:

        使用 IntersectionObserver 是更现代的方法,让您能够选择在触发事件之前必须显示多少元素。

        阈值 0 表示元素的任何部分可见时触发,阈值 1 表示整个元素必须可见。

        它的性能比监听滚动要好,并且只会在元素从隐藏过渡到可见时触发一次,即使在您连续滚动时也是如此。如果页面内容由于其他事件(例如隐藏/显示其他内容或调整窗口大小等)而发生更改,它也可以工作。

        这就是我制作径向图表的方式,每次至少有 20% 的图表出现在视图中时都会进行动画处理:

        const options = {
            series: [75],
            chart: {
                type: 'radialBar',
            },
        };
        const chart = new ApexCharts(document.querySelector("#chart"), options);
        chart.render();
        
        const observer = new IntersectionObserver(function(entries) {
            if (entries[0].isIntersecting === true) {
                chart.updateSeries([0], false); // reset data to 0, then
                chart.updateSeries([75], true); // set original data and animate
                // you can disconnect the observer if you only want this to animate once
                // observer.disconnect();
            }
        }, { threshold: [0.2] });
        
        observer.observe(document.querySelector("#chart"));
        

        【讨论】:

          【解决方案6】:

          这就是你想要的:

          Check if element is visible after scrolling

          下次请检查是否已经有答案;)

          或者:jquery.appear

          【讨论】:

          • 它第一次会起作用,假设用户向下滚动然后再向上滚动,动画就不会出现。
          • 你是在滚动事件中调用它吗?还有,你有没有试过jquery插件,使用起来更方便。
          猜你喜欢
          • 2021-07-30
          • 2021-08-28
          • 2018-01-19
          • 2017-01-06
          • 2014-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多