定价

Gradient 使用手册

v2.13.2 · @snowui-design-system/components

许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。

组件介绍

以柔和的多层渐变丰富背景与占位画面,提供六种配色与可缩放的形变效果。

使用选择

用于已内置的装饰性渐变图形或头像占位。艺术配色不作为普通 UI 的主题颜色;页面表面和文字仍使用语义颜色。

  • size 同时设置宽高且优先于 width / height;seed 用于稳定同一对象的图形。

  • 作为装饰保持 decorative;配色仅用于该装饰图形,页面文字与表面继续使用语义 Token。

快速开始

以下示例展示推荐的基本组合。更多场景与组合限制见后文。

<script lang="ts">	import { Gradient } from '@snowui-design-system/components';</script> <div style="display: flex; flex-wrap: wrap; justify-content: center; gap: var(--gap-4) var(--gap-3); max-width: 100%;">    <Gradient variant="blue" size={80} radius="50%" aria-label="Blue gradient" />    <Gradient variant="cyan" size={80} radius="50%" aria-label="Cyan gradient" />    <Gradient variant="green" size={80} radius="50%" aria-label="Green gradient" />    <Gradient variant="red" size={80} radius="50%" aria-label="Red gradient" />    <Gradient variant="orange" size={80} radius="50%" aria-label="Orange gradient" />    <Gradient variant="purple" size={80} radius="50%" aria-label="Purple gradient" /></div>

API

关键字 类型 默认值 描述
variant GradientVariant — 选择 Frame 200 从左到右对应的六种固定配色
seed string | number — 仅在 as="avatar-image" 且未显式传 variant 时用于稳定选择六种配色;配色名可直接命中对应 variant
size number | string — 同时设置宽高;优先级高于 width / height
width number | string — 宽度;数字值按 px 处理
height number | string — 高度;数字值按 px 处理
radius number | string — 外部裁切圆角;数字值按 px 处理
motion boolean — 控制四个 SVG 有色图层是否常驻运行;Avatar 为 false 时仍会在 hover 期间按需运行水波形变,不影响多色 Overlay 默认行为:普通 Gradient 为 true;as="avatar-image" 为 false。
avatarHoverActive boolean — 由 Avatar 宿主控制头像变体的 hover 艺术色反馈;未传时使用组件自己的交互检测,非头像变体不使用此控制。
decorative boolean true 装饰图默认隐藏于无障碍树;设为 false 时应同时提供 aria-label

未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。

使用边界与详细说明

布局模型

主布局模型:内禀原子布局。

  • 根节点为 Frame;普通 Gradient / 开启动效的 Avatar 使用固定底色和四张透明 SVG 图层图片,静态 Avatar 使用六种按 palette 复用的包内完整 SVG 图片资源。

  • 组件不接受 children,不使用 Leading / Content / Trailing,不提供 parts。

  • 默认画布为 360 × 360,默认无圆角;size 或 width / height 可改变外部几何。

  • 可见几何沿用 0 0 360 360 坐标系;静态 SVG 使用该 viewBox,活动图层则在同一坐标系外扩 overscan,并以 preserveAspectRatio="none" 填满画布。

  • 四张活动图层图片保留 filterUnits="userSpaceOnUse" 的 feGaussianBlur;普通 Gradient 的 Subtract 2 使用 800 × 800 overscan,其他三层使用 600 × 600,Avatar 的增强幅度分支全部使用 720 × 720。图形随图片 viewport 缩放时,模糊标准差与几何一起按比例缩放,不使用固定屏幕像素模糊,也不需要尺寸观察器。

  • 根层使用纯 alpha mask 统一裁切预栅格图层,避免圆角最外圈露出渐变底色毛边。

  • 普通 Gradient 默认开启四层 15s 闭环动效;Avatar fallback 常态关闭基础形变,可通过 motion / gradientMotion 显式常驻开启,或在 hover 期间按需运行水波形变。

  • 作为 Avatar fallback 渲染时,Gradient 根据 Avatar 传入的 seed 稳定选择六种配色;若 seed 本身是 blue / cyan / green / red / orange / purple,则直接命中对应配色。

  • Avatar hover 状态由 Avatar 的统一 .snowui-media-hoverable 协议提供;Gradient 自己排除当前 variant,将其余五种 Gradient 的中心主色按实例稳定打乱,并以双层同色 overlay 持续交叉过渡。

  • 头像 hover 以缓存静态图为底,按需创建四个预栅格 SVG 图层和五色 × 两层 HTML 纯色 Overlay;四层采用 6.4s / 7.2s / 8.4s / 6.8s 的独立周期、七段非对称路径和增强幅度持续流动。每次进入从六组相位 / 方向配置中随机选择且不与上次重复,颜色循环仍为 10s。两者以 1s 淡入、0.5s 淡出,离开后完整卸载。

  • Gradient 通过模块级共享 IntersectionObserver 在离开视口 128px 预热范围后暂停内部 transform 并释放 will-change;浏览器不支持该能力时保持原有持续动效,不影响视觉与语义。

  • prefers-reduced-motion: reduce 下停止内部循环并恢复未经 transform 的静态设计基线。

