还在手写动画吗,这3个CSS库该看看了

1、Primer 的 anim-pulse 动画(Pulse)

Primer 提供了一组可复用的动画工具类,其中 anim-pulse 会让元素做"轻微放大/缩小或淡入淡出"的循环脉冲效果,常用于吸引注意力或作为骨架加载(skeleton)/提示性的强调动画。Storybook 上有交互示例可以直接预览。primer.style

1.1、核心用法

Primer 已经把动画封装成类,使用非常直接:

xml 复制代码
<!-- 直接给元素加类名 -->
<button class="btn anim-pulse">正在加载...</button>

<!-- 或者在占位骨架上 -->
<div class="anim-pulse" style="width:200px;height:16px;border-radius:4px;background:#e6e6e6;"></div>

根据 Primer 的样式表,.anim-pulse 对应的动画属性大致为:animation-name: pulse; animation-duration: 2s; animation-timing-function: linear; animation-iteration-count: infinite;,也可以在 cheatsheet 里看到这些具体值。zeke.github.io

1.2、为什么用而且什么时候用

  • 用途 :骨架加载、需要引导用户注意某个 UI 元素(但不希望过于刺激)、微妙的提示(例如待办项标记、未读角标引导)等等。Primer 的动画系列就是为"强调但不喧宾夺主"设计的。primer.style
  • 优点 :用类即可上手,无需自己写 @keyframes,与 Primer 其它 util 类容易组合(spacing、颜色等)。primer.style

1.3、可访问性与最佳实践

  • 尊重用户偏好 :需考虑 prefers-reduced-motion。很多用户(或因晕动不适)在操作系统里开启了"减少动态"设置,正确做法是当检测到该偏好时禁用或降低动画强度。可在 CSS 中用 @media (prefers-reduced-motion: reduce) { .anim-pulse { animation: none; } } 来处理。把这点写成提示/代码片段并强调其重要性,会让你的文章更专业。MDN Web Docs+1
  • 动画语义 :如果动画仅用于装饰,应确保对屏幕阅读器隐藏(例如 aria-hidden="true"),或不要把重要信息只靠动画传达。
  • 加载指示器例外 :某些情况下(比如加载指示器)Primer 文档建议保留微妙动画以传达"正在进行中"的状态,但仍要保持低强度与谨慎使用。primer.style

1.4、与其他工具库快速对比

  • Tailwind 的 animate-pulse :概念类似,都是提供开箱即用的脉冲工具类;Tailwind 使用 animate-pulse 并常合并其 animate-* 体系。差别主要在命名空间/生态 (你用的是 Primer 组件和设计体系还是 Tailwind);如果读者同时使用两者,可以举例对比 HTML/类名,或说明如何替换。示例(Tailwind)可参考官方文档。Tailwind CSS

1.5、示例代码

xml 复制代码
<link rel="stylesheet" href="https://unpkg.com/@primer/css@latest/dist/primer.css">

<style>
/* 若你还想自定义强度/时长,可以覆写 */
.custom-pulse {
  /* 例如缩短周期并加些透明度变化 */
  animation-duration: 1.4s;
  animation-timing-function: ease-in-out;
}

/* 尊重系统偏好:减少动画 */
@media (prefers-reduced-motion: reduce) {
  .anim-pulse,
  .custom-pulse {
    animation: none !important;
  }
}
</style>

<div class="Box p-3">
  <h3>消息</h3>
  <div class="anim-pulse" aria-hidden="true" style="width:40px;height:40px;border-radius:50%;background:#0366d6;"></div>
  <p class="mt-2">这个蓝点用来引导用户注意(示例)</p>
</div>

2、项目概况:Magic CSS(Minimamente / miniMAC)

  • 官方项目地址:Magic Animations CSS3 --- Minimamente 的 "Magic" 项目。minimamente
  • 在 GitHub 上名为 miniMAC/magic ,定位是提供一组带"特效"的 CSS3 动画类(special effect animations)库。minimamente+1
  • 项目以 MIT 许可开源。minimamente+1

这个库的目标类似于许多动画辅助工具库:让开发者不必自己定义复杂的 @keyframes,直接使用类名就能给元素添加各种"炫酷"动画效果。


2.1、动画类别与效果

Magic CSS 提供了多个类别的效果,下面是按官方列出的分类和一些示例:minimamente

