js
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GSAP Scroll Demo</title>
<style>
body {
margin: 0;
font-family: "Segoe UI", sans-serif;
background: #0b1020;
color: #e2e8f0;
}
section {
height: 100vh;
position: relative;
overflow: hidden;
}
.center-stack {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 80vw;
height: 60vh;
}
.stack-item {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 18px;
opacity: 0.95;
}
.stack-1 { width: 140px; height: 140px; background: #0ea5e9; }
.stack-2 { width: 200px; height: 200px; background: #22c55e; }
.stack-3 { width: 280px; height: 280px; background: #f59e0b; }
.stack-4 { width: 200px; height: 200px; background: #a855f7; }
.stack-5 { width: 140px; height: 140px; background: #ef4444; }
.quad {
position: absolute;
padding: 12px 16px;
border-radius: 10px;
font-size: 20px;
font-weight: 600;
background: #111827;
}
.quad-up { left: 50%; top: 20%; transform: translate(-50%, 0); }
.quad-down { left: 50%; bottom: 20%; transform: translate(-50%, 0); }
.quad-left { left: 12%; top: 50%; transform: translate(0, -50%); }
.quad-right { right: 12%; top: 50%; transform: translate(0, -50%); }
.list {
position: absolute;
left: 10%;
top: 50%;
transform: translateY(-50%);
display: flex;
flex-direction: column;
gap: 16px;
}
.list-item {
width: 140px;
padding: 12px 16px;
border-radius: 10px;
background: #111827;
font-size: 16px;
font-weight: 600;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.1/dist/gsap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.1/dist/ScrollTrigger.min.js"></script>
</head>
<body>
<section id="view-one">
<div class="center-stack">
<div class="stack-item stack-1" id="stack-1"></div>
<div class="stack-item stack-2" id="stack-2"></div>
<div class="stack-item stack-3" id="stack-3"></div>
<div class="stack-item stack-4" id="stack-4"></div>
<div class="stack-item stack-5" id="stack-5"></div>
</div>
</section>
<section id="view-two">
<div class="quad quad-up" id="quad-up">向上</div>
<div class="quad quad-down" id="quad-down">向下</div>
<div class="quad quad-left" id="quad-left">向左</div>
<div class="quad quad-right" id="quad-right">向右</div>
</section>
<section id="view-three">
<div class="list">
<div class="list-item" id="list-1">第一个</div>
<div class="list-item" id="list-2">第二个</div>
<div class="list-item" id="list-3">第三个</div>
</div>
</section>
<script>
gsap.registerPlugin(ScrollTrigger);
// 第一视图
gsap.set(["#stack-1", "#stack-5"], { x: 0 });
gsap.set(["#stack-2", "#stack-4"], { x: 0 });
gsap.set("#stack-3", { x: 0 });
gsap.timeline({
scrollTrigger: {
trigger: "#view-one",
start: "top top",
end: "+=400%",
scrub: true,
pin: true
}
})
.to(["#stack-1", "#stack-5"],{ x:(i) => i === 0 ? -220 : 220, duration: 0.4 })
.to(["#stack-2", "#stack-4"], { x:(i) => i === 0 ? -160 : 160, duration: 0.4 })
// 第二视图
gsap.set(["#quad-up", "#quad-down", "#quad-left", "#quad-right"], { opacity: 0 });
gsap.set("#quad-up", { y: -40 });
gsap.set("#quad-down", { y: 40 });
gsap.set("#quad-left", { x: -40 });
gsap.set("#quad-right", { x: 40 });
gsap.timeline({
scrollTrigger: {
trigger: "#view-two",
start: "top top",
end: "+=400%",
scrub: true,
pin: true
}
})
.to("#quad-up", { y: 0, opacity: 1, duration: 0.25 })
.to("#quad-down", { y: 0, opacity: 1, duration: 0.25 })
.to("#quad-left", { x: 0, opacity: 1, duration: 0.25 })
.to("#quad-right", { x: 0, opacity: 1, duration: 0.25 });
// 第三视图
gsap.set(["#list-1", "#list-2", "#list-3"], { x: 0 });
gsap.timeline({
scrollTrigger: {
trigger: "#view-three",
start: "top top",
end: "+=400%",
scrub: true,
pin: true
}
})
.to("#list-1", { x: 100, duration: 0.33 })
.to("#list-2", { x: 200, duration: 0.33 })
.to("#list-3", { x: 300, duration: 0.33 });
</script>
</body>
</html>
这个cdn是用官网的 如果报错 请使用魔法
js
scrollTrigger: {
trigger: "#element-id", // 触发动画的元素
start: "top top", // 起始位置(元素顶部, 视口顶部)
end: "+=400%", // 结束位置(起始位置+400%视口高度)
scrub: true, // 动画进度与滚动同步
pin: true // 在动画期间固定元素
}
效果就是


依次出现上下左右 文字

然后依次 向右移动
