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.css
或magic.min.css
),在页面中通过<link>
引入。minimamente -
也可以通过 npm / yarn 包管理器安装:
bashnpm install @minimac/magic.css # 或者 yarn add magic.css
然后在项目中引入。minimamente
2.2.2、在 HTML / JS 中使用
-
在元素上加
magictime
类 + 特定动画类,例如:ini<div class="magictime puffIn">Hello</div>
-
你也可以通过 JavaScript 动态给元素添加这两个类,以触发动画。例如:
dartconst 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
配合:如果用户开启"减少动画"偏好,需要在实现中考虑禁用或降级动画。 - 插件授权 / 版本兼容性:虽然大部分插件现在免费,但有些高级插件或以前的"会员插件"在历史上可能有授权限制,还需要确认当前的许可状态。