导航类

步骤

将复杂任务或存在先后关系的任务分解,使用步骤组件引导用户按规定流程操作,并让其知道其当前的进度

代码演示

如何引入

import { Steps } from '@fibrous/semi-ui-solid';

只有 Steps.Step 占一个步骤位置;其他子节点(包括原生元素与文本)不渲染、不占序号,开发环境给出警告。Step 在 Steps 之外不渲染任何内容。

默认步骤条(旧版)

建议使用简易版 steps(新版),旧版后续会逐渐 deprecate

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps current={1} onChange={(i) => console.log(i)}>
            <Steps.Step title="Finished" description="This is a description" />
            <Steps.Step title="In Progress" description="This is a description" />
            <Steps.Step title="Waiting" description="This is a description" />
        </Steps>
    );
}

简单步骤条(新版)

通过设置 type="basic" 显示为简洁风格步骤条

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps type="basic" current={1} onChange={(i) => console.log(i)}>
            <Steps.Step title="Finished" description="This is a description" />
            <Steps.Step title="In Progress" description="This is a description" />
            <Steps.Step title="Waiting" description="This is a description" />
        </Steps>
    );
}

导航步骤条

通过设置 type="nav" 显示为导航风格步骤条。导航风格的步骤条有以下特点:

  1. 步骤条同样支持交互:Steps 监听步骤切换或 Step 绑定点击回调后,步骤可聚焦、可点击,行为与其他类型一致。

  2. 适用于步骤间互相关联较小,内容互不影响,且需要突出页面视觉元素时使用。

  3. 步骤条的宽度按照内容物撑开。

  4. Steps.Step 只渲染标题,description、icon、status 不生效;其余属性与事件(aria-label、role、点击与键盘回调、类名与样式等)与其他类型相同。

注册账号
这个项目的文字比较多多多多
产品用途
期待尝试功能
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <div style={{ display: 'flex', 'justify-content': 'center' }}>
            <Steps type="nav" current={1} style={{ margin: 'auto' }} onChange={(i) => console.log(i)}>
                <Steps.Step title="注册账号" />
                <Steps.Step title="这个项目的文字比较多多多多" />
                <Steps.Step title="产品用途" />
                <Steps.Step title="期待尝试功能" />
            </Steps>
        </div>
    );
}

迷你尺寸步骤条

通过设置 size="small" 显示迷你尺寸步骤条

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps type="basic" size="small" current={1} onChange={(i) => console.log(i)}>
            <Steps.Step title="Finished" description="This is a description" />
            <Steps.Step title="In Progress" description="This is a description" />
            <Steps.Step title="Waiting" description="This is a description" />
        </Steps>
    );
}
注册账号
这个项目的文字比较多多多多
产品用途
期待尝试功能
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <div style={{ display: 'flex', 'justify-content': 'center' }}>
            <Steps type="nav" size="small" current={1} style={{ margin: 'auto' }} onChange={(i) => console.log(i)}>
                <Steps.Step title="注册账号" />
                <Steps.Step title="这个项目的文字比较多多多多" />
                <Steps.Step title="产品用途" />
                <Steps.Step title="期待尝试功能" />
            </Steps>
        </div>
    );
}

处理进度

配合内容及按钮使用,表示一个流程的处理进度

1
First
2
Second
3
Last
First-content
代码
import { createSignal, For, Show } from 'solid-js';
import { Button, Steps } from '@fibrous/semi-ui-solid';

const steps = [
    {
        title: 'First',
        content: 'First-content',
    },
    {
        title: 'Second',
        content: 'Second-content',
    },
    {
        title: 'Last',
        content: 'Last-content',
    },
];

