滚动浮现动画需用 IntersectionObserver 触发 CSS 类添加,@keyframes 定义 opacity 0→1 和 translateY(20px)→0,配合 forwards 保持终态,避免内联样式覆盖、动画名错误或父容器 overflow 隐藏导致失效。
用
控制 opacity 和 translateY 实现滚动浮现
滚动时文字逐渐浮现,本质不是“自动触发”,而是结合
或滚动监听 + CSS 动画类切换。纯 CSS 无法感知滚动位置,必须靠 JS 判断元素是否进入视口,再添加动画类。
关键点:动画本身用
定义,但「何时播放」由 JS 控制。否则所有元素
一加
载就动,或完全不动。
从 0 → 1 控制透明度渐显
从 20px → 0 避免文字突兀跳入(比
更自然)
动画需设
,否则结束后会回退到初始状态
用
触发动画类添加
比
性能更好,避免频繁重排
重绘
。只在元素进入视口时加类,且可设
控制触发时机(如 0.1 表示 10% 进入即触发)。
每个目标元素只监听一次,首次进入后可调用
防止重复执行
若需「反复进出都动画」,去掉
,但要加判断避免重复添加类
注意:Safari 旧版本需 polyfill,
在 iOS 12.2+ 原生支持
常见失效原因:CSS 动画不播放
即使 JS 正确添加了类,动画也可能不执行。最常踩的坑是:
elasticsearch-9.4.0 win
PHP中文网提供Elasticsearch 9.4.0 Windows 版本压缩包下载解压即用,内置 OpenJDK 无需额外配置 Java 环境。该版本重磅推出原生 Prometheus 支持、正式版 Elastic Workflows 以及基于 NVIDIA cuVS 的 GPU 加速向量索引,大幅提升 AI 检索与可观测性能力。建议前往官网下载,快速体验极速搜索与强大的数据分析功能。
下载
立即学习
“
前端免费学习笔记(深入)
”;
元素已有
和
内联样式,覆盖了 class 中的初始值 → 移除内联样式,或用
(不推荐),优先改结构
动画名拼错,比如写成
而非
→ 检查控制台是否有
类警告
未设置
→ 动画播完立刻回退,看起来像没动
父容器有
且元素初始位置在裁剪区外 → 确保
不被截断,或临时加
协助定位
移动端适配
与性能注意点
在 iOS Safari 或低端
安卓
机上,
和
是唯二能
硬件加速
的属性。其他如
、
触发动画会卡顿。
务必用
,不要用
或
避免同时对大量元素启用 observer,可加防抖或分批 observe
若页面内容极长,考虑用
扩大触发区域(如
),让动画提前开始,减少“追着滚条跑”的感觉
测试真机:
模拟器
常掩盖渲染延迟,iOS 上尤其要注意
的滥用(仅在必要时加)
动画真正起效的临界点,往往卡在「JS 判断进视口」和「CSS 动画定义是否可被继承/覆盖」这两处。前者看 observer 配置,后者看开发者工具里 computed 样式里
是否生效——别只盯着元素面板里的 class。
@keyframesIntersectionObserver@keyframesopacitytransform: translateY()translateY(0)forwards@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in-up {
opacity: 0;
transform: translateY(20px);
animation: fadeInUp 0.6s ease-out forwards;
}IntersectionObserverwindow.addEventListener('scroll')thresholdunobserve()unobserve()IntersectionObserverconst observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('fade-in-up');
observer.unobserve(entry.target); // 只触发一次
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.js-fade').forEach(el => observer.observe(el));opacity: 0transform: translateY(20px)!importantfadeInupfadeInUpInvalid property valueanimation-fill-mode: forwardsoverflow: hiddentranslateY(20px)margin-top: -20pxtransformopacityheightmargintransform: translateY()topmargin-toprootMargin'100px'will-change: transformanimation