下面我将从核心原理、实现方法、代码示例和最佳实践四个方面,为你详细讲解如何制作网页主页的滑动动画。

(图片来源网络,侵删)
核心原理:监听滚动事件
所有滚动动画的基础都是监听用户的滚动行为,当用户向下或向上滚动页面时,JavaScript 会捕捉到这个事件,然后根据滚动的距离(通常是 window.scrollY 或 window.pageYOffset)来动态改变页面元素的样式(如位置、透明度、大小等)。
基本流程:
- HTML 结构:将需要做动画的元素用特定的类名包裹起来,
<section class="animate-section">。 - CSS 样式:为这些元素设置初始状态(
opacity: 0; transform: translateY(50px);)和最终状态(opacity: 1; transform: translateY(0);),最终状态通常通过一个.is-visible这样的类来控制。 - JavaScript 逻辑:
- 监听
scroll事件。 - 在滚动时,获取每个动画元素的位置信息(通过
getBoundingClientRect())。 - 判断元素是否已经进入视口(或进入视口的某个百分比)。
- 如果元素进入视口,就给它添加
.is-visible类,触发 CSS 过渡效果,从而产生动画。
- 监听
实现方法
实现滑动动画主要有三种主流方法,从简单到复杂,各有优劣。
纯 CSS (最简单,性能最好)
这是最推荐的方法,适用于简单的淡入、滑入、缩放等动画,它利用了 CSS 的 @media 查询和 scroll-behavior 属性,以及 has() 伪类(现代浏览器支持)。

(图片来源网络,侵删)
核心技术:
scroll-behavior: smooth;:让页面滚动变得平滑。Intersection Observer API:虽然这是 JS API,但现代浏览器支持将其与 CSS 结合,通过has(:hover)或其他方式间接触发,但更常见的是直接用 JS。- 更实用的纯 CSS 方案是使用
scroll-timeline和view-timeline,这是 CSS 官方推出的滚动驱动动画,是未来的趋势。
示例:使用 scroll-timeline (现代浏览器支持)
这个方法可以直接在 CSS 中定义动画,无需 JavaScript,性能极佳。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">CSS 滚动动画</title>
<style>
html {
scroll-behavior: smooth;
}
body {
margin: 0;
font-family: sans-serif;
}
.section {
height: 100vh; /* 每个section占满一屏 */
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
color: white;
}
#section1 { background: #3498db; }
#section2 { background: #2ecc71; }
#section3 { background: #e74c3c; }
/* --- 动画部分 --- */
.animated-box {
width: 200px;
height: 200px;
background: #fff;
border-radius: 10px;
opacity: 0;
transform: translateX(-100px);
/* 定义一个滚动时间线,基于 body 元素的滚动 */
scroll-timeline: --my-timeline inline;
/* 将动画绑定到这个时间线上 */
animation: slide-in 1s linear forwards;
animation-timeline: --my-timeline;
}
/* 定义动画的关键帧 */
@keyframes slide-in {
to {
opacity: 1;
transform: translateX(0);
}
}
</style>
</head>
<body>
<section id="section1">
<h1>滚动页面,查看动画</h1>
</section>
<section id="section2">
<div class="animated-box">我会从左边滑入</div>
</section>
<section id="section3">
<h1>动画完成</h1>
</section>
</body>
</html>
优点:

