如何在 fullPage.js 页面切换前按顺序执行逐节动画

2次阅读

如何在 fullPage.js 页面切换前按顺序执行逐节动画

本文详解如何利用 fullPage.js 的 onLeave 回调与 CSS 动画控制,实现「当前节动画完成 → 再自动跳转至下一节」的链式滚动效果,避免所有节同时触发动画。

本文详解如何利用 fullpage.js 的 `onleave` 回调与 css 动画控制,实现「当前节动画完成 → 再自动跳转至下一节」的链式滚动效果,避免所有节同时触发动画。

在使用 fullPage.js 构建单页滚动网站时,常需为每节(section)添加个性化入场动画,并确保动画严格按滚动顺序执行:即用户触发滚动后,仅当前离开的节执行动画,动画完全结束后再平滑跳转至目标节。但原始代码中 $(‘.block’).addclass(‘animate’) 会一次性作用于所有 .block 元素,导致所有节动画同步启动,违背“逐节序列化”的交互预期。

要解决此问题,核心在于将动画控制粒度精确到当前操作的节,而非全局选择器。推荐采用动态内联样式方式,结合 destination.index 实时计算偏移量,替代静态 class 切换:

new fullpage('#fullpage', {   sectionsColor: ['yellow', 'orange', '#C0C0C0', '#ADD8E6'],   onLeave: function(origin, destination, direction) {     // ✅ 精确作用于当前即将离开的 section 中的 .block     $(destination.item).find('.block').css('transform', `translateX(${(destination.index + 1) * 100}px)`);      // 清除上一次定时器,防止多次触发冲突     clearTimeout(timeoutId);      // 设置动画持续时间(需与 CSS transition 时长一致)     const animationDuration = 2000; // 与 .block 的 transition: all 2s 对齐     timeoutId = setTimeout(() => {       // 动画结束后,跳转至目标节(注意:destination.index 是 0 起始,moveTo 需 +1)       fullpage_api.moveTo(destination.index + 1);     }, animationDuration);   } });

对应 CSS 需确保 .block 元素具备可过渡的 transform 属性,且移除可能干扰的全局 animate 类:

.block {   width: 100px;   height: 100px;   background-color: #f00;   /* 关键:启用 transform 过渡,时长与 JS 中 timeout 严格一致 */   transition: transform 2s ease; }  /* 移除 .block.animate 规则,改用 JS 动态设置 */

⚠️ 注意事项:

  • 时长一致性:JS 中 setTimeout 延迟必须等于 CSS transition-duration(如 2s → 2000ms),否则跳转时机错乱;
  • 作用域隔离:务必使用 $(destination.item).find(‘.block’) 定位当前节元素,禁用全局 $(‘.block’);
  • 防重复触发:clearTimeout(timeoutId) 必不可少,避免快速连续滚动导致定时器积;
  • 索引对齐:destination.index 从 0 开始,moveTo(n) 中 n 为 1 起始,故调用 moveTo(destination.index + 1);
  • 兼容性补充:若需支持旧浏览器,可回退至 margin-left 方案,但 transform 性能更优且无布局重排。

通过上述改造,动画将严格遵循「Section 1 → 动画 → 跳转 Section 2 → 动画 → 跳转 Section 3…」的线性流程,每个节的动画彼此独立、互不干扰,最终达成专业级的序列化滚动交互动效。

text=ZqhQzanResources