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

实现滚动时元素逐个淡入的jQuery效果技术咨询

实现滚动时元素逐个淡入的解决方案

先梳理下你代码里的关键问题,再一步步帮你修复和优化:

1. 先修复脚本加载顺序问题

你的HTML里先加载了portfolio.js,之后才加载jQuery,这会直接导致$ is not defined的错误!必须把jQuery放在自定义脚本之前,调整后的顺序如下:

<!-- 优先加载依赖库 -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-transition/1.1.1/d3-transition.js"></script>
<!-- 最后加载自定义脚本 -->
<script src="portfolio.js"></script>

(注意你原来重复加载了两次portfolio.js,删掉其中一次即可)

2. 补充必要的CSS过渡样式

淡入效果需要CSS配合才能生效,在你的portfolio.css里添加以下样式:

.fadeIn {
  /* 初始状态:透明+轻微下移,添加过渡动画 */
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease-in-out, transform 0.6s ease-in-out;
}

.fadeIn.visible {
  /* 可见状态:完全不透明+回到原位置 */
  opacity: 1;
  transform: translateY(0);
}

3. 优化jQuery滚动逻辑

原代码存在滚动触发过于频繁、位置判断不准确等问题,这里给你优化后的版本:

// 节流函数:减少滚动事件触发频率,避免页面卡顿
function throttle(func, delay) {
  let lastTriggerTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTriggerTime >= delay) {
      lastTriggerTime = now;
      func.apply(this, args);
    }
  };
}

// 检查元素是否进入视口的核心函数
function checkFadeElements() {
  const pageTop = $(document).scrollTop();
  const pageBottom = pageTop + $(window).height();
  // 缓存元素,避免重复查询DOM
  const $fadeElements = $(".fadeIn");
  
  $fadeElements.each(function() {
    const $element = $(this);
    // 用offset().top获取元素相对于文档的顶部位置,比position()更准确
    const elementTop = $element.offset().top;
    const elementBottom = elementTop + $element.height();
    
    // 当元素部分进入视口时添加可见类
    if (elementBottom > pageTop && elementTop < pageBottom) {
      $element.addClass("visible");
    } else {
      // 可选:如果需要元素移出视口后重新隐藏,保留这行;否则可删除
      $element.removeClass("visible");
    }
  });
}

// 页面加载完成后先执行一次检查,确保初始在视口内的元素正常显示
$(document).ready(function() {
  checkFadeElements();
  // 给滚动事件添加节流,每100ms触发一次
  $(document).on("scroll", throttle(checkFadeElements, 100));
});

关键改进说明

  • 节流函数:滚动事件会高频触发,用节流限制触发频率,大幅提升页面性能。
  • offset().top:相对于整个文档的位置,避免父级定位导致的位置判断偏差。
  • 初始检查:页面加载时直接执行一次检查,不需要用户滚动就能显示视口内的元素。
  • DOM缓存:把$(".fadeIn")缓存起来,避免每次滚动都重复查询DOM。

调整后,滚动淡入效果就能正常工作,而且动画更流畅、性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:18:30