类别 示例动画名 / 效果
Magic Effects magic, twisterInDown, twisterInUp, swap
Bling(闪光 / "亮点") puffIn, puffOut, vanishIn, vanishOut
Static Effects openDownLeft, openUpRight, openDownLeftReturn
Static Effects Out openDownLeftOut, openUpRightOut
Perspective perspectiveDown, perspectiveUpReturn
Rotate rotateDown, rotateLeft, rotateRight
Slide slideDown, slideUpReturn, slideRightReturn
Math / 其它趣味 swashOut, foolishIn, holeOut
Tin / 特殊出入场 tinRightOut, tinDownIn
Bomb / Boing / 空间系 bombRightOut, boingInUp, spaceOutLeft, spaceInDown

这些名字几乎就是语义化描述动画效果:比如 puffIn 是"鼓起淡入"、slideDownReturn 是"滑入再退回"之类。使用时通常会把两个类配合:基础类(通常名为 magictime 或类似) + 特定动画名。官方文档里也说明可以通过调整动画时长、循环次数来控制动画效果。minimamente+2minimamente+2


2.2、安装与使用

2.2.1、引入方式

  • 可以直接下载 CSS 文件(magic.cssmagic.min.css),在页面中通过 <link> 引入。minimamente

  • 也可以通过 npm / yarn 包管理器安装:

    bash 复制代码
    npm install @minimac/magic.css
    # 或者
    yarn add magic.css

    然后在项目中引入。minimamente

2.2.2、在 HTML / JS 中使用

  • 在元素上加 magictime 类 + 特定动画类,例如:

    ini 复制代码
    <div class="magictime puffIn">Hello</div>
  • 你也可以通过 JavaScript 动态给元素添加这两个类,以触发动画。例如:

    dart 复制代码
    const el = document.querySelector('.your-element');
    el.classList.add('magictime', 'swap');
  • 如果你希望在某个时刻触发,或循环触发,也可以用 setTimeout / setInterval 控制。minimamente

  • 默认动画时长是 1s(即 .magictime 里定义的默认值),但你可以覆盖这个时长。官方文档里也写了如何覆写 .magictime { animation-duration: ... }minimamente+1


2.3、优势、适用场景与注意点

2.3.1、优势

  • 开箱即用:不需要自己写 keyframes,直接用类即可轻松给元素添加较复杂的动画效果。
  • 丰富的动画集合:种类很多,覆盖常见的进入 / 退出 / 旋转 / 视角 / 滑动 / 趣味特效等。
  • 灵活可定制:可以覆盖动画时长、缓动函数、循环等属性。
  • 轻量 :作为纯 CSS 库,加载开销相对较小(压缩后也只有几 KB 级别)。minimamente

2.3.2、适用场景

  • 页面或组件有"惊喜动效"需求(例如卡片弹出、列表项进场 / 退场、特定装饰性动效等)。
  • 需要在用户交互(点击、悬浮)后触发动画。
  • 不想手写一大堆 @keyframes、控制起始 / 结束状态等,尤其在项目中动画种类较多时。

2.4、注意 / 限制

  • 可访问性 / 用户偏好 :如同其他动画库,你要考虑用户的 prefers-reduced-motion 偏好,在用户希望减少动画时禁用动画或提供降级方案。
  • 不适合所有场景:如果动画效果过强或重复使用不当,可能干扰用户体验。对于关键 UI(如按钮、输入框)最好避免频繁动画。
  • 冲突 / 类名管理:如果你项目中已有很多类名、CSS 模块、命名空间等,使用前要考虑命名冲突与样式覆盖。
  • 浏览器兼容性 :虽然 Magic CSS 支持较新浏览器,但老旧浏览器可能不完全支持某些 CSS 属性。官方文档有提供支持表。minimamente

3、GSAP 是什么?

GSAP(GreenSock Animation Platform)是一个专业级、性能优异的 JavaScript 动画库,可用于网页中对 CSS、SVG、Canvas、对象属性等做动画控制。它不依赖框架(framework-agnostic),能在 React、Vue、原生 JS、甚至 WebGL 等环境中使用。GitHub+2The Software House+2

GSAP 的官网以 "Animate Anything" 为口号,强调它几乎可以控制任何可编程的属性。GSAP


3.1、核心特性与能力

