跳转到内容

Progress 进度条 ​

表示一件事的完成程度。线形、环形与仪表盘三种形态。

用法 ​

value 与 max 共同决定百分比

组件结构 ​

加粗的是必需部件。

data-scope="progress":root · canvas · track · range · label

示例 ​

配文字说明 ​

进度条自身只绘制轨道与进度,百分比文字由使用者放置

上传中64%

自定义量程 ​

max 不是 100 时按 value/max 折算,用于「已完成 3/8 步」这类场景

颜色 ​

tone 决定进度段用哪族颜色,不写时沿用品牌色

brand
neutral
success
warning
danger
info

尺寸 ​

size 只改变轨道厚度,不写即默认中档

sm
缺省
lg

自定义外观 ​

轨道色、进度段色与轨道厚度各是一个组件令牌,纯色与渐变都可以使用

环形 ​

variant="circle" 把同一份进度绘制为环,尺寸档改变的是直径

仪表盘 ​

variant="dashboard" 在环上留一个缺口,gapDegree 与 gapPosition 决定缺口大小与朝向

环心文字 ​

组件只负责把内容放置到环心,写什么由使用者决定

72%
3 / 8

环的外观 ​

直径、颜色与端点经令牌,线宽经 strokeWidth:它改变的是几何,半径随之向内收缩

设计指引 ​

何时使用 ​

  • 上传、导出、批处理等有确定完成度的过程。
  • 容量、配额等比例值。

何时不用 ​

特性 ​

  • variant 三档:线形、环形、仪表盘;仪表盘的缺口角度与位置可调。
  • indeterminate 表达进行中但剩余量未知。
  • valueText 决定读屏读出的内容:“3 个文件中的第 2 个”比“66%”更有用。
  • 环心可以放置文字。

组合 ​

  • 与统计数值并排;文件上传的每一项配一条。

最佳实践 ​

  • 长任务给出剩余时间或剩余数量,只有百分比难以判断等待时长。
  • 到 100% 后要有明确的完成态,不停留在满格。

反模式 ​

  • 进度倒退。
  • 用假进度条掩盖未知的等待。

API 参考 ​

产物 ​

层值
自定义元素<xh-progress>
Vue 组件XhProgress
状态机无,connect 直接由 props 算属性
皮肤@xihan-ui/styles/progress.css

Props ​

属性类型必填说明
gapDegreenumber缺口角度,默认 75。只对 dashboard 生效。
gapPositionProgressGapPosition缺口朝向,默认 bottom。只对 dashboard 生效。
indeterminateboolean进度未知:进度条改为往复动画,读屏侧不报数。 置真时 aria-valuenow 整体不发出:ARIA 规定不确定进度以该属性缺席表达。
maxnumber满值上限,默认 100;非有限值或不为正时回退为 100。
semanticsProgressSemantics报告的是进度还是量,默认 progress。meter 档发出 role="meter",且 indeterminate 不再生效。
sizeSize尺寸:sm / md / lg。线形影响轨道厚度,环形影响直径
strokeWidthnumber环的线宽,使用 viewBox 单位(整个环绘制在 100×100 中),默认 6。 只对 circle / dashboard 生效:它修改的是几何(半径随之向内收缩),因此是 prop 而不是令牌; 线形的厚度仍使用 --xh-progress-thickness。
toneTone语气:brand / neutral / success / warning / danger / info,决定使用哪族颜色
valuenumber当前进度值,越界会被夹到 [0, max];非有限值按 0 处理。
valueTextstring读屏播报的文字,覆盖默认的数值播报(进度不是百分比时使用,如「第 3 步,共 8 步」)。
variantProgressVariant形态,默认 line。circle 绘制整环,dashboard 在环上留出一个缺口。

状态 ​

公开状态写入 data-state。

部件取值
root'indeterminate' | 'complete' | 'loading'
label'complete' | 'loading'

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
variantProgressVariant落定后的形态。
semanticsProgressSemantics落定后的语义。
rationumber进度比例,[0,1]。
percentnumber进度百分比,取整。
getRootProps() => T['element']
getCanvasProps() => T['element']承载环的 <svg>;线形不渲染它。
getTrackProps() => T['element']
getRangeProps() => T['element']
getLabelProps() => T['element']环心区域:落位归皮肤,内容归作者。线形不使用。

无障碍 ​

键盘 ​

规格出处:W3C APG

无键盘交互(不接收焦点,或焦点行为完全由原生元素提供)。

ARIA ​

以下属性由 connect 生成。

部件属性值
rootaria-valuemaxString(max)
rootaria-valuemin'0'
rootaria-valuenowundefined | String(value)
rootaria-valuetextprops.valueText
rootrole'meter' | 'progressbar'
canvasaria-hidden'true'

样式参考 ​

皮肤 ​

@xihan-ui/styles/progress.css 使用 [data-scope="progress"][data-part="root"] 部件选择器,位于 xihan.components 与 xihan.motion 层。覆盖样式使用 xihan.overrides。

forced-colors: active 下另有一套规则:颜色交给系统,边框与状态标记改用系统色关键字。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-sizeprops.size
rootdata-state'indeterminate' | 'complete' | 'loading'
rootdata-toneprops.tone
rootdata-variantprops.variant
canvasdata-variantprops.variant
rangedata-empty''(条件成立时才出现)
labeldata-state'complete' | 'loading'
labeldata-variantprops.variant

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-progress-indeterminate-durationrangeanimationstate=indeterminate--xh-motion-loop-shimmerprogress 的 range 部件 animation 覆盖槽。
--xh-progress-label-fglabelcolordefault--xh-fg-defaultprogress 的 label 部件 color 覆盖槽。
--xh-progress-label-font-sizelabelfont-sizedefault--xh-text-body-sizeprogress 的 label 部件 font-size 覆盖槽。
--xh-progress-linecaprangestroke-linecapvariant=circle
variant=dashboard
roundprogress 的 range 部件 stroke-linecap 覆盖槽。
--xh-progress-rangerangebackground
stroke
default
variant=circle
variant=dashboard
--xh-_toneprogress 的 range 部件 background、stroke 覆盖槽。
--xh-progress-range-radiusrangeborder-radiusdefault--xh-shape-pillprogress 的 range 部件 border-radius 覆盖槽。
--xh-progress-sizerootblock-size
inline-size
size=lg
size=sm
variant=circle
variant=dashboard
10rem
5rem
7.5rem
progress 的 root 部件 block-size、inline-size 覆盖槽。
--xh-progress-thicknessroot
track
block-sizedefault
size=lg
size=sm
--xh-space-1
--xh-space-2
--xh-track-thickness
progress 的 root、track 部件 block-size 覆盖槽。
--xh-progress-tracktrackbackground
stroke
default
variant=circle
variant=dashboard
--xh-bg-subtle-activeprogress 的 track 部件 background、stroke 覆盖槽。
--xh-progress-track-radiustrackborder-radiusdefault--xh-shape-pillprogress 的 track 部件 border-radius 覆盖槽。

动效 ​

动效角色:指示与换位 · 循环(见动效规范)。

可覆盖的动效槽:--xh-progress-indeterminate-duration。

关键帧 xh-progress-indeterminate 随皮肤自带,不引用别处文件里的名字;stroke-dashoffset · translate 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

prefers-reduced-motion: reduce 下本组件另有降级规则。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像;另有按 dir 分支的规则。

Released under The MIT License