【问题标题】:JQuery: fire action when element is in viewJQuery:当元素在视图中时触发动作
【发布时间】:2014-06-06 23:27:56
【问题描述】:

在我网站的页脚中,我使用 counUp.js(链接:http://inorganik.github.io/countUp.js/)计算三个数字。我在网站底部添加了这段代码:

   <script type="text/javascript">
          var c1 = new countUp("upnum1", 1, 27, 0, 4);
          var c2 = new countUp("upnum2", 1, 10, 0, 4);
          var c3 = new countUp("upnum3", 1, 27, 0, 4);
          var c4 = new countUp("upnum4", 1, 1000, 0, 4);
          window.onload = function() {
            c1.start();
            c2.start();
            c3.start();
            c4.start();
          }
    </script>

这很好用,但当然会在页面加载后开始计数。当数字的包含 div 处于“视图中”而不是加载页面时,我如何设法触发此效果?尝试了几个 jQuery 的东西,但找不到一个可行的解决方案......谢谢!

【问题讨论】:

    标签: jquery events dom visible


    【解决方案1】:

    有一个简单的检查来查看元素是否在视口中。

    您可以选择使用插件或纯 JQuery。

    相关HTML:

    <div id="inViewport">Is this in the viewport?</div>
    

    纯 JQuery :

    这里是这个的小提琴: http://jsfiddle.net/zWtkc/1/

    $.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));
    
    };
    
    $(document).ready(function(){
        $(window).scroll(function(){
            if ($('#inViewport').isOnScreen()) {
                // The element is visible, do something
                alert("in viewport!");
            } else {
                // The element is NOT visible, do something else
            }
        });
    });
    

    插件:

    你可以使用这个插件:https://github.com/teamdf/jquery-visible/

    $(document).ready(function(){
        if ($('#inViewport').visible(true)) {
            // The element is visible, do something
        } else {
            // The element is NOT visible, do something else
        }
    });
    

    或者您可以使用这个插件:http://www.appelsiini.net/projects/viewport,它允许视口选择器,您的代码将如下所示:

    $('#inViewport:in-viewport').doSomething();
    

    【讨论】:

    • 是的,但如果我做对了,它会检查元素是否在页面加载时可见,而不是向下滚动到它时。
    • 我需要类似的东西:滚动后,检查#div是否可见,如果是的话:countUp,如果不是,什么也不做。
    • @MarcL 用纯 JQuery 更新了我的答案。 $(document).ready(function(){... 这只是确保页面上的所有元素在尝试执行代码之前都已完全加载。否则,您可能会收到错误,具体取决于您的脚本在 HTML 中的位置
    • 非常感谢!要看看这个解决方案并尝试嵌入它:-)
    • 应该不会太难吧! gl
    【解决方案2】:

    这就是我使用这个插件的方式:https://github.com/protonet/jquery.inview

    var options = {
        useEasing : true, 
        useGrouping : true, 
        separator : ',', 
        decimal : '.', 
        prefix : '', 
        suffix : '' 
        };
        var c1 = new CountUp("a1", 0, 1000, 0, 5, options);
        var c2 = new CountUp("a2", 0, 1000, 0, 5, options);
        var c3 = new CountUp("a3", 0, 1000, 0, 5, options);
        var c4 = new CountUp("a4", 0, 1000, 0, 5, options);
        var c5 = new CountUp("a5", 0, 1000, 0, 5, options);
        var c6 = new CountUp("a6", 0, 1000, 0, 5, options);
    
        $('#counters').one('inview', function(event, isInView) {
    
        c1.start();
        c2.start();
        c3.start();
        c4.start();
        c5.start();
        c6.start();
    });
    

    【讨论】:

      【解决方案3】:

      这是我在元素开始进入视口时运行函数的代码。


      您可以通过单击jfiddle 查看正在运行的代码
      var counterTeaserL = $('.go-counterTeaser');
      var winHeight = $(window).height();
      if (counterTeaserL.length) {
          var firEvent = false,
              objectPosTop = $('.go-counterTeaser').offset().top;
      
              //when element shows at bottom
              var elementViewInBottom = objectPosTop - winHeight;
          $(window).on('scroll', function() {
              var currentPosition = $(document).scrollTop();
              //when element position starting in viewport
            if (currentPosition > elementViewInBottom && firEvent === false) {
              firEvent = true;
              animationCounter();
            }   
          });
      }
      
      //counter function will animate by using external js also add seprator "."
       function animationCounter(){
              $('.numberBlock h2').each(function () {
                  var comma_separator_number_step =           $.animateNumber.numberStepFactories.separator('.');
                  var counterValv = $(this).text();
                  $(this).animateNumber(
                      {
                        number: counterValv,
                        numberStep: comma_separator_number_step
                      }
                  );
              });
          }
      
      
      https://jsfiddle.net/uosahmed/frLoxm34/9/
      

      【讨论】:

      • 我认为这比公认的答案更好,因为每次滚动时它都不会“做某事”
      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2011-08-20
      • 2011-08-06
      相关资源
      最近更新 更多