export default function StepsDemo() {
    const [current, setCurrent] = createSignal(0);

    const next = () => {
        setCurrent(current() + 1);
    };

    const prev = () => {
        setCurrent(current() - 1);
    };

    return (
        <div>
            <Steps type="basic" current={current()} onChange={(i) => console.log(i)}>
                <For each={steps}>{(item) => <Steps.Step title={item.title} />}</For>
            </Steps>
            <div class="steps-content" style={{ 'margin-top': '4px', 'margin-bottom': '4px' }}>
                {steps[current()].content}
            </div>
            <div class="steps-action">
                <Show when={current() < steps.length - 1}>
                    <Button type="primary" onClick={next}>
                        Next
                    </Button>
                </Show>
                <Show when={current() === steps.length - 1}>
                    <Button type="primary" onClick={() => console.log('Processing complete!')}>
                        Done
                    </Button>
                </Show>
                <Show when={current() > 0}>
                    <Button style={{ 'margin-left': '8px' }} onClick={prev}>
                        Previous
                    </Button>
                </Show>
            </div>
        </div>
    );
}

竖直方向的步骤条

通过设置 direction,使用竖直方向的步骤条

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps direction="vertical" current={1} style={{ width: '300px' }} onChange={(i) => console.log(i)}>
            <Steps.Step title="Finished" description="This is a description" />
            <Steps.Step title="In Progress" description="This is a description" />
            <Steps.Step title="Waiting" description="This is a description" />
        </Steps>
    );
}
Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps direction="vertical" type="basic" current={1} onChange={(i) => console.log(i)}>
            <Steps.Step title="Finished" description="This is a description" />
            <Steps.Step title="In Progress" description="This is a description" />
            <Steps.Step title="Waiting" description="This is a description" />
        </Steps>
    );
}

指定步骤状态

步骤运行错误,使用 Steps 的 status 属性来指定当前步骤的状态。

Finished
This is a description
In Process
This is a description
3
Waiting
This is a description
代码
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps type="basic" current={1} status="error" onChange={(i) => console.log(i)}>
            <Steps.Step title="Finished" description="This is a description" />
            <Steps.Step title="In Process" description="This is a description" />
            <Steps.Step title="Waiting" description="This is a description" />
        </Steps>
    );
}

自定义图标/状态

通过设置 Steps.Step 的 icon 属性,可以启用自定义图标;传入的内容为空时不显示图标。

通过设置 Steps.Step 的 status 属性,可以自定义每个 step 的状态

已完成
错误
警告
正在进行
等待
代码
import { IconHome, IconLock } from '@fibrous/semi-icons-solid';
import { Steps } from '@fibrous/semi-ui-solid';

export default function StepsDemo() {
    return (
        <Steps type="basic" onChange={(i) => console.log(i)}>
            <Steps.Step status="finish" title="已完成" />
            <Steps.Step status="error" title="错误" />
            <Steps.Step status="warning" title="警告" />
            <Steps.Step status="process" title="正在进行" icon={<IconHome size="extra-large" />} />
            <Steps.Step status="wait" title="等待" icon={<IconLock size="extra-large" />} />
        </Steps>
    );
}

onChange 回调

通过 onChange 监听步骤切换,回调接收一个 number 类型的参数,等于 initial 加所选步骤的索引;点击当前步骤不会触发。传入 onChange 后所有步骤变为可点击。

First
2
Second
3
Last
代码
import { createSignal, For } from 'solid-js';
import { Steps } from '@fibrous/semi-ui-solid';

const steps = [{ title: 'First' }, { title: 'Second' }, { title: 'Last' }];

export default function StepsDemo() {
    const [current, setCurrent] = createSignal(1);

    return (
        <div>
            <Steps type="basic" current={current()} onChange={(index) => setCurrent(index)}>
                <For each={steps}>{(item) => <Steps.Step title={item.title} />}</For>
            </Steps>
        </div>
    );
}

Accessibility

ARIA

  • Steps、Step 组件支持传入 aria-label 或 aria-labelledby。Steps 根元素与不可点击的 Step 本身没有语义角色,传入名称时带 role="group",名称因此能进入可访问名称;没有名称时不加 role。fill、basic、nav 三种类型一致
  • 当前步骤带有 aria-current="step",其余步骤不带该属性
  • Steps 监听步骤切换或 Step 绑定点击回调后,步骤可通过 Tab 聚焦,role 默认为 button(优先于 group,显式传入的 role 优先于二者);焦点在步骤上时按 Enter 或空格与鼠标点击一致,同时触发 Step 的点击回调与 Steps 的切换回调;不可点击的步骤不可聚焦
  • 点击来自步骤内其他可聚焦元素(input、button、链接等)时只触发 Step 的点击回调,不触发 Steps 的切换回调。可点击的步骤本身是 role="button",title、description 中放可聚焦控件会形成嵌套交互元素,此时不要让步骤可点击

