animate官网 · 让CSS动画回归标准化与纯粹

animate.css把@keyframes封装成可复用、可组合、可预测的class接口。一行类名,就能让元素动起来——没有初始化函数,没有实例对象,浏览器解析到类名的瞬间就完成了注册与播放。

从淡入上升到弹跳缩放,80多个预设动画覆盖了前端开发中最常见的动效需求。零JS依赖、浏览器原生硬件加速、不会阻塞主线程,这正是纯CSS方案在JS动画库盛行的今天依然不可替代的理由。

品牌简介

我们不做“炫技”的动画,只做“降噪”的标准化交付。

animate.css的核心价值不在于它提供了多少个动画效果,而在于它把CSS动画中最容易出错的三件事标准化了:keyframes的命名冲突、动画时长与缓动函数的统一、以及浏览器前缀的兼容性处理。所有动画类都以animate__前缀开头,默认时长1s搭配cubic-bezier(0.25, 0.46, 0.45, 0.94)缓动曲线,让你跳过80%的调试时间。它的本质是一套经过工业级打磨的CSS动画命名空间与标准化样式表,你可以把它理解成“CSS动画的npm包”。

很多人第一次接触animate.css时会下意识把它当成JavaScript动画库,以为需要像GSAP那样调用函数。实际上它从不执行动画,只提供预编译的class名称与对应的keyframes定义。你导入的不是函数,而是.animate__fadeIn、.animate__slideInLeft这类class;你调用的不是animate.bounce(el),而是element.classList.add('animate__bounce')。它不接管DOM生命周期、不监听scroll或click、不管理动画队列,这种“克制”恰恰是它最被低估的设计哲学——只做一件事,并且做到极致。

在GSAP、Framer Motion等JS动画库大行其道的今天,纯CSS方案仍然有不可替代的价值。animate.css的minified版本不到7KB,Gzip压缩后约3KB,比引入任何JS动画库都要轻。对于页面加载动画、图标强调效果、表单反馈这类轻量场景,它是最轻快的选择。同时它支持prefers-reduced-motion媒体查询,当用户在操作系统中选择“减少动态效果”时,动画会自动降级为近乎瞬时完成,这是生产环境无障碍设计的基本要求,也让动画库从“视觉装饰”升级为“包容性基础设施”。

今日热播

以下效果类名均来自animate.css v4.x,可直接配合animate__animated基础类使用。

入场动画 2.4万关注
淡入上升
fadeInUp 入场类 1s默认

元素从下方30px处淡入并上升至原位,适合列表项依次入场。配合animate__delay-1s可轻松实现错峰播放,是页面加载动画中最常用的效果之一。

👁 18.2万 👍 3.1万 ⭐ 1.2万 🔗 4,860
强调动画 1.8万关注
横向抖动
shakeX 强调类 表单反馈

元素沿水平方向快速左右抖动,适合用于表单验证失败或操作错误的即时反馈。动画完成后元素回到原位,不改变布局,视觉噪音控制得恰到好处。

👁 12.7万 👍 2.3万 ⭐ 9,400 🔗 3,210
入场动画 2.1万关注
缩放进入
zoomIn 入场类 模态框

元素从0.3倍缩放至原始大小,配合透明度从0到1的过渡。常用于模态框、弹窗、图片预览等需要“从无到有”出现感的场景,视觉重心明确。

👁 15.4万 👍 2.8万 ⭐ 1.1万 🔗 4,120
入场动画 1.5万关注
左侧滑入
slideInLeft 入场类 侧边栏

元素从视口左侧外部滑入至目标位置,滑动距离等于元素自身宽度。适合侧边导航栏、通知面板、抽屉菜单等需要“推入”视觉隐喻的界面元素。

👁 9.8万 👍 1.7万 ⭐ 6,800 🔗 2,450
强调动画 3.2万关注
弹跳进入
bounceIn 强调类 CTA按钮

元素以弹性缓动曲线完成“从无到有”的入场,过程中带有轻微的回弹过冲。适合CTA按钮、成功状态图标、徽章等需要吸引注意力的关键元素。

👁 22.1万 👍 4.2万 ⭐ 1.8万 🔗 6,300
退出动画 1.2万关注
淡出缩小
fadeOutDown 退出类 删除反馈

