I have a counter which animates to a final number which is defined in the HTML. However I would like this animation to happen once it\'s in the viewport.
I have a fi
The .inViewport() plugin triggers a callback on every scroll event.
It's by design. (Helps to keep the source of a plugin in code! ;) )
On the "plugin page" you can see how to use it:
$("selector").inViewport(function(px) {
console.log( px ); // `px` represents the amount of visible height
if(px){
// do this if element enters the viewport // px > 0
}else{
// do that if element exits the viewport // px = 0
}
}); // Here you can chain other jQuery methods to your selector
that means:
px argument is greater than 0 (element is in viewport) $(this).each() inside the callback is not needed. The plugin already operates over a collection of elements.)Edited jsFiddle demo
jQuery(function($) { // DOM ready and $ in scope
$(".fig-number").inViewport(function(px) {
// if px>0 (entered V.port) and
// if prop initNumAnim flag is not yet set = Animate numbers
if(px>0 && !this.initNumAnim) {
this.initNumAnim = true; // Set flag to true to prevent re-running the same animation
// <<< DO SOME COOL STUFF HERE!
}
});
});
Snippet example:
// inViewport jQuery plugin
// https://stackoverflow.com/a/26831113/383904
$(function($, win) {
$.fn.inViewport = function(cb) {
return this.each(function(i,el){
function visPx(){
var H = $(this).height(),
r = el.getBoundingClientRect(), t=r.top, b=r.bottom;
return cb.call(el, Math.max(0, t>0? H-t : (b0 ) and
// if prop initNumAnim flag is not yet set
// = Animate numbers
if(px>0 && !this.initNumAnim) {
this.initNumAnim = true; // Set flag to true to prevent re-running the same animation
$(this).prop('Counter',0).animate({
Counter: $(this).text()
}, {
duration: 1000,
step: function (now) {
$(this).text(Math.ceil(now));
}
});
}
});
});
html,
body {
height:100%;
}
#upper-push {
height:100%;
width:100%;
display:block;
background:red;
color:white;
}
Scroll down
25
78