(图片来源网络,侵删)
- 性能最佳:由浏览器直接处理,不经过 JS 引擎,非常流畅。
- 代码简洁:动画逻辑完全在 CSS 中,易于维护。
缺点:
- 浏览器兼容性:
scroll-timeline是较新的特性,在旧版浏览器(如 Safari)中支持不佳。
JavaScript + CSS (最灵活,兼容性最好)
这是目前最常用、兼容性最广的方法,它结合了 JS 的灵活性和 CSS 的过渡效果。
核心技术:
- Intersection Observer API:现代浏览器提供的 API,用于高效地检测元素是否进入视口,它比传统的
scroll事件监听性能好得多。 - CSS
transition属性:用于定义样式变化时的平滑过渡效果。
示例:使用 Intersection Observer API
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">JS + CSS 滚动动画</title>
<style>
body {
margin: 0;
font-family: sans-serif;
}
.section {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
color: white;
}
#section1 { background: #3498db; }
#section2 { background: #2ecc71; }
#section3 { background: #e74c3c; }
/* --- 动画元素初始状态 --- */
.fade-in-box {
width: 200px;
height: 200px;
background: #fff;
border-radius: 10px;
opacity: 0;
transform: translateY(50px);
transition: opacity 0.8s ease-out, transform 0.8s ease-out;
}
/* --- 当元素进入视口时,添加这个类 --- */
.fade-in-box.is-visible {
opacity: 1;
transform: translateY(0);
}
</style>
</head>
<body>
<section id="section1">
<h1>滚动页面</h1>
</section>
<section id="section2">
<div class="fade-in-box">我会从下方淡入</div>
</section>
<section id="section3">
<h1>动画完成</h1>
</section>
<script>
document.addEventListener('DOMContentLoaded', function() {
// 1. 获取所有需要动画的元素
const animatedElements = document.querySelectorAll('.fade-in-box');
// 2. 创建 Intersection Observer 实例
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
// 3. 检查元素是否进入视口
if (entry.isIntersecting) {
// 4. 如果进入,添加 'is-visible' 类
entry.target.classList.add('is-visible');
// 可选:一旦动画完成,就停止观察该元素,节省性能
observer.unobserve(entry.target);
}
});
}, {
// 可以配置选项,比如触发动画的阈值
threshold: 0.1 // 当元素 10% 可见时触发
});
// 5. 开始观察每个元素
animatedElements.forEach(element => {
observer.observe(element);
});
});
</script>
</body>
</html>
优点:
- 兼容性好:Intersection Observer 在所有现代浏览器中都有良好支持。
- 非常灵活:可以轻松实现复杂的动画逻辑,比如视差效果、延迟触发等。
- 性能良好:Intersection Observer 比传统的
scroll事件监听高效得多。
缺点:
- 需要编写一些 JavaScript 代码。
使用专业库 (最省力,功能强大)
如果你不想写太多代码,或者需要非常炫酷的复杂效果,使用现成的库是最好的选择。
推荐库:
-
AOS (Animate On Scroll):
- 特点:轻量级、简单易用、效果丰富,只需给元素加
data-aos="fade-up"这样的属性即可。 - 适用场景:快速实现各种滚动触发的基础动画。
- 特点:轻量级、简单易用、效果丰富,只需给元素加
-
GSAP (GreenSock Animation Platform):
- 特点:业界顶级的动画库,功能极其强大,性能卓越,除了滚动动画,还能做任何你能想到的动画。
- 适用场景:复杂的、高性能的、需要精细控制的动画项目,特别是结合 ScrollTrigger 插件时。
示例:使用 AOS 库
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">AOS 滚动动画</title>
<!-- 1. 引入 AOS 的 CSS 和 JS -->
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<style>
body {
margin: 0;
font-family: sans-serif;
}
.section {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
color: white;
}
#section1 { background: #3498db; }
#section2 { background: #2ecc71; }
#section3 { background: #e74c3c; }
.aos-box {
width: 200px;
height: 200px;
background: #fff;
border-radius: 10px;
}
</style>
</head>
<body>
<section id="section1">
<h1>滚动页面</h1>
</section>
<section id="section2">
<!-- 2. 给元素添加 AOS 的 data-* 属性 -->
<div class="aos-box" data-aos="fade-up" data-aos-duration="1000"></div>
</section>
<section id="section3">
<h1>动画完成</h1>
</section>
<script>
// 3. 初始化 AOS
AOS.init();
</script>
</body>
</html>
优点:
- 快速开发:几行代码就能实现丰富的效果。
- 效果多样:库中内置了大量预设动画。
- 社区支持好:遇到问题容易找到解决方案。
缺点:
- 增加体积:需要引入外部库,会增加页面加载体积。
- 灵活性受限:虽然库很强大,但有时不如自己写代码灵活。
最佳实践与注意事项
-
性能优先:
- 避免频繁重绘/回流:动画应尽量使用
transform(如translate,scale,rotate) 和opacity属性,因为这些属性不会引起页面的重排,性能开销小。 - 使用
will-change:对于复杂的动画元素,可以添加will-change: transform, opacity;提前告知浏览器,让浏览器为该元素创建独立的图层进行渲染,提升性能,但不要滥用,否则会占用大量内存。 - 硬件加速:
transform和opacity通常会自动触发 GPU 加速。
- 避免频繁重绘/回流:动画应尽量使用
-
不要过度使用:
- 动画是为了引导用户、突出重点、提升体验,而不是让用户眼花缭乱,过多的动画会分散注意力,甚至引起眩晕。
- 保持动画的简洁和克制。
-
考虑移动设备:
- 确保动画在移动设备上也能流畅运行,复杂的动画可能会消耗过多电量。
- 可以通过媒体查询 (
@media) 为不同设备设置不同的动画效果或关闭动画。
-
可访问性 (Accessibility):
- 动画不应干扰到用户获取信息,对于有运动障碍或使用屏幕阅读器的用户,动画可能会造成困扰。
- 提供一个“减少动画”的选项,让用户可以关闭页面动画。
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 纯 CSS | 性能最佳,代码简洁 | 兼容性较差,灵活性低 | 现代项目,追求极致性能和简洁代码 |
| JS + CSS | 兼容性好,非常灵活,性能良好 | 需要编写 JS | 绝大多数项目的首选,平衡了性能与灵活性 |
| 专业库 | 开发快速,效果丰富 | 增加体积,灵活性受限 | 快速原型、项目时间紧、需要复杂效果 |
对于初学者或大多数项目,强烈推荐使用“方法二:JavaScript + CSS”,它提供了一个完美的平衡点,如果你是新手,可以先从“方法三:使用专业库”开始,快速做出效果,然后再逐步学习底层原理。
