引入外部依赖:

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

或 npm 包下载

npm i gsap --save-dev
import { gsap } from 'gsap'
import { ScrollTrigger } from 'gsap/ScrollTrigger'

使用:

gsap.registerPlugin(ScrollTrigger)  // 注册插件

方法:

方法 描述
to 到某个状态
fromTo 从某个状态到某个状态
timeline 时间轴动画,可以按照该实例化进行动画排序执行

实例style展示:

*{
    margin: 0;
    padding: 0;
}
.box {
    height: 100vh;
    background: hotpink;
}

.box4 {
    position: relative;
    height: 100vh;
}
.box2 {
    width: 100vw;
    height: 100vh;
    background: blue;
    position: absolute;
    top: 0;
    z-index: 2;
}

.box3 {
    width: 100vw;
    height: 100vh;
    background: slateblue;
    position: absolute;
    top: 0;
    z-index: 1;
    /* transform: scale(); */
}

.description {
    font-size: 24px;
    color: #fff;
    width: 40vw;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

实例dom展示:

<div class="box"></div>
    <div class="box4">
        <div class="box2">
            <div class="description">
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Porro nihil unde voluptates
                quo illum odio voluptatum suscipit hic obcaecati, reiciendis, eius quibusdam perspiciatis? Temporibus, quos
                nihil. Accusamus minus quisquam perferendis?
            </div>
        </div>
        <div class="box3">
            <div class="description">
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Porro nihil unde voluptates
                quo illum odio voluptatum suscipit hic obcaecati, reiciendis, eius quibusdam perspiciatis? Temporibus, quos
                nihil. Accusamus minus quisquam perferendis?
            </div>
        </div>
    </div>
  <div class="box"></div>

使用一:

// 创建时间轴
const t1  = new timeline({
   scrollTrigger: {
       trigger: '.box4', // 需要监听滑动入可视窗的dom选择器
       start: 'top top', // 动画开始执行的时机,第一个位置和第二个位置重合即动画开始
       end: 'bottom top', // 动画结束时机,第一个位置和第二个位置重合即动画结束
       markers: true, // 是否显示start end 的标识
       scrub: true, // 是否需要绑定滚动条和动画执行关系
       pin: true // 是否需要锁定某个dom在可视区, true固定trigger所指向的dom, 也可配置另外的dom选择器,如 '.box2'
   } 
})

使用二:

// 配置具体的动画步骤

// 当box4到达动画触发时机时 使box2 里面的 description 向上移动100px,用时10s,透明度变为0,使用power1.inout动画曲线
t1.to('.box2 .description', {
    top: -100,
    duration: 10,
    opacity: 0,
    ease: "power1.inOut",
})

// 当上面动画执行完以后执行下面动画,为了保证下面动画和上面动画同时运行,末尾配置'<',关于不同的末尾配置还有不同的含义
// '<' 上一动画开始时同时执行
// '>' 上一动画结束时执行(默认值)
// '<+=秒' 上一动画开始多少秒后执行
// '>-秒' 上一动画结束多少秒后执行
// '-=秒' 比上一动画快多少秒执行
// '+=秒' 比上一动画慢多少秒执行
// 如果传入数值,则延迟多少秒执行
// 无任何后缀则前一动画执行完立马执行
t1.to('.box2', {
    scale: 0.2,
    x: '20%',
    duration: 10,
    opacity: 0,
    ease: "power1.inOut"
}, '<')

// 上面两次t1.to的写法可以缩写为
t1.to(...).to(...).fromTo()
posted on 2023-08-10 16:53  佑之以航  阅读(376)  评论(0编辑  收藏  举报