You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现当Div获取in-view类时自动调用AnimatedNumber()函数?

实现当元素添加in-view类时触发数字动画的方案

嘿,我来帮你搞定这个需求!你想要在.numbers元素被加上in-view类(也就是滚动进入视口时)自动触发数字滚动动画,对吧?下面给你两种靠谱的实现方案,根据你的实际场景选就行。

方案一:用MutationObserver监听类变化(通用方案)

如果你的in-view类是由第三方滚动插件(比如ScrollReveal、Waypoints)自动添加的,没法直接在插件回调里加逻辑,那用原生的MutationObserver监听DOM类属性变化是最稳妥的方法,能精准捕捉到类被添加的瞬间。

完整代码示例

首先补全你的数字动画函数,然后加上监听逻辑:

// 定义数字滚动动画函数
function AnimatedNumber() {
  $('.numbers.in-view .count-text').each(function () {
    var $this = $(this);
    // 补全你原来的动画逻辑
    $({ Counter: 0 }).animate({ Counter: $this.text() }, {
      duration: 1500, // 动画时长,按需调整
      easing: 'swing', // 缓动效果,可选linear等
      step: function () {
        $this.text(Math.ceil(this.Counter)); // 向上取整,也可以用toFixed(2)保留小数
      },
      complete: function() {
        $this.text(this.Counter); // 确保最终显示正确的目标数值
      }
    });
  });
}

$(document).ready(function() {
  // 获取目标元素
  const numbersElement = document.querySelector('.numbers');
  
  if (!numbersElement) return; // 如果元素不存在,直接退出
  
  // 配置观察者:只监听class属性的变化
  const observerConfig = {
    attributes: true,
    attributeFilter: ['class']
  };
  
  // 创建观察者实例
  const classObserver = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
      const targetEl = mutation.target;
      // 检查是否添加了in-view类,并且还没触发过动画
      if (targetEl.classList.contains('in-view') && !targetEl.dataset.animated) {
        AnimatedNumber();
        // 加个标记,防止重复触发动画
        targetEl.dataset.animated = 'true';
      }
      // 可选:如果需要元素移出视口时重置动画状态
      if (!targetEl.classList.contains('in-view') && targetEl.dataset.animated) {
        delete targetEl.dataset.animated;
        $('.numbers .count-text').text('0'); // 把数字重置回初始值
      }
    });
  });
  
  // 启动观察者,开始监听目标元素
  classObserver.observe(numbersElement, observerConfig);
});

方案二:直接在滚动判断逻辑中触发(自定义滚动监听场景)

如果是你自己写的滚动监听代码来判断元素是否在视口并添加in-view类,那直接在添加类的地方调用动画函数更直接,不需要额外的监听:

// 定义数字动画函数(和上面一致)
function AnimatedNumber() {
  $('.numbers.in-view .count-text').each(function () {
    var $this = $(this);
    $({ Counter: 0 }).animate({ Counter: $this.text() }, {
      duration: 1500,
      easing: 'swing',
      step: function () {
        $this.text(Math.ceil(this.Counter));
      },
      complete: function() {
        $this.text(this.Counter);
      }
    });
  });
}

$(document).ready(function() {
  // 自定义滚动监听逻辑
  $(window).scroll(function() {
    $('.numbers').each(function() {
      const $el = $(this);
      const elementTop = $el.offset().top;
      const viewportBottom = $(window).scrollTop() + $(window).height();
      
      // 元素进入视口
      if (elementTop < viewportBottom) {
        $el.addClass('in-view');
        // 只在第一次进入时触发动画
        if (!$el.data('animated')) {
          AnimatedNumber();
          $el.data('animated', true);
        }
      } else {
        // 元素移出视口,移除类和标记
        $el.removeClass('in-view');
        $el.removeData('animated');
        $el.find('.count-text').text('0'); // 重置数字
      }
    });
  });
  
  // 页面加载时先检查一次,避免元素一开始就在视口内不触发
  $(window).trigger('scroll');
});

关键注意事项

  • 避免重复触发:不管用哪种方案,都加了一个标记(dataset.animated或jQuery的data),防止滚动时多次触发动画。
  • 动态元素处理:如果.numbers是动态生成的(比如AJAX加载),要等元素生成后再启动观察者或执行滚动检查。
  • 动画参数调整:可以根据需求修改duration(动画时长)、easing(缓动效果),以及step里的数值处理逻辑(比如保留小数)。

内容的提问来源于stack exchange,提问作者Antonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:17:25