我正在尝试使用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>
答案 0 :(得分:13)
您可以将检查某些内容是否可用标记进行组合,以便跟踪图形是否已在视口中显示(尽管使用插入的插件执行此操作会更简单):
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;
}
});
答案 1 :(得分: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
}
}
}
});
答案 2 :(得分:1)
我不知道你是否能做到这一点,我有同样的问题,并以这种简单的方式解决它没有任何插件,请查看:
$(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);
});
});
答案 3 :(得分:1)
我遇到了与Chart.js相同的问题,并找到了一个非常好的解决方案。 GitHub上有一个由FVANCOP称为ChartNew.js的包。 他扩展了它并增加了几个功能。
查看示例,通过向下滚动绘制图表。
责任是声明
dynamicDisplay : true
答案 4 :(得分:0)