4

我有一个页面被分成可以通过锚访问的部分。有没有办法让 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]
        }]

    });
});
4

3 回答 3

8

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

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

你要小心滚动事件,因为它可能是一个真正的性能瓶颈。我采用 John Resig 建议的方法定期检查滚动位置。

工作演示

$(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
        });
    };
});
于 2013-08-21T20:00:00.230 回答
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/

于 2013-08-21T18:03:41.577 回答
0

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

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

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

于 2013-08-21T18:00:27.567 回答