API 参考

Steps

整体步骤条。

Props

属性说明类型默认值
current当前步骤,从 0 开始计数;子 Step 可用 status 覆盖状态。number0
direction步骤条方向,可选 horizontal、vertical;用于 basic 与 fill 类型。Direction"horizontal"
hasLine是否显示步骤间的连接线;仅用于 basic 类型。booleantrue
initial起始序号,从 0 开始计数。number0
onChange点击或按 Enter、空格选择步骤时调用,参数为该步骤序号(initial 加索引);点击当前步骤不调用。传入后所有 Step 变为可点击。Type(current: number) => void-
prefixCls根元素的类名前缀。string"semi-steps"
size尺寸,可选 small、default;用于 basic 与 nav 类型。Size"default"
status当前步骤的状态,可选 wait、process、finish、error、warning;用于 basic 与 fill 类型。Status"process"
type步骤条类型,可选 fill、basic、nav。'fill' | 'basic' | 'nav'"fill"

class、style、ref 与其他原生属性落在 Steps 根元素上。

Steps.Step

步骤条内的每一个步骤。

Props

属性说明类型默认值
description详情描述;nav 类型不渲染。JSX.Element-
icon自定义图标,提供后替换状态图标,内容为空则不显示图标;nav 类型不渲染。JSX.Element-
status该步骤自己的状态;缺省时随 Steps 的 current 与 status 自动决定。Status-
title标题。JSX.Element-

class、style、aria-* 与原生事件(如 onClick、onKeyDown)落在 Step 的根元素(步骤项)上。role 由步骤是否可点击决定,传入时优先;tabindex 同样由步骤是否可点击决定,不能覆盖。

文案规范

  • 步骤标题
    • 标题应保持简洁,避免截断和换行;
    • 使用句子大小写书写;
    • 不要包含标点符号
  • 描述
    • 为标题补充上下文信息
    • 不要以标点符号结尾

设计变量