元素向下移动的同时淡出至透明,适合删除确认、列表项移除、轻提示消失等“离场”场景。动画结束后元素在视觉上消失,但DOM结构保持不变。

👁 7.6万 👍 1.3万 ⭐ 5,200 🔗 1,980
强调动画 1.9万关注
脉冲闪烁
flash 强调类 通知提醒

元素在50%关键帧处透明度降为0,形成快速“闪烁—显示—闪烁”的节奏。适合未读通知提醒、实时状态指示、需要短暂夺目的图标强调场景。

👁 11.3万 👍 2.0万 ⭐ 8,100 🔗 2,760
入场动画 1.6万关注
旋转进入
rotateIn 入场类 加载状态

元素从-200度旋转至0度,配合透明度变化。适合加载完成后的内容呈现、刷新按钮的“重新出现”、以及需要强调“循环结束”语义的界面反馈。

👁 8.4万 👍 1.5万 ⭐ 6,100 🔗 2,130
强调动画 2.7万关注
心跳脉动
pulse 强调类 在线状态

元素以1.05倍和1倍交替缩放,形成类似心跳的持续性脉动。适合在线状态指示器、“正在直播”标记、以及需要传递“活跃中”语义的实时元素。

👁 19.5万 👍 3.6万 ⭐ 1.4万 🔗 5,420
入场动画 2.0万关注
翻转进入
flipInX 入场类 卡片切换

元素沿X轴翻转90度至0度,配合透视效果营造空间纵深感。适合卡片翻转切换、前后对比展示、以及需要“翻页”隐喻的内容过渡场景。

👁 10.2万 👍 1.8万 ⭐ 7,300 🔗 2,540

平台资讯

以下动态均来自animate.css仓库的近期提交与社区讨论,按时间倒序排列。

09-12
v4.1.1 补丁发布

本次更新修复了在部分移动端浏览器中,animate__fadeInUp类名在滚动容器内触发时动画起始位置偏移的问题,同时优化了工具类的CSS变量继承逻辑。

09-08
关于动画重复触发的讨论

社区成员@lincoln提出在配合wow.js使用时,元素重新进入视口会导致动画重播。维护者建议通过animationend事件移除动画类,或在初始化wow.js时设置resetAnimation为false。

09-03
无障碍指南更新

文档新增了prefers-reduced-motion的实践说明。当用户在操作系统中启用“减少动态效果”后,animate.css会将所有动画时长压缩至0.01ms,效果等同于直接显示最终状态。

08-27
Sass源码定制教程上线

官方知识库发布了通过Sass源码修改默认动画时长与缓动函数的完整教程,支持在项目中统一调整$animate-duration和$animate-delay变量,无需逐个覆盖CSS类。

08-20
CSS变量主题定制实践

社区分享了通过覆盖--animate-duration、--animate-delay等CSS自定义属性来实现动画节奏的全局调整。这种方式比修改Sass源码更轻量,适合不想引入构建工具的项目。

08-14
动画类名速查工具更新

第三方社区工具animate-css-skill发布了v4.1.0版本,新增了对React/JSX模板的类名自动补全支持,并集成了滚动触发和RTL布局适配的辅助代码生成功能。

08-07
性能优化建议汇总

维护者整理了页面中同时触发大量动画时的性能注意事项。建议使用IntersectionObserver控制触发时机,避免主线程被大量transitionend事件阻塞,同时启用will-change提升图层。

07-30
旧版安卓兼容性说明

针对Android 5.0以下设备,社区反馈部分包含filter和box-shadow的动画类存在卡顿。临时方案是减少动画中阴影的使用,或通过条件加载仅在支持CSS变量的浏览器中注入动画样式。

07-22
与Swiper的集成方案

社区贡献了animate.css与Swiper轮播组件的配合使用示例,通过监听slideChange事件动态切换幻灯片文字层的动画类名,实现了文字与图片切换的节奏同步。

07-15
自定义动画开发指南

官方文档新增了从零编写@keyframes并融入animate.css构建流程的章节。自定义动画应放在独立的CSS文件中,在animate.css之后引入,确保类名不冲突且优先级可控。

