输入搜索…

· client · 6 min 阅读

GSAP 核心 API 完全指南

GSAP 是 Web 端高性能动画库,补间(Tweens)与时间轴(Timelines)是其核心。本文系统拆解 GSAP 核心 API 用法,搭配可复用实战 Demo,帮前端开发者快速上手,高效实现流畅复杂的 Web 动画。

GSAP 核心 API 完全指南

@supergios

🚀 GSAP 核心 API 快速指南与实战 Demo

GSAP (GreenSock Animation Platform) 是 Web 上最强大的动画库之一。掌握它的核心 API —— 补间 (Tweens)时间轴 (Timelines) —— 是创建高性能、复杂动画的关键。

一、GSAP 核心概念:补间 (Tweens)

补间是 GSAP 动画的最小单位,负责元素属性从起始状态到最终状态的平滑过渡。

1. gsap.to():过渡到指定状态(最常用)

  • 作用: 从元素当前状态,动画过渡到指定的新状态。
  • 适用场景: 按钮悬停效果、元素的移动等。
    gsap.to(".box-1", {
  x: 200,             // 最终 X 轴位移 200px
  rotation: 180,      // 最终旋转 180 度
  duration: 1.5,      // 动画持续 1.5 秒
  ease: "power2.out"  // 缓动函数
});

2. gsap.from():从指定状态开始过渡

  • 作用: 元素从指定(隐藏/外部)状态开始,动画过渡到其 CSS 定义的默认状态。
  • 适用场景: 页面元素加载(入场)动画。
    gsap.from(".box-2", {
  opacity: 0,         // 从完全透明开始
  y: 50,              // 从 Y 轴下方 50px 开始
  duration: 1,
  delay: 0.5          // 延迟开始
});

3. gsap.fromTo():精确控制起止状态

  • 作用: 明确指定起始状态和最终状态。
  • 适用场景: 元素状态的精确循环或复杂转换。
    gsap.fromTo(".box-3",
  { scale: 0.5, opacity: 0 },    // 起始状态
  { scale: 1, opacity: 1, duration: 1 } // 最终状态
);

二、GSAP 核心精髓:时间轴 (Timelines)

时间轴 (gsap.timeline()) 是用来组织、序列化、同步多个补间的强大工具。它让复杂的动画变得有条理、易于控制。

1. 创建时间轴

    const tl = gsap.timeline({
  // 配置时间轴默认值
  defaults: {
    duration: 0.6, // 所有补间默认持续 0.6 秒
    ease: "power1.inOut"
  }
});

2. 关键:位置参数 (Position Parameter)

位置参数是添加到时间轴方法(如 tl.to())的最后一个可选参数,用于控制动画相对于前一个动画的开始时间。

参数值含义示例描述
tl.to(..., <数值>)绝对时间点tl.to(..., 1.0)在时间轴播放到 1.0 秒时开始。
tl.to(..., "<")与前一个动画同时开始tl.to(..., "<")实现动画叠加。
tl.to(..., "-=0.2")提前开始tl.to(..., "-=0.2")比前一个动画结束早 0.2 秒开始(重叠)。
tl.to(..., "+=0.5")延迟开始tl.to(..., "+=0.5")比前一个动画结束晚 0.5 秒开始(间隔)。

🎨 实战 Demo:序列化入场动画

以下 Demo 展示了如何使用时间轴和位置参数,让三个方块按序入场,并让文本动画与最后一个方块的移动叠加同步。

HTML 结构 (index.html)

    <style>
  .container {
    display: flex;
    gap: 20px;
    align-items: flex-end;
    height: 150px;
  }
  .box {
    width: 50px;
    height: 50px;
    background-color: #007bff;
    border-radius: 8px;
    /* 初始设置为不可见,让 GSAP 控制入场 */
    opacity: 0; 
  }
  .title {
    font-size: 24px;
    color: #333;
    opacity: 0;
    margin-left: 30px;
  }
</style>

<div class="container">
  <div class="box box-a">A</div>
  <div class="box box-b">B</div>
  <div class="box box-c">C</div>
  <div class="title">GSAP 动画完成!</div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>

JavaScript 代码 (app.js)

    // 1. 创建时间轴实例,并设置默认属性
const introTL = gsap.timeline({
  defaults: {
    duration: 0.4, // 所有动画默认持续 0.4s
    ease: "back.out(1.7)" // 使用回弹缓动效果
  },
  delay: 0.5 // 页面加载后延迟 0.5s 开始整个序列
});

// 2. 序列化动画(按顺序入场)
introTL
  // 步骤 1: 方块 A 从下方入场
  .fromTo(".box-a", 
    { y: 100, opacity: 0 }, 
    { y: 0, opacity: 1 }
  )

  // 步骤 2: 方块 B 紧接着方块 A 之后入场 (默认序列化)
  .fromTo(".box-b", 
    { y: 100, opacity: 0 }, 
    { y: 0, opacity: 1 }
  )

  // 步骤 3: 方块 C 紧接着方块 B 之后入场
  .fromTo(".box-c", 
    { y: 100, opacity: 0 }, 
    { y: 0, opacity: 1 }
  )

  // 步骤 4: 文本动画(同步叠加)
  // 让文本动画与前一个动画(方块 C 的入场)同时开始
  .to(".title", {
    opacity: 1,
    x: 0,
    ease: "power2.out"
  }, "<") // <-- 核心:使用 "<" 使其与前一个动画同时开始

  // 步骤 5: 最终效果(所有入场完成后)
  // 在所有动画完成后,让所有方块一起向上跳动
  .to(".box", {
    y: -15,
    repeat: 1, // 只跳动一次
    yoyo: true, // 来回(跳上去再下来)
    ease: "power1.inOut",
    duration: 0.2
  }, "+=0.3"); // <-- 在前一个动画(文本显示)完成后再延迟 0.3s 开始

运行结果

  • 方块 A 入场。
  • 方块 B 入场。
  • 方块 C 入场,同时 “GSAP 动画完成!” 文本淡入显示。
  • 所有动画完成后,方块整体短暂向上跳动一下。

这个 Demo 完美展示了如何通过 gsap.timeline() 和位置参数 ("<", "+=0.3") 来编排复杂的动画序列。

分享:

2

返回文章列表