CircularChart 使用手册
v1.4.5 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
用圆环或饼图展示数据占比,支持分段、圆角、环厚与悬停强调,适合构成分析和比例概览。
使用选择
用于展示占比、环形或饼图数据。目标完成度可按语义选择 GaugeChart 或 Progress;颜色与标签使用公开配置。
data 使用 name 与有限正 value;只显示前 maxItems 个有效项,占比分母为这些显示项之和。显式空数组展示空图。
推荐用数字 size;字符串几何只取数值部分,不能依赖百分比或 CSS 变量完成自适应。中心内容用公开 center-label / segment-value / segment-name 角色。
根默认可访问名称随 LocaleProvider 切换,使用
circularChart.name;显式aria-label优先。业务名称、数据值与数字格式保持调用方内容。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
HoverPanel 使用共享三列布局;圆点—名称优先 --gap-1,名称—数值优先 --gap-2,两处均至少保留 4 CSS px,并跟随 LTR / RTL 逻辑方向。默认 16px 根字号下仍为 4px / 8px,较大 Token 保留;面板纵向分区和图表中心注释不套用此下限。
设计原则
专业图表组件:当前维护位置为
components/src/components/;该目录是迁移期技术位置。全部组件的运行包与原始源码均可免费获取;用途、项目、席位及生产使用权益按 LICENSE 执行,不按高级功能划分组件。最多 10 项:默认
maxItems=10。颜色只使用primary与 9 个secondary-*token,10 项后颜色会重复且图表辨识度下降,因此组件默认截断到 10 项。颜色模式:默认
colorMode="sequence"按primary → secondary-purple → secondary-cyan → secondary-mint → secondary-green → secondary-indigo → secondary-blue → secondary-yellow → secondary-orange → secondary-red循环;monochromeFade使用 Primary 从 100% 均匀递减到最后一项 20%;monochrome默认所有扇区使用 Black4。每个数据项可通过color单独定义扇区颜色;colors可作为按 index 的调色板覆盖入口,留空项回退当前颜色模式。几何缩放:
cornerRadius与separatorWidth的数值都是 160x160 图表下的设计基准值,组件会按实际size / 160等比缩放。auto使用默认基准值:圆角4、间隔2。Hover 强调:hover / focus 当前项时,扇区不位移,仅外半径缓动增加
hoverThicknessGrowth,默认向外增厚4px;中心标签上方显示百分比,下方显示当前项名称。
2.1 数据与形态
支持圆环图与实心饼图:
ringThickness小于外半径时为圆环,ringThickness >= outerRadius时内半径归零并形成实心饼图。支持最多 10 个扇区:
maxItems默认10,内部上限固定为10,超出项会被截断。自动过滤无效数据:
value <= 0或非数字项不参与渲染;显式空数组或全部无效时渲染空图表,只有省略data时使用内置示例数据。支持尺寸、环厚、圆角、隔断和 hover 外侧增厚调整:数字值按 px 语义写入组件私有 CSS 变量。
支持 160x160 基准几何缩放:
cornerRadius与separatorWidth的传入数值都是设计基准值,实际渲染按size / 160等比放大或缩小。
2.2 扇区绘制
扇区路径包含外圆弧、内圆弧和头尾切线圆角,圆角跟随真实扇区形状生成,不依赖后期裁切。
扇区之间的透明间隔在 path 几何阶段生成:
separatorWidth会换算为 d3-shape 的padAngle,并配合padRadius收缩内外圆弧。不绘制白色分隔线,也不使用后置 gap mask 挖空扇区。圆角仍由收缩后的扇区 path 生成,因此贯穿环厚的透明间隔与端部圆角可以同时成立。
showBaseLayer=true时底层绘制一层同色4%透明度占位扇区,默认不绘制,不参与出现动效;真实填充层在其上方播放。最上层使用完整扇区 path 作为透明命中层,保证 hover / focus 的交互范围稳定。
2.3 颜色能力
默认颜色顺序为 Primary、Purple、Cyan、Mint、Green、Indigo、Blue、Yellow、Orange、Red。
每个扇区可通过
data[i].color单独定义颜色;未定义颜色的扇区继续使用默认颜色序列。colors可作为整组调色板覆盖入口,并允许数组项为undefined,空项会回退当前colorMode对应颜色。支持 Chart 通用三种颜色模式:
sequence默认色序、monochromeFade单色渐浅、monochrome单色。三种模式都支持data[i].color与colors[i]指定扇区自定义颜色。color支持普通颜色、CSS 变量、linear-gradient(...)字符串和渐变对象。不直接支持
.bg-gradient-blue这类背景工具类名;SVG 扇区使用fill,背景类的background/background-image不会被 path 消费。
2.4 动效能力
支持首次进入视口自动播放出现动效,可通过
appearOnView关闭。支持 8 个出现起始方向:
top / top-right / right / bottom-right / bottom / bottom-left / left / top-left。支持滚动条时间轴:
scrollAppearance开启后,滚动距离直接映射到appearanceProgress。支持受控时间轴:外部传入
appearanceProgress后,组件只根据该进度渲染,不自行播放。支持非受控方法:
replay()重新填充,resetAppearance()重置,reverseAppearance()反向回退。填充层与透明度层同时启动:填充完成后下一个扇区即可启动,透明度补齐独立继续,不阻塞后续扇区。
支持反向时间轴:
appearanceProgress从1回到0时,填充宽度与透明度按同一公式回退。
2.5 交互与无障碍
hover / focus 当前扇区时,扇区外半径向外增厚,内半径不变,扇区不发生位移。
hover / focus 当前扇区时,中心标签显示当前项百分比和名称,默认百分比在上、名称在下。
labelFormatter可自定义中心标签内容,并支持用\n拆成两行;第一行按数值样式渲染,第二行按名称样式渲染。可传入直接子元素
<Text as="segment-value" />/<Text as="segment-name" />自定义中心标签样式模板;组件会自动写入当前扇区的真实百分比和名称,出现任一角色子元素时不渲染默认中心标签。showCenterLabel={false}可关闭中心标签,同时关闭外部写入的中心标签角色内容。根使用
role="group"和aria-label="圆形图表"(zh-CN 默认,随 locale 切换);SVG 不隐藏可聚焦扇区,每个扇区命中项以role="button"和包含名称、百分比的独立aria-label暴露给辅助技术。扇区命中层可获得键盘焦点,focus 行为与 hover 一致;中心标签使用
aria-live="polite"。
2.6 Frame 集成
根层使用
Frame;loading保留声明尺寸和中心内容,将扇区固定在出现动效起点并暂停交互。图表根层明确关闭 Skeleton,也会读取上层 Frame 的 loading 上下文。支持
enableResponsive、enableContext、enableScaleObserver、enableDefaultMotion透传到 Frame。class、style和其余未声明属性会透传给根层 Frame。图表尺寸由 SVG 几何算法决定,作为外部布局子项时表现为 Hug。
3.1 Props
其余未声明属性会透传给根层 Frame。
3.2 组件方法
3.3 数据结构
百分比数字格式优先级:labelFormatter(中心标签)→ item.percentFormat → 组件 percentFormat → NumberFormatContext → NumberFormats 默认值。扇区命中层 aria-label 不使用 labelFormatter,但会消费 percentFormat。
value <= 0 或非数字项会被过滤;显式空数组或全部无效时渲染空图表,省略 data 才使用内置示例数据。
颜色优先级:data[i].color → colors[i] → colorMode 对应回退色。未定义颜色的扇区不会受其它扇区自定义颜色影响,继续使用当前颜色模式。渐变字符串支持 linear-gradient(135deg, #111111 0%, #6BE6D3 100%) 形式;渐变对象支持用 angle 和 stops 显式声明。
布局模型
主布局模型:内禀原子布局。
根层为
Frame,内部本体层统一承载 SVG 绘图区与中心标签,负责等比缩放;HoverPanel 与本体层并列,保持原有尺寸。图表尺寸由
size与 SVG 几何算法决定;作为外部布局子项时表现为 Hug。不接入三槽位协议,不承担通用子元素排列。
详见 LayoutProtocol.md §12.3(源码参考:specs/maintainers/LayoutProtocol.md)。
动效
6.1 出现动效起始方向
startDirection 支持 8 个方向:top / top-right / right / bottom-right / bottom / bottom-left / left / top-left。
判定规则:
从圆心向
startDirection发出射线。找到该射线命中的扇区。
不论射线落在该扇区的哪个位置,动效都从该扇区自身起始边界开始。
后续按顺时针方向逐扇区填充,直到所有扇区完成。
使用示例
上例中的 cornerRadius={16} 与 separatorWidth={4} 表示 160x160 图表下的设计基准值。实际尺寸为 320 时,最终呈现为 32px 圆角与 8px 间隔。
CircularChart 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
CircularChart 类型与状态
必填属性:无具名必填属性。
可双向绑定:本组件未声明具名双向绑定属性;状态更新通过公开回调或所属宿主处理。
继承声明:无接口继承。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
CircularChartItem
来源:components/src/components/CircularChart.svelte
CircularChartColor
来源:components/src/components/CircularChart.svelte
ChartColor
来源:components/src/lib/chart/colors.ts
SnowUIColor
来源:components/src/lib/color.ts
ChartGradient
来源:components/src/lib/chart/colors.ts
ChartGradientStop
来源:components/src/lib/chart/colors.ts
NumberFormatOptions
来源:components/src/lib/number-format.ts
NumberNotation
来源:components/src/lib/number-format.ts
CircularChartColorMode
来源:components/src/components/CircularChart.svelte
ChartColorMode
来源:components/src/lib/chart/colors.ts
StartDirection
来源:components/src/components/CircularChart.svelte
AnchorPoint
来源:components/src/components/CircularChart.svelte
ChartHoverMode
来源:components/src/components/CircularChart.svelte
ChartHoverPanelVariant
来源:components/src/lib/chart/hover-panel.ts
ChartHoverPanelPlacement
来源:components/src/lib/chart/hover-panel.ts