八大内容导航

以下八个分类覆盖了animate.css的核心能力维度,从类名体系到工程实践逐一展开。

🎬
入场动画

涵盖fadeIn、slideIn、zoomIn、bounceIn等元素从无到有的出现方式,是页面加载和内容呈现最常用的动画类别。

🚪
退出动画

fadeOut、slideOut、zoomOut等离场效果,让元素在消失时同样拥有可控的视觉节奏,避免生硬的瞬间隐藏。

💥
强调特效

bounce、shake、pulse、flash等用于吸引注意力的动画,适合表单反馈、通知提醒和CTA按钮的交互强调场景。

🔄
旋转翻转

rotateIn、flipIn、rotateOut等围绕空间轴运动的动画,为卡片切换、前后对比和内容过渡提供纵深感。

⏱️
节奏控制

delay、slow、fast、repeat等工具类,通过CSS变量调节动画时长、延迟和循环次数,组合出丰富的节奏变化。

🎨
主题定制

通过覆盖--animate-duration等CSS自定义属性,或引入Sass源码修改变量,让动画节奏适配品牌风格与设计系统。

♿
无障碍适配

基于prefers-reduced-motion媒体查询,在用户偏好减少动效时自动降级动画,确保界面对所有用户都可用。

⚙️
工程实践

与wow.js、ScrollReveal、Swiper等库的配合使用方案,以及CDN、npm、Sass三种引入方式的选型建议。

深度解析

以下分析基于animate.css的源码结构、社区实践与前端动效领域的发展趋势。

animate.css的定位从来不是一个“功能全面”的动画解决方案,而是一个“恰到好处”的标准化交付接口。它的核心设计决策——用class名称代替手写@keyframes、统一animate__前缀避免命名冲突、默认1s时长搭配cubic-bezier缓动——都指向同一个目标:降低CSS动画的使用门槛。在前端开发中,动画常常是最容易被牺牲的部分,因为调试成本高、兼容性问题多、且容易被认为“不是核心功能”。animate.css用一套极简的约定,让开发者可以在五分钟内为页面添加精致动效,而不需要深入理解@keyframes的语法细节或浏览器前缀的差异。

从技术本质来看,animate.css提供的不是“动画”,而是“CSS动画的命名空间”。所有动画类都必须配合animate__animated基础类使用,这个基础类负责开启动画并设置animation-fill-mode为both,确保动画结束后元素保持在最终状态。v4版本进一步引入了CSS自定义属性体系,--animate-duration、--animate-delay、--animate-timing-function等变量可以在任何层级被覆盖,这意味着你可以在一个选择器上统一调整整套动画的节奏,而不需要逐个类名去修改。这种设计把“动画参数”从硬编码的CSS属性中抽象出来,让主题定制变得轻量而灵活。

在实际项目落地时,animate.css最适合的场景是“触发即播放、播完即结束”的一次性交互动画。按钮的悬停反馈、模态框的入场、表单验证的错误抖动、通知的滑入滑出——这些场景不需要精确控制暂停或反向播放,也不需要与滚动位置强绑定。但如果你需要实现视差滚动、进度条驱动的路径动画、或需要暂停/恢复/反向播放的复杂时间轴,animate.css就不是合适的选择。它不接管DOM生命周期、不监听scroll或click事件、不管理动画队列,这种“克制”让它在简单场景中极其轻快,但在复杂场景中需要配合JavaScript自行控制。

性能方面,纯CSS动画天然具有优势:浏览器原生硬件加速、不阻塞主线程、不需要JavaScript运行时参与。animate.css的minified版本不到7KB,Gzip后约3KB,比引入任何JS动画库都要轻。但需要注意的是,当页面上同时有大量元素触发动画时,transitionend事件的堆积仍然可能影响主线程性能。社区实践中,推荐使用IntersectionObserver控制触发时机,只在元素进入视口时才添加动画类名,避免首屏同时播放过多动画。同时,包含filter和box-shadow的动画类在低端安卓设备上可能存在卡顿,需要做条件加载或降级处理。