API

关键字 类型 默认值 描述
as string - Frame 角色声明;Avatar 场景可使用 as="avatar-image"

CSS 动效覆盖

变量 默认值 描述
--snowui-gradient-motion-duration-override 15s 四层共用的实际循环时长;对应 GD-05 默认基础时长 60s ÷ 4×
--snowui-gradient-motion-easing-override steps(90, end) 常驻四层每个相邻关键帧区间的更新密度;显式覆盖可恢复连续 easing
--snowui-gradient-motion-vector-4-x-amplitude-override / --snowui-gradient-motion-vector-4-y-amplitude-override 12% / 12% Vector 4 位移幅度
--snowui-gradient-motion-vector-4-rotate-amplitude-override 20deg Vector 4 旋转幅度
--snowui-gradient-motion-vector-3-x-amplitude-override / --snowui-gradient-motion-vector-3-y-amplitude-override 12% / 12% Vector 3 位移幅度
--snowui-gradient-motion-vector-3-scale-amplitude-override 0.25 Vector 3 放大 / 缩小幅度
--snowui-gradient-motion-subtract-x-amplitude-override / --snowui-gradient-motion-subtract-y-amplitude-override 12% / 12% Subtract 位移幅度
--snowui-gradient-motion-subtract-deform-amplitude-override 0.25 Subtract X/Y 反向非等比缩放形变幅度
--snowui-gradient-motion-subtract-2-x-amplitude-override / --snowui-gradient-motion-subtract-2-y-amplitude-override 12% / 12% Subtract 2 位移幅度
--snowui-gradient-motion-subtract-2-rotate-amplitude-override 20deg Subtract 2 旋转幅度
--snowui-gradient-motion-subtract-2-scale-amplitude-override 0.25 Subtract 2 放大 / 缩小幅度
--snowui-gradient-avatar-hover-entry-duration 1s Gradient Avatar 颜色 Overlay 的入口缓冲时长
--snowui-gradient-avatar-hover-exit-duration 0.5s Gradient Avatar 颜色 Overlay 的退出缓冲时长
--snowui-gradient-avatar-hover-motion-easing-override linear Avatar 按需水波形变的连续时间函数
--snowui-gradient-avatar-hover-motion-vector-4-duration-override 6.4s Avatar hover Vector 4 独立周期
--snowui-gradient-avatar-hover-motion-vector-3-duration-override 7.2s Avatar hover Vector 3 独立周期
--snowui-gradient-avatar-hover-motion-subtract-duration-override 8.4s Avatar hover Subtract 独立周期
--snowui-gradient-avatar-hover-motion-subtract-2-duration-override 6.8s Avatar hover Subtract 2 独立周期

motion 只决定基础矢量形变是否运行。Test 的 GD-05 提供 19 条控制条:时长、整体速度、四项缓动坐标以及四层全部 13 项幅度参数;控制条以四列网格排列在图形下方,并以每条控制的可调上限初始化。

六种配色

variant Figma Frame 底色 Vector 4 Vector 3 Subtract Subtract 2
blue 196 #290082 #58B7FF #6560FF #3AF2FC #D4E6FE
cyan 199 #0B005A #5BE4FF #00A5BE #31FF83 #D4FEEF
green 197 #000A4E #3DE680 #16B335 #C6F94F #DFFED4
red 194 #320061 #FF7CB0 #FC3551 #F9E84F #FED4D5
orange 198 #EC2300 #FFC654 #FF6C04 #FF14AD #FEF0D4
purple 195 #1E0069 #C6BAFF #F935FC #FFF78E #FED4F5

这些颜色是视觉资产自身的固定填色,不是公开颜色 Prop,也不映射主题语意色。

