如何执行图表脚本直到每个图表都在视口中?
How to Execute a chart Script until each chart is in viewport?
这件事让我很头疼,因为我找不到解决方法。
我下载了一个脚本,它帮助我制作带有动画的图表 (jquery.lineProgressbar.js)。
图表工作得很好,但问题是动画在页面加载时运行。我希望人们能够看到每个图表的动画。我在同一个页面中有很多图表,我需要它们都在进入视口时执行动画。
我知道这个问题已经发布了很多次,但是 none 解决了我的问题。
我决定为我的代码制作一个 Plunker 示例,以便您可以更好地了解它的工作原理。
Here is my Plunker
我尝试在 jquery.lineProgressbar.js 中的 "Progressing" 部分之前添加代码,告诉 "apply the animation once the div called "进度条”进入视口:
$.fn.isOnScreen = function() {
var win = $(window);
var viewport = {
top: win.scrollTop(),
left: win.scrollLeft()
};
viewport.right = viewport.left + win.width();
viewport.bottom = viewport.top + win.height();
var bounds = this.offset();
bounds.right = bounds.left + this.outerWidth();
bounds.bottom = bounds.top + this.outerHeight();
return (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom));
};
if($('.progressbar').isOnScreen()) {
// Progressing
progressFill.animate(
etc...
)
}
...但这不起作用。
我希望有人能帮助我,在此先感谢!
代码更新:
我根据 troyw1636 答案添加了功能代码。 Here the new plunker
function TestViewPort(elementID, chartPercentage){
var top_of_element = $("#" + elementID).offset().top;
var bottom_of_element = $("#" + elementID).offset().top + $("#element").outerHeight();
var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
var top_of_screen = $(window).scrollTop();
if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
if (!$("#" + elementID).hasClass('on-view')) {
$("#" + elementID).LineProgressbar({percentage:chartPercentage}).addClass('on-view');
}
}
}
你走在正确的轨道上。我使用了一种不同的方法来确定视口可见性,并将进度条调用包含在其中。我还在 $(window).scroll() 事件中添加了相同的调用,以便在视口更改时重新计算所有 div 的视口可见性。
我已经编辑了你的 Plunker:
https://plnkr.co/edit/k5aop0cnP9uziTZwDY3Y?p=preview
function TestViewPort(elementID, chartPercentage) {
var top_of_element = $("#" + elementID).offset().top;
var bottom_of_element = $("#" + elementID).offset().top + $("#element").outerHeight();
var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
var top_of_screen = $(window).scrollTop();
if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)) {
//div is visible so set up chart
$("#" + elementID).LineProgressbar({
percentage: chartPercentage
});
} else {
// div not visible
}
}
作为下一步,您可能想要确定哪些图表已经被初始化并阻止 TestViewPort 中的代码在滚动事件后重新初始化它们。
这件事让我很头疼,因为我找不到解决方法。 我下载了一个脚本,它帮助我制作带有动画的图表 (jquery.lineProgressbar.js)。
图表工作得很好,但问题是动画在页面加载时运行。我希望人们能够看到每个图表的动画。我在同一个页面中有很多图表,我需要它们都在进入视口时执行动画。
我知道这个问题已经发布了很多次,但是 none 解决了我的问题。
我决定为我的代码制作一个 Plunker 示例,以便您可以更好地了解它的工作原理。 Here is my Plunker
我尝试在 jquery.lineProgressbar.js 中的 "Progressing" 部分之前添加代码,告诉 "apply the animation once the div called "进度条”进入视口:
$.fn.isOnScreen = function() {
var win = $(window);
var viewport = {
top: win.scrollTop(),
left: win.scrollLeft()
};
viewport.right = viewport.left + win.width();
viewport.bottom = viewport.top + win.height();
var bounds = this.offset();
bounds.right = bounds.left + this.outerWidth();
bounds.bottom = bounds.top + this.outerHeight();
return (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom));
};
if($('.progressbar').isOnScreen()) {
// Progressing
progressFill.animate(
etc...
)
}
...但这不起作用。
我希望有人能帮助我,在此先感谢!
代码更新:
我根据 troyw1636 答案添加了功能代码。 Here the new plunker
function TestViewPort(elementID, chartPercentage){
var top_of_element = $("#" + elementID).offset().top;
var bottom_of_element = $("#" + elementID).offset().top + $("#element").outerHeight();
var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
var top_of_screen = $(window).scrollTop();
if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
if (!$("#" + elementID).hasClass('on-view')) {
$("#" + elementID).LineProgressbar({percentage:chartPercentage}).addClass('on-view');
}
}
}
你走在正确的轨道上。我使用了一种不同的方法来确定视口可见性,并将进度条调用包含在其中。我还在 $(window).scroll() 事件中添加了相同的调用,以便在视口更改时重新计算所有 div 的视口可见性。
我已经编辑了你的 Plunker: https://plnkr.co/edit/k5aop0cnP9uziTZwDY3Y?p=preview
function TestViewPort(elementID, chartPercentage) {
var top_of_element = $("#" + elementID).offset().top;
var bottom_of_element = $("#" + elementID).offset().top + $("#element").outerHeight();
var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
var top_of_screen = $(window).scrollTop();
if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)) {
//div is visible so set up chart
$("#" + elementID).LineProgressbar({
percentage: chartPercentage
});
} else {
// div not visible
}
}
作为下一步,您可能想要确定哪些图表已经被初始化并阻止 TestViewPort 中的代码在滚动事件后重新初始化它们。