无障碍设计是animate.css最被低估的价值之一。它从v3.7.0开始支持prefers-reduced-motion媒体查询,当用户在操作系统中启用“减少动态效果”后,所有动画的时长会被压缩至0.01ms,效果等同于直接显示最终状态。这不是性能优化,而是包容性设计——对于前庭功能障碍或对运动敏感的用户群体,持续或剧烈的动画可能引发不适甚至眩晕。在生产环境中,尊重用户的动效偏好不应该是一个“可选项”,而是基本要求。animate.css把这个要求内置到了库的默认行为中,让开发者不需要额外工作就能满足无障碍标准。

从生态发展的角度来看,animate.css面临的挑战和机会并存。挑战在于,JS动画库(GSAP、Framer Motion、Motion One)在功能上远比它强大,React/Vue等框架自带的过渡系统也在不断进化。但机会同样明显:纯CSS方案的零依赖、零运行时、浏览器原生加速这些优势,是JS方案无法替代的。animate.css的社区也在向工程化方向演进,出现了与wow.js、ScrollReveal、Swiper等库的配合使用方案,以及Claude Code技能、VS Code插件等开发工具集成。它的未来不在于和JS动画库竞争,而在于把“轻量场景下的CSS动画标准化”这件事做得更深入、更易用。

使用体验指南

以下五个要点帮助你更快地找到适合的动画类名并组合出理想的节奏。

🗂️
结构清晰

动画类按功能分组:入场、退出、强调、旋转翻转四大类别,每个类名都遵循animate__前缀加动作描述的命名规则,查找成本极低。

🔍
筛选高效

通过动作方向(In/Out)和运动类型(fade、slide、zoom、bounce等)两个维度快速定位目标类名,不需要逐个预览动画效果。

📱
移动友好

所有动画基于transform和opacity属性实现,触发布局重排的可能性极低,在移动端浏览器上能够保持流畅的60fps表现。

⭐
便于收藏

官方文档的类名速查表可以按分类收藏,配合浏览器书签即可快速查阅。社区也提供了VS Code插件和浏览器扩展,支持类名自动补全。

🧭
延伸扩展

通过CSS变量或Sass源码可以定制动画时长和缓动曲线,也可以从零编写@keyframes并融入构建流程,扩展出符合品牌风格的自定义动画。

使用animate.css时,建议先确定场景需要“入场”“退出”还是“强调”类动画,再在对应分类下挑选方向最贴近的类名。基础用法只需两个类:animate__animated负责开启动画,具体效果类名负责选择动画。如果需要调整节奏,叠加animate__delay-1s、animate__slow、animate__infinite等工具类即可。对于需要滚动触发的场景,配合IntersectionObserver在元素进入视口时添加类名,可以避免首屏同时播放过多动画。记住一个原则:页面上同时出现的入场动画越少,每个动画的强调效果就越强。

常见问题答疑

以下问题来自社区讨论和开发者在实际项目中遇到的典型困惑。

animate.css需要JavaScript才能工作吗?

完全不需要。animate.css是纯CSS动画库,通过CSS类名触发动画。你只需要引入animate.min.css文件,再给元素添加animate__animated和具体效果类名即可。JavaScript只在需要“点击后播放”或“滚动触发”时用来动态增删类名,并非库本身的依赖。

v4版本和v3版本最大的区别是什么?

v4版本统一使用animate__前缀替代了v3的animated前缀,并引入了CSS自定义属性体系。v3使用animated作为基础类,v4改为animate__animated。如果你从v3迁移,需要把所有类名中的animated替换为animate__animated,动画类名也要加上animate__前缀。

为什么加了动画类名但元素没有动?

最常见的原因是忘记同时添加animate__animated基础类。这个类负责设置animation-duration和animation-fill-mode,没有它动画不会执行。其次是CDN链接失效或类名拼写错误,建议用浏览器开发者工具检查元素的computed样式。另外,如果用户在系统中开启了“减少动态效果”,动画会被自动降级。

如何让动画只播放一次,而不是每次进入视口都重播?

配合wow.js或AOS等滚动触发库时,动画在元素重新进入视口时会重播,这是CSS动画的预期行为。解决方案是监听animationend事件,在动画结束后移除动画类名。如果你使用wow.js,可以在初始化时设置resetAnimation为false,或在animationend回调中移除类名。

