导航类

步骤

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

代码演示

如何引入

<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';
</script>

Steps.Step 也可以按名导入:Step。Step 的 title、description、icon 是插槽(#title、#description、#icon)。Steps 只识别直接子节点中的 Steps.Step,其他子节点不渲染、不占序号,开发环境给出警告;Step 在 Steps 之外不渲染任何内容。

默认步骤条(旧版)

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

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps :current="1" @change="log">
        <Steps.Step>
            <template #title>Finished</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>In Progress</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>Waiting</template>
            <template #description>This is a description</template>
        </Steps.Step>
    </Steps>
</template>

简单步骤条(新版)

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

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps :current="1" type="basic" @change="log">
        <Steps.Step>
            <template #title>Finished</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>In Progress</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>Waiting</template>
            <template #description>This is a description</template>
        </Steps.Step>
    </Steps>
</template>

导航步骤条

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

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

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

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

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

注册账号
这个项目的文字比较多多多多
产品用途
期待尝试功能
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <div :style="{ display: 'flex', justifyContent: 'center' }">
        <Steps :current="1" :style="{ margin: 'auto' }" type="nav" @change="log">
            <Steps.Step>
                <template #title>注册账号</template>
            </Steps.Step>
            <Steps.Step>
                <template #title>这个项目的文字比较多多多多</template>
            </Steps.Step>
            <Steps.Step>
                <template #title>产品用途</template>
            </Steps.Step>
            <Steps.Step>
                <template #title>期待尝试功能</template>
            </Steps.Step>
        </Steps>
    </div>
</template>

迷你尺寸步骤条

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

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps :current="1" size="small" type="basic" @change="log">
        <Steps.Step>
            <template #title>Finished</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>In Progress</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>Waiting</template>
            <template #description>This is a description</template>
        </Steps.Step>
    </Steps>
</template>
注册账号
这个项目的文字比较多多多多
产品用途
期待尝试功能
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <div :style="{ display: 'flex', justifyContent: 'center' }">
        <Steps :current="1" size="small" :style="{ margin: 'auto' }" type="nav" @change="log">
            <Steps.Step>
                <template #title>注册账号</template>
            </Steps.Step>
            <Steps.Step>
                <template #title>这个项目的文字比较多多多多</template>
            </Steps.Step>
            <Steps.Step>
                <template #title>产品用途</template>
            </Steps.Step>
            <Steps.Step>
                <template #title>期待尝试功能</template>
            </Steps.Step>
        </Steps>
    </div>
</template>

处理进度

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

1
First
2
Second
3
Last
First-content
代码
<script setup lang="ts">
    import { ref } from 'vue';
    import { Button, Steps } from '@fibrous/semi-ui-vue';

    const steps = [
        { title: 'First', content: 'First-content' },
        { title: 'Second', content: 'Second-content' },
        { title: 'Last', content: 'Last-content' },
    ];
    const current = ref(0);
    const log = (i: number) => console.log(i);
    const done = () => console.log('Processing complete!');
</script>

<template>
    <div>
        <Steps :current="current" type="basic" @change="log">
            <Steps.Step v-for="item in steps" :key="item.title">
                <template #title>{{ item.title }}</template>
            </Steps.Step>
        </Steps>
        <div class="steps-content" :style="{ marginTop: '4px', marginBottom: '4px' }">
            {{ steps[current].content }}
        </div>
        <div class="steps-action">
            <Button v-if="current < steps.length - 1" type="primary" @click="current += 1">Next</Button>
            <Button v-if="current === steps.length - 1" type="primary" @click="done">Done</Button>
            <Button v-if="current > 0" :style="{ marginLeft: '8px' }" @click="current -= 1">Previous</Button>
        </div>
    </div>
</template>

竖直方向的步骤条

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

Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps :current="1" direction="vertical" :style="{ width: '300px' }" @change="log">
        <Steps.Step>
            <template #title>Finished</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>In Progress</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>Waiting</template>
            <template #description>This is a description</template>
        </Steps.Step>
    </Steps>
</template>
Finished
This is a description
2
In Progress
This is a description
3
Waiting
This is a description
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps :current="1" direction="vertical" type="basic" @change="log">
        <Steps.Step>
            <template #title>Finished</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>In Progress</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>Waiting</template>
            <template #description>This is a description</template>
        </Steps.Step>
    </Steps>
</template>

指定步骤状态

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

Finished
This is a description
In Process
This is a description
3
Waiting
This is a description
代码
<script setup lang="ts">
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps :current="1" status="error" type="basic" @change="log">
        <Steps.Step>
            <template #title>Finished</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>In Process</template>
            <template #description>This is a description</template>
        </Steps.Step>
        <Steps.Step>
            <template #title>Waiting</template>
            <template #description>This is a description</template>
        </Steps.Step>
    </Steps>
</template>

自定义图标/状态

通过 Steps.Step 的 #icon 插槽,可以启用自定义图标;插槽存在但内容为空时不显示图标

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

已完成
错误
警告
正在进行
等待
代码
<script setup lang="ts">
    import { IconHome, IconLock } from '@fibrous/semi-icons-vue';
    import { Steps } from '@fibrous/semi-ui-vue';

    const log = (i: number) => console.log(i);
</script>

<template>
    <Steps type="basic" @change="log">
        <Steps.Step status="finish">
            <template #title>已完成</template>
        </Steps.Step>
        <Steps.Step status="error">
            <template #title>错误</template>
        </Steps.Step>
        <Steps.Step status="warning">
            <template #title>警告</template>
        </Steps.Step>
        <Steps.Step status="process">
            <template #title>正在进行</template>
            <template #icon>
                <IconHome size="extra-large" />
            </template>
        </Steps.Step>
        <Steps.Step status="wait">
            <template #title>等待</template>
            <template #icon>
                <IconLock size="extra-large" />
            </template>
        </Steps.Step>
    </Steps>
</template>

onChange 回调

通过 @change 监听步骤切换(Steps 的 onChange 是函数 prop,监听与否决定步骤是否可点击),回调接收一个 number 类型的参数,等于 initial 加所选步骤的索引;点击当前步骤不会触发。current 也支持 v-model:current,绑定后所有步骤同样变为可点击。

First
2
Second
3
Last
代码
<script setup lang="ts">
    import { ref } from 'vue';
    import { Steps } from '@fibrous/semi-ui-vue';

    const steps = [{ title: 'First' }, { title: 'Second' }, { title: 'Last' }];
    const current = ref(1);
</script>

<template>
    <div>
        <Steps v-model:current="current" type="basic">
            <Steps.Step v-for="item in steps" :key="item.title">
                <template #title>{{ item.title }}</template>
            </Steps.Step>
        </Steps>
    </div>
</template>

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

属性说明类型默认值
type步骤条类型,可选 fill、basic、nav。StepsTypesemiDefault("Steps", "type", "fill")
current当前步骤,从 0 开始计数;子 Step 可用 status 覆盖状态。numbersemiDefault("Steps", "current", 0)
initial起始序号,从 0 开始计数。numbersemiDefault("Steps", "initial", 0)
direction步骤条方向,可选 horizontal、vertical。StepsDirectionsemiDefault("Steps", "direction", "horizontal")
status当前步骤的状态,可选 wait、process、finish、error、warning。StepStatussemiDefault("Steps", "status", "process")
sizebasic 与 nav 类型的尺寸,可选 default、small。StepsSizesemiDefault("Steps", "size", "default")
hasLinebasic 类型是否显示连接线。booleansemiDefault("Steps", "hasLine", true)
prefixCls根元素的类名前缀。stringsemiDefault("Steps", "prefixCls", stepsClasses.PREFIX)
onChange点击或键盘选择步骤时调用,参数为该步骤序号(initial 加索引);点击当前步骤不调用。是函数 prop,使用方照常写 @change;传入后所有 Step 变为可点击。Type((current: number) => void)undefined
onUpdate:currentv-model:current 绑定的更新函数,行为与 onChange 一致。Type((current: number) => void)undefined

Events

事件说明回调参数
无

Slots

插槽说明作用域参数
defaultSteps.Step 子节点;每个元素或组件按顺序占一个步骤位置,空白和文本除外,包装 Step 的组件同样编号。any

Exposes

名称说明类型
无

class、style 与原生属性经 attrs 传入,落在 Steps 根元素上。

Steps.Step

步骤条内的每一个步骤。

Props

属性说明类型默认值
status该步骤自己的状态;缺省时随 Steps 的 current 与 status 自动决定。StepStatusundefined

Events

事件说明回调参数
无

Slots

插槽说明作用域参数
title标题。any
description详情描述;nav 类型不渲染。any
icon自定义图标,提供后替换状态图标,内容为空则不显示图标;nav 类型不渲染。any

Exposes

名称说明类型
无

class、style、aria-*、role、tabindex 与 @click、@keydown 等原生属性和事件经 attrs 落在 Step 的根元素上。使用方的 @click 让该 Step 可点击;Steps 的 onChange 先于 Step 自身的 @click 执行。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导航型步骤条标题文本字重 - 激活态