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

实现滚动到指定div时触发数字动画(保留现有jQuery代码)

不用插件实现滚动到区域才触发jQuery数字动画

嘿,我完全懂你的需求——不想加额外插件,还要保留自己原本能用的jQuery数字动画,只在用户滚到目标div区域时才启动,对吧?这事儿完全可以自己实现,不用依赖第三方工具,我给你一步步拆解方案:

核心思路

我们只需要搞定这几件事:

  • 把你的动画代码封装成可调用的函数,方便按需触发
  • 写一个原生JS方法判断「元素是否进入视口」(完全不用插件)
  • 监听页面滚动事件,每次滚动时检查目标div是否可见,且动画还没执行过,就触发动画
  • 页面加载完成后也检查一次,防止页面加载时目标区域本来就在视口里

具体实现代码

假设你的HTML结构是这样的(可以根据自己的实际结构调整class):

<!-- 页面上方占位内容,用来模拟滚动场景 -->
<div style="height: 1000px;">往下滚动就能看到计数器啦</div>

<!-- 你的数字动画目标区域 -->
<div class="counter-container">
  <div class="count-item">890</div>
  <div class="count-item">1250</div>
  <div class="count-item">360</div>
</div>

然后是改造后的jQuery代码,这里我把常见的数字动画逻辑封装进去,你可以直接替换成你自己原本运行正常的代码:

$(document).ready(function() {
  // 标记动画是否已经执行过,避免滚动时重复触发
  let animationDone = false;

  // 封装你的数字动画函数——这里可以直接替换成你自己的核心动画代码
  function startCountAnimation() {
    $('.count-item').each(function() {
      const $this = $(this);
      // 获取div里设定的目标数值
      const targetNumber = parseInt($this.text(), 10);
      // 从0开始计数到目标值,你可以保留自己的duration、easing等参数
      $({ currentCount: 0 }).animate({
        currentCount: targetNumber
      }, {
        duration: 2500,
        easing: 'swing',
        step: function() {
          $this.text(Math.floor(this.currentCount));
        },
        complete: function() {
          $this.text(this.currentCount);
        }
      });
    });
  }

  // 原生JS判断元素是否在视口内的方法,完全无依赖
  function isElementVisible(element) {
    const rect = element.getBoundingClientRect();
    return (
      rect.top >= 0 &&
      rect.left >= 0 &&
      rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
      rect.right <= (window.innerWidth || document.documentElement.clientWidth)
    );
    // 如果需要元素部分可见就触发,可以把上面的判断改成:rect.top <= window.innerHeight
  }

  // 滚动/页面加载时的触发检查逻辑
  function checkScrollCondition() {
    const targetDiv = $('.counter-container')[0];
    // 当目标区域在视口内,且动画还没执行过,就启动动画
    if (isElementVisible(targetDiv) && !animationDone) {
      animationDone = true;
      startCountAnimation();
    }
  }

  // 页面加载完成后先检查一次,防止目标区域一开始就在视口里
  checkScrollCondition();

  // 监听滚动事件,每次滚动都执行检查
  $(window).scroll(function() {
    checkScrollCondition();
  });
});

关键细节说明

  1. animationDone 变量:用来防止动画重复触发——因为滚动事件会被频繁触发,我们只需要让动画执行一次就够了
  2. isElementVisible 函数:通过原生的getBoundingClientRect()获取元素的位置信息,精准判断它是否在视口内;如果需要元素刚露出一点就触发,可以调整判断条件
  3. 封装动画函数:把你原本的动画代码放进startCountAnimation里,完全保留你自己的核心动画逻辑,只是改变触发时机

你只需要把代码里的class选择器(.counter-container、.count-item)改成你自己HTML里对应的class,再替换startCountAnimation里的动画逻辑为你自己的代码,就能正常工作啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:19:18