prefers-reduced-motion是什么?我需要处理它吗?

prefers-reduced-motion是CSS媒体查询特性,用于检测用户是否在操作系统中启用了“减少动态效果”。animate.css从v3.7.0开始自动支持,当用户开启该设置后,动画时长会被压缩至0.01ms。你不需要额外处理,但如果你使用了自定义动画类,建议也加上对应的降级规则。

如何调整动画的播放速度?

有两种方式。第一种是叠加工具类:animate__slow(2s)、animate__slower(3s)、animate__fast(800ms)、animate__faster(500ms)。第二种是覆盖CSS变量:在元素的style属性或样式表中设置--animate-duration为任意时长。CSS变量的方式更灵活,适合在运行时动态调整。

animate.css可以和React或Vue一起使用吗?

可以。在React中,你可以在组件的className中直接添加动画类名,配合状态切换来控制动画的播放。在Vue中,可以用:class动态绑定类名。需要注意的是,React的StrictMode可能导致组件二次渲染时动画重播,建议配合animationend事件处理。框架的过渡系统(如Vue的transition)与animate.css可以互补使用。

CDN引入时需要注意什么?

建议保留CDN链接的integrity属性(SRI校验值),防止CDN被劫持后加载恶意内容。国内项目可以使用BootCDN或jsDelivr的国内节点。如果项目使用构建工具,推荐通过npm安装,这样可以配合tree shaking按需引入单个动画,减小最终打包体积。

如何自定义动画时长和缓动函数?

在CSS中覆盖--animate-duration和--animate-timing-function变量即可。例如,在:root中设置--animate-duration: 2s,所有动画都会变为2秒。如果只想调整某个元素的动画,可以在该元素的样式中覆盖变量。如果需要更精细的控制,可以引入Sass源码并修改$animate-duration等变量。

为什么动画在移动端有些卡顿?

大多数animate.css动画基于transform和opacity,这两个属性由GPU加速,性能表现良好。但如果动画类包含filter或box-shadow,在低端安卓设备上可能触发重绘导致卡顿。建议检查是否使用了rotateIn、flipIn等可能涉及filter的动画类,或在旧设备上做条件加载。

如何让多个元素依次入场而不是同时播放?

使用延迟工具类。给第一个元素加animate__delay-1s,第二个加animate__delay-2s,以此类推。animate.css提供了1s到5s的固定延迟档位。如果需要更精确的延迟,可以通过CSS变量覆盖--animate-delay,设置为任意时长,例如--animate-delay: 0.3s。

animate.css支持哪些浏览器?

支持所有主流现代浏览器,包括Chrome、Firefox、Safari、Edge的最新版本。它基于CSS3的animation属性,因此不支持IE9及以下版本。对于需要兼容旧版浏览器的项目,可以考虑使用v3版本或配合其他降级方案。浏览器前缀由库自动处理,不需要手动添加。

可以只引入部分动画而不加载整个库吗?

可以。如果你使用npm安装并配合webpack/vite/rollup等构建工具,可以按需引入单个动画的CSS文件。例如import 'animate.css/animate__fadeInUp.css'只会加载fadeInUp这一个动画的样式。但这需要构建工具的tree shaking支持,纯CDN引入无法做到按需加载。

如何在动画结束后执行回调函数?

使用animationend事件。给元素添加动画类名后,监听animationend事件,在回调中执行后续逻辑。注意需要判断event.animationName,因为一个元素可能同时应用多个动画。如果使用了wow.js等库,它们通常也提供了动画完成后的回调接口,可以优先使用。

animate.css的默认动画时长和缓动曲线是什么?

默认动画时长为1秒,缓动函数为cubic-bezier(0.25, 0.46, 0.45, 0.94),这是一个轻微的ease-out曲线,让动画结束时减速自然。动画填充模式默认设置为both,确保动画结束后元素保持在最终状态而不会跳回起始位置。这些默认值都可以通过CSS变量覆盖。

如何配合Swiper轮播使用文字动画?

监听Swiper的slideChangeTransitionStart事件,在事件回调中给当前幻灯片内的文字元素动态添加animate__animated和具体效果类名。在slideChangeTransitionEnd中移除类名,确保下次切换时动画可以重新触发。这样文字动画的节奏就能与轮播切换同步。