下表是组件内部的 Sass 变量,不能覆写。定制样式请覆写 --semi-* CSS 变量(见 Design Token 页),或写不分层的 CSS 规则。
Sass 变量值用法
$transition_duration-steps_item_title-textvar(--semi-transition_duration-none)步骤条标题文字-背景色-动画持续时间
$transition_function-steps_item_title-textvar(--semi-transition_function-easeIn)步骤条标题文字-背景色-过渡曲线
$transition_delay-steps_item_title-textvar(--semi-transition_delay-none)步骤条标题文字-背景色-延迟时间
$transition_duration-steps_item_title-iconvar(--semi-transition_duration-none)步骤条标题文字-背景色-动画持续时间
$transition_function-steps_item_title-iconvar(--semi-transition_function-easeIn)步骤条标题文字-背景色-过渡曲线
$transition_delay-steps_item_title-iconvar(--semi-transition_delay-none)步骤条标题文字-背景色-延迟时间
$transition_duration-steps_item_backgroundColorvar(--semi-transition_duration-none)步骤条标题文字-背景色-动画持续时间
$transition_function-steps_item_backgroundColorvar(--semi-transition_function-easeIn)步骤条标题文字-背景色-过渡曲线
$transition_delay-steps_item_backgroundColorvar(--semi-transition_delay-none)步骤条标题文字-背景色-延迟时间
$transform_scale-step-itemvar(--semi-transform_scale-small)步骤条item-放大
$color-steps-bg-activevar(--semi-color-fill-1)步骤条背景 - 按下态
$color-steps-bg-defaultvar(--semi-color-text-2)未到达步骤条图标背景
$color-steps-bg-hovervar(--semi-color-fill-0)步骤条背景 - 悬浮态
$color-steps-border-defaulttransparent步骤条描边 - 默认
$color-steps-icon-defaultvar(--semi-color-text-2)未到达步骤条图标背景
$color-steps-text-defaultvar(--semi-white)步骤条图标默认文本颜色
$color-steps_danger-text-activevar(--semi-color-danger-active)错误步骤条文本颜色 - 按下态
$color-steps_danger-text-defaultvar(--semi-color-danger)错误步骤条文本颜色 - 默认态
$color-steps_danger-text-hovervar(--semi-color-danger-hover)错误步骤条文本颜色 - 悬浮态
$color-steps_icon_after-bgvar(--semi-color-fill-2)
$color-steps_item_description-text-hovervar(--semi-color-focus-border)步骤条辅助描述文本颜色 - 悬浮态
$color-steps_item_done_after-bgvar(--semi-color-primary)完成步骤条尾部连接线颜色
$color-steps_item_done_icon_after-bgvar(--semi-color-primary)
$color-steps_item_error_left-iconvar(--semi-color-danger)错误步骤条图标颜色
$color-steps_item_error_left_number-iconvar(--semi-color-primary)错误步骤条数字序号文本颜色
$color-steps_item_finish-iconvar(--semi-color-primary)已完成步骤条图标颜色
$color-steps_item_finish_number-iconvar(--semi-color-white)已完成步骤条对勾图标颜色
$color-steps_item_left_number_icon-bgvar(--semi-color-primary)步骤条图标背景颜色
$color-steps_item_left_number_icon-iconvar(--semi-color-white)步骤条图标文字颜色
$color-steps_item_process_left-iconvar(--semi-color-primary)进行中步骤条对勾图标颜色
$color-steps_item_process_left_number-iconvar(--semi-color-white)进行中步骤条内部图标颜色
$color-steps_item_title-text-hovervar(--semi-color-focus-border)步骤条标题文字悬停颜色
$color-steps_item_wait_left_icon-iconvar(--semi-color-text-2)未到达步骤条图标颜色
$color-steps_item_wait_left_number_icon-bg-hovervar(--semi-color-secondary-light-default)未到达步骤条图标背景颜色 - 悬浮态
$color-steps_item_wait_left_number_icon-bgvar(--semi-color-fill-0)未到达步骤条图标背景颜色
$color-steps_item_wait_left_number_icon-icon-hovervar(--semi-color-focus-border)未到达步骤条图标颜色 - 悬浮态
$color-steps_item_wait_left_number_icon-iconvar(--semi-color-text-2)未到达步骤条内部图标颜色
$color-steps_item_wait_title-textvar(--semi-color-text-2)未到达步骤条标题文字颜色
$color-steps_item_warning_left-iconvar(--semi-color-warning)警告步骤条图标颜色
$color-steps_item_warning_left_number-iconvar(--semi-color-white)警告步骤条数字序号文本颜色
$color-steps_main-text-defaultvar(--semi-color-text-0)步骤条标题文本颜色
$color-steps_minor-text-defaultvar(--semi-color-text-2)步骤条辅助描述文本颜色
$color-steps_nav_item_container-textvar(--semi-color-text-2)步骤条容器内文本颜色
$color-steps_nav_item-iconvar(--semi-grey-3)
$color-steps_nav_item_title-text-activevar(--semi-color-text-0)步骤条标题颜色 - 按下态
$color-steps_primary-bg-defaultvar(--semi-color-primary)旧版进行中步骤条背景色 - 默认
$color-steps_primary-icon-defaultvar(--semi-color-primary)旧版进行中步骤条图标色 - 默认
$color-steps_process-bg-defaultvar(--semi-color-primary-light-default)旧版进行中步骤条背景色 - 默认
$color-steps_success-text-activevar(--semi-color-success-active)旧版已完成步骤条文字颜色 - 按下态
$color-steps_success-text-defaultvar(--semi-color-success)旧版已完成步骤条文字颜色 - 默认态
$color-steps_success-text-hovervar(--semi-color-success-hover)旧版已完成步骤条文字颜色 - 悬浮态
$color-steps_title_after-bgvar(--semi-color-fill-2)旧版步骤条连线颜色
$color-steps_warning-text-activevar(--semi-color-warning-active)旧版警告步骤条文字颜色 - 按下态
$color-steps_warning-text-defaultvar(--semi-color-warning)旧版警告步骤条文字颜色 - 默认态
$color-steps_warning-text-hovervar(--semi-color-warning-hover)旧版警告步骤条文字颜色 - 悬浮态
$width-steps_basic_item_description100%步骤条辅助描述文本宽度
$width-steps_basic_item_description-maxWidth268px步骤条辅助描述文本最大宽度
$width-steps_basic_item_title-maxWidth80%步骤条标题宽度
$height-steps_basic_vertical_icon_content-minHeight42px垂直步骤条图标+内容最小高度
$width-steps_basic_vertical_item_title-maxWidth100%垂直步骤条标题最大宽度
$width-steps_basic_vertical_item_description100%垂直步骤条辅助描述文本最大宽度
$height-steps_basic_vertical_small_item_content-minHeight40px小尺寸垂直步骤条内容最小高度
$height-steps_basic_item_left-icon24px步骤条左侧图标高度
$width-steps_basic_item_left_number-icon24px步骤条左侧图标宽度
$height-steps_basic_item_left_number-icon24px步骤条左侧图标高度
$height-steps_basic_small_item_left-icon20px小尺寸步骤条左侧图标高度
$width-steps_basic_small_item_left_number-icon20px小尺寸步骤条左侧数字图标高度
$height-steps_item72px旧版步骤条高度
$width-steps_item-border1px旧版步骤条高度
$width-steps_item_title100%步骤条标题宽度
$width-steps_item_description100%步骤条辅助描述文本宽度
$width-steps_item_left24px步骤条左侧图标容器宽度
$height-steps_item_left24px步骤条左侧图标容器高度
$width-steps_title_after9999px步骤条连接线长度
$height-steps_title_after1px步骤条连接线高度
$width-steps_vertical_icon_after1px
$height-steps_vertical_icon_after9999px垂直步骤条连接线长度
$width-steps_nav_item_icon-minWidth60px导航型步骤条图标最小宽度
$width-steps_nav_item_title-maxWidth17em导航型步骤条标题最大宽度
$spacing-steps_basic_item-paddingLeft16px简版步骤条左侧内边距
$spacing-steps_basic_vertical_item-paddingTop9px简版垂直步骤条顶部内边距
$spacing-steps_basic_vertical_item_content-paddingBottom22px简版垂直步骤条内容区底部内边距
$spacing-steps_basic_vertical_item_icon-paddingBottom9px简版垂直步骤条图标底部内边距
$spacing-steps_basic_item_left-marginRight8px简版步骤条图标右侧外边距
$spacing-steps_basic_item_title-paddingRight16px简版步骤条标题右侧内边距
$spacing-steps_basic_item_title-paddingBottom4px简版步骤条标题底部内边距
$spacing-steps_item-marginRight16px旧版步骤条右侧外边距
$spacing-steps_item-paddingY$spacing-base-tight旧版步骤条垂直方向内边距
$spacing-steps_item-paddingX$spacing-base旧版步骤条水平方向内边距
$spacing-steps_item_content-marginLeft$spacing-base旧版步骤条水平内容区左侧外边距
$radius-steps_basic_item_left_number_iconvar(--semi-border-radius-circle)步骤条左侧图标圆角
$radius-steps_itemvar(--semi-border-radius-medium)步骤条整体圆角
$radius-steps_item_left32px步骤条左侧距离
$font-steps_basic_item_left_number_icon-fontWeight600步骤条数字图标文本字重
$font-steps_basic_item_title-fontWeight600步骤条标题文本字重
$font-steps_basic_item_title-lineHeight24px步骤条标题文本行高
$font-steps_item_left-lineHeight32px步骤条标题左侧图标内部文本行高
$font-steps_nav_item_title-fontWeight$font-weight-regular导航型步骤条标题文本字重 - 默认态
$font-steps_nav_item_title_active-fontWeight600导航型步骤条标题文本字重 - 激活态