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

fullpage.js中Transitions与Keyframes加载表现差异及控制方法咨询

Fullpage.js过渡属性 vs Animate.css Keyframes:机制差异与行为控制方法

我来帮你拆解一下这两种实现的核心差异,以及怎么调整Animate.css的行为来匹配你想要的「进入触发、离开反向、返回再触发」效果~

一、核心机制差异

1. Fullpage.js 过渡属性的工作逻辑

Fullpage.js对section的激活状态有一套完整的管理机制:

  • 它会监听滚动事件,当某个section进入视图时,给该section添加active类;离开时移除这个类(或调整层级/显示状态)。
  • 你设置的过渡(transition)属性依赖于元素CSS属性的「状态变化」——比如从opacity:0到opacity:1,从transform: translateY(50px)到transform: translateY(0)。只要属性值发生变化,过渡就会触发。
  • 每次切换section时,元素的状态都会被重新设置:进入时激活目标状态,离开时恢复初始状态,返回时再次切换到目标状态,所以过渡会反复触发,且自然呈现「正向进入、反向退出」的效果。

2. Animate.css Keyframes 的工作逻辑

Animate.css的动画是基于**CSS关键帧(@keyframes)**的预定义序列:

  • 动画只会在元素首次渲染(页面加载)时执行一次,因为它是「一次性的序列播放」,而非依赖状态变化。
  • Fullpage.js切换section时,只是改变元素的显示/层级状态,并不会重置@keyframes动画的执行状态——动画一旦播放完毕,除非手动触发重置,否则不会再次运行,也不会自动反向播放。

二、控制Animate.css行为的解决方案

想要让Animate.css实现和Fullpage过渡一样的效果,可以通过以下几种方式:

方法1:利用Fullpage.js的回调函数手动控制动画

Fullpage提供了afterLoad(进入section后)和onLeave(离开section前)等回调,我们可以在这些时机手动给元素添加/移除Animate.css的动画类:

new fullpage('#fullpage', {
  afterLoad: function(origin, destination, direction) {
    // 进入目标section时触发进入动画
    if (destination.index === 1) { // 这里假设目标是第2个section(索引从0开始)
      const targetEl = document.querySelector('.your-element');
      // 先移除可能存在的退出动画类,避免冲突
      targetEl.classList.remove('animate__fadeOut');
      // 添加进入动画类
      targetEl.classList.add('animate__fadeIn');
      // 动画结束后移除类,方便下次触发
      targetEl.addEventListener('animationend', () => {
        targetEl.classList.remove('animate__fadeIn');
      }, { once: true });
    }
  },
  onLeave: function(origin, destination, direction) {
    // 离开目标section时触发退出动画
    if (origin.index === 1) {
      const targetEl = document.querySelector('.your-element');
      targetEl.classList.remove('animate__fadeIn');
      targetEl.classList.add('animate__fadeOut');
      targetEl.addEventListener('animationend', () => {
        targetEl.classList.remove('animate__fadeOut');
      }, { once: true });
    }
  }
});

如果需要反向动画,也可以用Animate.css自带的animate__reverse类,或者自定义反向的关键帧动画。

方法2:改用基于Transition的自定义动画

如果想要更贴合Fullpage原生过渡的逻辑,直接用CSS Transition模仿Animate.css的效果会更省心:

/* 初始状态 */
.your-element {
  opacity: 0;
  transform: translateY(30px);
  transition: all 0.6s ease; /* 过渡时长和曲线可自定义 */
}

/* 当section激活时的目标状态 */
.section.active .your-element {
  opacity: 1;
  transform: translateY(0);
}

这种方式完全依赖Fullpage的active类切换,自动实现「进入触发、离开反向、返回再触发」的效果,不需要额外的JS逻辑。

方法3:重置动画状态实现重复触发

如果一定要用Animate.css的keyframes,可以通过「移除再重新添加动画类」的方式重置动画状态,比如在afterLoad回调里:

const targetEl = document.querySelector('.your-element');
// 先移除类,强制浏览器重绘
targetEl.classList.remove('animate__bounceIn');
void targetEl.offsetWidth; // 触发重绘
// 重新添加类,动画会再次执行
targetEl.classList.add('animate__bounceIn');

这种方式适合不需要反向动画,只需要返回时重新触发的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:36:30