highcharts:在可见而不是页面加载时触发动画

时间:2013-08-21 17:35:20

标签: animation highcharts

我将页面分成可通过锚点访问的部分。 有没有办法让highcharts动画在其特定部分变为可见而不是在页面加载时触发?

http://jsfiddle.net/YFMSb/2/(图表位于“技能”下,因此希望在页面的该部分显示时进行初始动画。在后续访问/通过该部分时无需重新制作动画)

$(function () {
$('#container').highcharts({
    chart: {
            type: 'bar',
            spacingTop: 0
        },

        title: {
            text: ''
        },

        xAxis: {
            labels: {
                enabled: false
            }
        },

        yAxis: {
            min: 0,
            max: 100,
            title: {
                text: ''
            },
            labels: {
                enabled: false
            }
        },

        plotOptions: {
            series: {
                stacking: 'normal'
            }
        },


        tooltip: {
            formatter: function() {
               return '<b>'+ this.series.name +'</b>';
            }
        },

        series: [{
            name: 'clean',
            data: [10],
        }, {
            name: 'eat',
            data: [10]
        }, {
            name: 'sleep',
            data: [40]
        }, {
            name: 'work',
            data: [30]
        }, {
            name: 'play',
            data: [10]
        }]

    });
});

3 个答案:

答案 0 :(得分:8)

将滚动事件侦听器附加到窗口,该窗口会检测您何时接近skills部分。创建图表时,请删除滚动侦听器以确保仅创建一次图表。这也有助于提高表现:没有理由倾听我们不再回应的事件。

如果用户点击顶部的skills链接,此方法也有效。

您希望小心滚动事件,因为它可能是一个真正的性能瓶颈。我采用了John Resig建议的approach来定期检查滚动位置。

<强> Working Demo

$(function () {
    var $window = $(window),
        didScroll = false,
        skillsTop = $('#skills').offset().top - 40; //the point at which we will create the chart

    $window.on('scroll', function () {
        //detected a scroll event, you want to minimize the code here because this event can be thrown A LOT!
        didScroll = true;
    });

    //check every 250ms if user has scrolled to the skills section
    setInterval(function () {
        if (didScroll) {
            didScroll = false;
            if ($window.scrollTop() >= skillsTop) {
                createChart();
            }
        }
    }, 250);

    function createChart() {
        $window.off('scroll'); //remove listener that will create chart, this ensures the chart will be created only once

        $('#container').highcharts({
            //chart configuration here
        });
    };
});

答案 1 :(得分:2)

我假设“部分变得可见”你的意思是滚动事件。

这是使其成功的最基本代码:

var target = $('#container');
var targetHeight = target.get(0).offsetTop;
var printed = false;
var printChart = function(){ 
    if(printed) return;
    printed = true;
    target.highcharts({
        chart: type: 'bar',
        /* all chart code */
    });
};
$('[href="#skills"]').on('click', printChart);
$(window).on('scroll',function(e){
    var st = $(window).scrollTop();
    if(st > targetHeight) printChart();
});

http://jsfiddle.net/YFMSb/12/

答案 2 :(得分:0)

您必须点击“技能”创建图表。 jsfiddle下面。 http://jsfiddle.net/YFMSb/6/

$("#your skills link").click(function(){
         createChart();  
    });

createChart()基本上定义了你的图表。