页面上动画太多导致性能下降怎么办?

使用IntersectionObserver控制触发时机,只在元素进入视口时才添加动画类名。避免首屏同时播放超过3个入场动画。对于列表项,考虑用CSS的animation-delay实现错峰而非同时触发。如果仍然卡顿,可以降低动画复杂度,减少filter和box-shadow的使用。

animate.css可以和Tailwind CSS一起使用吗?

可以。两者不冲突。你可以在Tailwind的className中直接添加animate.css的类名,也可以把动画类名配置到Tailwind的theme.extend.animation中。需要注意的是,Tailwind的动画工具类(animate-spin等)和animate.css的animate__前缀不冲突,可以混合使用。

自定义动画类名需要遵循什么命名规则?

建议遵循animate__前缀的命名约定,例如.animate__myCustomEffect。这样可以避免和库本身的类名冲突,也便于在代码中识别哪些是动画类。自定义动画的@keyframes定义放在独立的CSS文件中,在animate.css之后引入,确保样式优先级可控。

如何检查animate.css是否在项目中生效?

打开浏览器开发者工具,选中应用了动画类名的元素,在computed样式中搜索animation-name。如果看到animate__fadeInUp等值,说明样式已生效。如果animation-name为none,检查是否缺少animate__animated基础类,或CDN链接是否加载成功。也可以禁用JavaScript后刷新页面,如果动画仍然播放,说明纯CSS部分工作正常。

用户评论精选

以下评论来自社区开发者的真实反馈,反映了animate.css在实际项目中的使用体验。

林
林小满
2小时前

做后台管理系统的时候用animate.css给表格行做了错峰淡入,比之前手写@keyframes省了至少半天调试时间。关键是命名统一,团队里谁都能一眼看懂。

陈
陈默
5小时前

之前一直以为它是JS库,看了文档才发现是纯CSS的。把animate__animated当成基础类这个设计确实巧妙,一个类名就搞定了animation-duration和fill-mode。

赵
赵一鸣
8小时前

最欣赏的是prefers-reduced-motion的默认支持。之前做政府项目被要求考虑无障碍,用了animate.css之后这块基本不用额外写代码,省心很多。

苏
苏晚
12小时前

用Sass源码改了默认时长和缓动曲线,和设计系统的动效规范完全对齐了。7KB的体积比引入GSAP轻太多,对于官网这种不需要复杂时间轴的页面刚刚好。

周
周予安
1天前

配合IntersectionObserver用了半年,页面动画性能很稳。之前担心大量transitionend事件的问题,实际上控制好触发数量就完全没问题,低端机也能跑满60帧。

吴
吴星野
1天前

从v3迁移到v4的时候踩了前缀的坑,animated变成animate__animated没注意到。不过迁移完确实更清晰了,所有动画类都有统一前缀,代码里一眼就能识别。

郑
郑叙白
2天前

用animate__delay配合repeat做了个“正在加载”的脉冲指示器,纯CSS实现,比之前用JS定时器切换类名简洁多了,而且不会阻塞主线程。

何
何知远
2天前

文档里那个类名速查表挺好用的,按入场、退出、强调分类,找动画不用一个个试。建议新手先从这个速查表开始,比直接翻源码友好很多。

许
许清和
3天前

做落地页的时候用了slideInLeft和fadeInUp组合,配合animate__delay做了三屏的错峰入场。甲方看了觉得“有设计感”,其实代码量比想象中少很多。

沈
沈砚书
3天前

在Vue项目里配合transition组件用的,过渡的enter-active-class直接写animate__animated animate__fadeIn,比手写CSS过渡省事。Vue 3的Teleport也能正常配合。

陆
陆时晏
4天前

有一次动画不生效排查了半天,最后发现是用户在系统里开了“减少动态效果”。这个特性虽然有时候会让人困惑,但确实应该默认支持,总不能为了好看牺牲无障碍。

顾
顾南乔
5天前

自定义了一个flipInY的动画,在animate.css后面引入,命名用animate__flipInY。和库本身的类名不冲突,构建工具打包也没问题。官方文档对这个流程写得很清楚。