专业艺术色例外

Gradient 的六组固定 SVG palette、中心色与 Avatar 模式多色 Overlay 已在 StyleSpec §2.1.3(源码参考:specs/maintainers/StyleSpec.md) 单独登记为专业艺术色例外。它们共同构成经设计确认的生成式矢量视觉资产,因此不映射到 SnowUI 语义 Token,也不能作为按钮、文字、状态、表面或其他组件的通用颜色来源。

例外只覆盖 Gradient 画面及其 Avatar 视觉分支。组件根的尺寸、圆角、外部 class / style 覆盖、无障碍与 reduced-motion 仍遵守现行 StyleSpec;新增 palette 或将颜色用于新的语义前必须重新登记。

使用示例

<Gradient variant="blue" />
<Gradient variant="purple" size={160} />
<Gradient variant="orange" width={240} height={120} radius={24} />
<Avatar fallback={Gradient} data-name="Gradient avatar" size={80} />  <Avatar gradientMotion data-name="Animated Gradient avatar" size={80} />

Avatar 会向 Gradient fallback 传入 as="avatar-image"、稳定 seed 与 gradientMotion 开关。默认头像常态使用缓存静态图;hover 时 Gradient 在圆形裁切内按需淡入四个预栅格 SVG 图层,并持续过渡到当前 variant 之外的五种颜色。gradientMotion 只决定活动图层是否常驻。

矢量与缩放

  • 画布:360 × 360。

  • 图层顺序:底色矩形 → Vector 4 → Vector 3 → Subtract → Subtract 2。

  • 椭圆模糊:stdDeviation=60 / 60。

  • 路径模糊:stdDeviation=40 / 50。

  • 模块按 variant + 画布档位 缓存四张透明 SVG data source;相同 variant 的实例复用同一字符串、图片解码与栅格缓存,不创建实例级 filter ID / filter DOM。

  • Avatar 常态基础形变关闭时复用六份短 URL 的包内完整 SVG 资源;hover 只为当前头像按需创建四张活动图层图片,离开淡出后释放。

  • 静态 Avatar 与活动图层使用同一套 palette、路径和 blur 参数;普通 Gradient 仅将位于最上方、会旋转并暴露裁切边界的 Subtract 2 扩到 800 × 800,其余三层保留 600 × 600;Avatar 的 720 × 720 overscan 覆盖增强幅度。

  • Avatar 模式继续使用浏览器原生 content-visibility: auto 与布局 / 绘制 containment,跳过长列表视口外子树绘制,不创建逐实例观察器。

  • SVG 图片 viewport 负责统一缩放全部几何与 blur;组件不读取实际像素尺寸,也不重新计算 blur。

  • 非正方形宽高按 Figma Fill 行为分别缩放 X / Y 轴。四个 HTML 图层先在 SVG foreignObject 的 360 × 360 设计坐标内运动,再由外层 viewBox 整体 Fill;禁止先拉成长方形再旋转,以免露出预栅格图片的硬裁切边界。

动效与性能

  • 底色保持静止;开启 motion 后,单个实例只在四个承载预栅格 SVG 图片的 HTML 图层上运行 CSS transform keyframes。

  • 动画只使用 translate3d + rotate + scale / scaleX / scaleY;常驻 Gradient 在每个相邻关键帧区间使用90级更新密度,单步位移在默认 360px 画布中低于约1px;仅在 motion 开启且接近视口时使用 will-change: transform。

  • 四个 feGaussianBlur 只在图片解码时执行一次;运行中的 DOM 没有 filter / clipPath / path,循环不触发 SVG filter 重栅格。

  • Avatar 未 hover 时由 Avatar 直接使用共享静态图,不创建 Gradient 组件、活动图层或颜色 Overlay;hover 时才挂载一份 Gradient、四张预栅格活动图层与五种候选色 × 两层结构,离开0.5秒淡出后全部卸载。

  • 默认 Avatar hover 的四层周期分别为 6.4s / 7.2s / 8.4s / 6.8s,使用原有连续时间函数、七个不等时非镜像途经点、独立负延迟、18% 位移、30deg 旋转与 32% 缩放 / 形变幅度,避免多层同步减速或沿原路返回。

  • 原始五层不动画 fill、mix-blend-mode 或 Gaussian Blur;Avatar hover 只在五组双层同色纯色 Overlay 间交叉动画 opacity。每层使用独立 HTML 合成元素执行 overlay,确保 backdrop 是已经完整渲染的 Gradient 图形。

  • 颜色顺序仅在组件求值时由 seed 与实例 ID 稳定打乱;每次 hover 只用一次随机数选择与上次不同的六组运动相位 / 方向配置,所有逐帧运动仍由 CSS 完成。JavaScript 只在 hover 边界使用一次 requestAnimationFrame 分离挂载与淡入,并以退出计时器在0.5秒淡出后回收 DOM;不使用 JavaScript 动画循环、Canvas 或 ResizeObserver。

  • 0% 与 100% 使用完全相同的 transform,保证持续循环时不跳帧。

  • 一个模块级 IntersectionObserver 服务全部实例;离开视口预热范围后暂停 CSS 动画并移除图层提升,重新进入时从暂停位置继续。能力缺失时保持运行,不引入功能退化。

  • 图层预栅格画布大于可见画布;动效幅度限制在 overscan 安全范围内并由根 clip-path 统一裁切。


