【问题标题】:Start animated number counter with JQuery when someone scrolls to ID当有人滚动到 ID 时,使用 JQuery 启动动画数字计数器
【发布时间】:2021-08-27 14:25:34
【问题描述】:

有谁知道当您滚动到特定的父 ID(如 #counter-container)时如何启动数字计数器动画?

$(window).scroll(startCounter);

function startCounter() {
  if ($(window).scrollTop() > 200) {
    $(window).off("scroll", startCounter);
    $('.count').each(function() {
      var $this = $(this);
      jQuery({
        Counter: 0
      }).animate({
        Counter: $this.text().replace(/,/g, '')
      }, {
        duration: 1000,
        easing: 'swing',
        step: function() {
          $this.text(commaSeparateNumber(Math.floor(this.Counter)));
        },
        complete: function() {
          $this.text(commaSeparateNumber(this.Counter));
          //alert('finished');
        }
      });
    });

    function commaSeparateNumber(val) {
      while (/(\d+)(\d{3})/.test(val.toString())) {
        val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
      }
      return val;
    }
  }
}
#counter-container {
  margin-top: 1000px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Scroll down...
<div id="counter-container">
  <span class="count">6,000</span>
  <span class="count">600</span>
  <span class="count">60</span>
</div>

【问题讨论】:

    标签: jquery performance scroll scrollview jquery-animate


    【解决方案1】:

    要确定滚动是否超过了某个元素,您可以将窗口滚动位置 + 高度与目标元素的垂直偏移量进行比较。试试这个:

    $(window).scroll(startCounter);
    
    function startCounter() {
      let scrollY = (window.pageYOffset || document.documentElement.scrollTop) + window.innerHeight;
      let divPos = document.querySelector('#counter-container').offsetTop;
    
      if (scrollY > divPos) {
        $(window).off("scroll", startCounter);
    
        $('.count').each(function() {
          var $this = $(this);
          jQuery({
            Counter: 0
          }).animate({
            Counter: $this.text().replace(/,/g, '')
          }, {
            duration: 1000,
            easing: 'swing',
            step: function() {
              $this.text(commaSeparateNumber(Math.floor(this.Counter)));
            },
            complete: function() {
              $this.text(commaSeparateNumber(this.Counter));
              //alert('finished');
            }
          });
        });
    
        function commaSeparateNumber(num) {
          return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
        }
      }
    }
    #spacer {
      height: 1000px;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    Scroll down...
    <div id="spacer"></div>
    <div id="counter-container">
      <span class="count">6,000</span>
      <span class="count">600</span>
      <span class="count">60</span>
    </div>

    另外请注意,我实现了一个更强大的数字分组逻辑版本,取自 this answer

    【讨论】:

    • 谢谢。这仅适用于我正在实施它的负载。边缘顶部会干扰它吗?
    • 它适用于 Chrome,但可能会导致其他浏览器出现问题。我更新了示例以使用不同的方法来强制页面内容滚动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2023-02-07
    • 2013-07-08
    • 2022-12-03
    相关资源
    最近更新 更多