Animate counter when in viewport

前端 未结 3 1615
逝去的感伤
逝去的感伤 2020-12-09 17:26

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

3条回答
  •  再見小時候
    2020-12-09 17:44

    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:

    1. You have to listen for the px argument is greater than 0 (element is in viewport)
    2. To prevent chaining additional animations creating buildups, you should use a flag variable
    3. (The $(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

提交回复
热议问题