Gradient 样式覆盖

先阅读 完整 LICENSE;同任务、同版本、同范围去重。

优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。

变量 用途与默认参考
--snowui-gradient-avatar-hover-motion-easing-override Avatar 按需水波形变缓动(默认 linear)
--snowui-gradient-avatar-hover-motion-subtract-2-duration-override Avatar Subtract 2 水波周期(默认 6.8s)
--snowui-gradient-avatar-hover-motion-subtract-duration-override Avatar Subtract 水波周期(默认 8.4s)
--snowui-gradient-avatar-hover-motion-vector-3-duration-override Avatar Vector 3 水波周期(默认 7.2s)
--snowui-gradient-avatar-hover-motion-vector-4-duration-override Avatar Vector 4 水波周期(默认 6.4s)
--snowui-gradient-height-override 高度(默认 360px)
--snowui-gradient-motion-duration-override 四层持续动效实际时长(默认 15s,对应 Test 基础时长 60s ÷ 整体速度 4×)
--snowui-gradient-motion-easing-override 常驻四层每个相邻关键帧区间的更新密度 / 缓动(默认 steps(90, end))
--snowui-gradient-motion-subtract-2-rotate-amplitude-override Subtract 2 旋转幅度(默认 20deg)
--snowui-gradient-motion-subtract-2-scale-amplitude-override Subtract 2 缩放幅度(默认 0.25,即 25%)
--snowui-gradient-motion-subtract-2-x-amplitude-override Subtract 2 X 位移幅度(默认 12%)
--snowui-gradient-motion-subtract-2-y-amplitude-override Subtract 2 Y 位移幅度(默认 12%)
--snowui-gradient-motion-subtract-deform-amplitude-override Subtract 非等比形变幅度(默认 0.25,即 25%)
--snowui-gradient-motion-subtract-x-amplitude-override Subtract X 位移幅度(默认 12%)
--snowui-gradient-motion-subtract-y-amplitude-override Subtract Y 位移幅度(默认 12%)
--snowui-gradient-motion-vector-3-scale-amplitude-override Vector 3 缩放幅度(默认 0.25,即 25%)
--snowui-gradient-motion-vector-3-x-amplitude-override Vector 3 X 位移幅度(默认 12%)
--snowui-gradient-motion-vector-3-y-amplitude-override Vector 3 Y 位移幅度(默认 12%)
--snowui-gradient-motion-vector-4-rotate-amplitude-override Vector 4 旋转幅度(默认 20deg)
--snowui-gradient-motion-vector-4-x-amplitude-override Vector 4 X 位移幅度(默认 12%)
--snowui-gradient-motion-vector-4-y-amplitude-override Vector 4 Y 位移幅度(默认 12%)
--snowui-gradient-radius-override 圆角 / 裁切半径(默认 var(--radius-0) = 0)
--snowui-gradient-width-override 宽度(默认 360px)

设计指南 · Token · 组合边界

Gradient 类型与状态

必填属性:无具名必填属性。

可双向绑定:本组件未声明具名双向绑定属性;状态更新通过公开回调或所属宿主处理。

继承声明:Omit< FrameProps, | "children" | "size" | "width" | "height" | "radius" | "enableDefaultMotion" >。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。

共享 Frame API · 返回 API

以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。

GradientVariant

来源:components/src/components/Gradient.svelte

export type GradientVariant =        | "blue"        | "cyan"        | "green"        | "red"        | "orange"        | "purple";