特性 描述
高性能 GSAP 内部对动画更新做了很多优化,在复杂动画、多元素场景中仍能保持流畅。The Software House+2GitHub+2
精细控制 支持缓动函数、延迟、重复、yoyo、回调、键帧组合、相对 / 绝对值动画等丰富参数。
时间线(Timeline) 可以组合多个 tween(渐变动画)成一个时间轴,方便做序列动画、重叠动画、同步控制等。
插件生态 GSAP 有很多插件(ScrollTrigger, Flip, MotionPath, Draggable, MorphSVG 等),让动画更灵活强大。GitHub+2The Software House+2
跨类型动画 不只是 CSS 属性,还能控制对象属性(JavaScript 对象)、SVG 路径、数值平滑插值、颜色等。
浏览器一致性 自动处理浏览器兼容性问题,动画行为在不同浏览器下更一致。
免费性 GSAP 在 Webflow 收购之后,对广大开发者免费开放了包括大部分插件在内的完整套件。GitHub+1

3.2、基本用法示例

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>GSAP Example</title>
  <style>
    .box {
      width: 100px;
      height: 100px;
      background: teal;
      margin: 50px;
    }
  </style>
</head>
<body>
  <div class="box"></div>

  <script src="https://cdn.jsdelivr.net/npm/gsap@3/dist/gsap.min.js"></script>
  <script>
    gsap.to(".box", {
      duration: 2,
      x: 200,
      rotation: 360,
      scale: 1.5,
      ease: "power2.out"
    });
  </script>
</body>
</html>

这个例子里,.box 会在 2 秒内向右移动 200px,同时旋转一圈并放大到 1.5 倍,使用 power2.out 的缓动。

你也可以演示 gsap.from()gsap.fromTo()、以及 gsap.timeline() 的组合用法,让读者更直观地理解。


3.3、进阶:时间线 & 插件使用

3.3.1、时间线(Timeline)

使用时间线,你可以把多个动画顺序或并行组织起来:

php 复制代码
const tl = gsap.timeline({ repeat: 1, yoyo: true });

tl.to(".box", { duration: 1, x: 200 })
  .to(".box", { duration: 1, y: 100, backgroundColor: "red" }, "+=0.5")
  .to(".box", { duration: 1, opacity: 0 });

这样你就可以灵活地控制各个子动画何时开始、是否重叠、是否回放等。

3.3.2、插件示例:ScrollTrigger

假设你希望滚动到某个位置时触发动画,可以使用 ScrollTrigger 插件:

php 复制代码
gsap.registerPlugin(ScrollTrigger);

gsap.to(".box", {
  scrollTrigger: {
    trigger: ".box",
    start: "top 80%",
    end: "bottom 20%",
    scrub: true
  },
  x: 300,
  rotation: 45,
});

这种结合滚动与动画的方式,在现代网页中非常常见。


3.4、优势、局限

3.4.1、优势

  • 功能强大、灵活性极高,适合复杂动画需求。
  • 插件生态丰富,很多动画效果只要调用插件即可实现。
  • 社区活跃,文档完善,很多场景你查资料就能找到解决方案。
  • 相比于纯 CSS 动画,在控制、同步性、插件能力上有更大优势。

3.4.2、局限 / 注意点

  • 学习曲线稍陡:初学者可能要理解 tween、timeline、缓动、插件机制等。
  • 体积 / 依赖开销:虽然基础库比较轻量,但引入很多插件可能增加包体积。
  • 对于非常基础、频繁的小动画,有时用 CSS 动画更简单、成本更低。
  • 与可访问性 / prefers-reduced-motion 配合:如果用户开启"减少动画"偏好,需要在实现中考虑禁用或降级动画。
  • 插件授权 / 版本兼容性:虽然大部分插件现在免费,但有些高级插件或以前的"会员插件"在历史上可能有授权限制,还需要确认当前的许可状态。
相关推荐
今禾3 小时前
深入理解CSS媒体查询
前端·css·面试
r0ad3 小时前
开发实战:从0到1实现Chrome元素截图插件的完整过程
javascript·chrome
TZOF3 小时前
TypeScript的类型声明和静态类型检查注意事项
前端·javascript·后端
汉堡包0013 小时前
【靶场练习】--DVWA第三关CSRF(跨站请求伪造)全难度分析
前端·安全·csrf
日月之行_3 小时前
codeReview不再头疼AI代码审查让你的MR质量瞬间提升
前端
鹏多多3 小时前
React使用react-fastclick解决移动端触摸延迟300ms
前端
雪山上的小灰熊3 小时前
UNIAPP如何自定义全局方法?
javascript·typescript·uni-app·vue·vue3·vite·hooks
江城开朗的豌豆4 小时前
React Ref揭秘:直接操作DOM的"秘密通道"
前端·react.js
江城开朗的豌豆4 小时前
何时该请出Redux?前端状态管理的正确打开方式
前端·javascript·react.js