代码演示
如何引入
<script lang="ts">
import { Timeline } from '@fibrae/semi-ui-svelte';
</script>
基本用法
Svelte 版不提供 Timeline.Item,节点统一写在 dataSource 中:time、extra、content 是字符串或数字,type、color 设置圆点样式。
- 第一个节点内容2019-07-14 10:35
- 第二个节点内容2019-06-13 16:17
- 第三个节点内容2019-05-14 18:34
代码
<script lang="ts">
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', content: '第一个节点内容' },
{ time: '2019-06-13 16:17', content: '第二个节点内容' },
{ time: '2019-05-14 18:34', content: '第三个节点内容' },
];
</script>
<Timeline {dataSource} />节点类型
通过 type 可以设置节点类型,对应原点会变成相应的颜色,可选:default,ongoing, success, warning, error。
- 审核中2019-07-14 10:35
- 发布成功2019-06-13 16:17
- 审核失败2019-05-14 18:34
代码
<script lang="ts">
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', content: '审核中', type: 'ongoing' },
{ time: '2019-06-13 16:17', content: '发布成功', type: 'success' },
{ time: '2019-05-14 18:34', content: '审核失败', type: 'error' },
];
</script>
<Timeline {dataSource} />自定义节点
可以通过 dataSource 项的 dot snippet 自定义该节点的图标,color 自定义圆点色值;未设置 dot 的节点画默认圆点。通过 content snippet 为节点内容设置样式。时间与辅助内容使用 time、extra snippet,参数都是 { item, index }。
- 默认样式的节点2019-07-14 10:35
- 自定义图标2019-06-13 16:17
- 自定义节点颜色2019-05-14 18:34
- 自定义节点样式2019-04-10 12:20
代码
<script lang="ts">
import { IconAlertTriangle } from '@fibrae/semi-icons-svelte';
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', content: '默认样式的节点' },
{ time: '2019-06-13 16:17', content: '自定义图标', type: 'warning', dot: warningDot },
{ time: '2019-05-14 18:34', content: '自定义节点颜色', color: 'pink' },
{ time: '2019-04-10 12:20', content: '自定义节点样式' },
];
</script>
{#snippet warningDot()}<IconAlertTriangle />{/snippet}
<Timeline {dataSource}>
{#snippet content({ item, index })}
{#if index === 3}
<span style="font-size: 18px">{item.content}</span>
{:else}
{item.content}
{/if}
{/snippet}
</Timeline>时间轴位置
通过 mode 属性可以设置时间的位置,共有 4 种模式可选:left, center, alternate, right。
时间轴在左侧(默认)
- 第一个节点内容节点辅助说明信息2019-07-14 10:35
- 第二个节点内容节点辅助说明信息2019-06-13 16:17
- 第三个节点内容节点辅助说明信息2019-05-14 18:34
- 第四个节点内容节点辅助说明信息2019-05-09 09:12
代码
<script lang="ts">
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', extra: '节点辅助说明信息', content: '第一个节点内容' },
{ time: '2019-06-13 16:17', extra: '节点辅助说明信息', content: '第二个节点内容' },
{ time: '2019-05-14 18:34', extra: '节点辅助说明信息', content: '第三个节点内容' },
{ time: '2019-05-09 09:12', extra: '节点辅助说明信息', content: '第四个节点内容' },
];
</script>
<Timeline {dataSource} mode="left" />时间节点在左侧
- 第一个节点内容节点辅助说明信息2019-07-14 10:35
- 第二个节点内容节点辅助说明信息2019-06-13 16:17
- 第三个节点内容节点辅助说明信息2019-05-14 18:34
- 第四个节点内容节点辅助说明信息2019-05-09 09:12
代码
<script lang="ts">
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', extra: '节点辅助说明信息', content: '第一个节点内容' },
{ time: '2019-06-13 16:17', extra: '节点辅助说明信息', content: '第二个节点内容' },
{ time: '2019-05-14 18:34', extra: '节点辅助说明信息', content: '第三个节点内容' },
{ time: '2019-05-09 09:12', extra: '节点辅助说明信息', content: '第四个节点内容' },
];
</script>
<Timeline {dataSource} mode="center" />交替展现
交替只按实际渲染的子项计算,条件为假而没有渲染的子节点不占位。
- 第一个节点内容节点辅助说明信息2019-07-14 10:35
- 第二个节点内容节点辅助说明信息2019-06-13 16:17
- 第三个节点内容节点辅助说明信息2019-05-14 18:34
- 第四个节点内容节点辅助说明信息2019-05-09 09:12
代码
<script lang="ts">
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', extra: '节点辅助说明信息', content: '第一个节点内容' },
{ time: '2019-06-13 16:17', extra: '节点辅助说明信息', content: '第二个节点内容' },
{ time: '2019-05-14 18:34', extra: '节点辅助说明信息', content: '第三个节点内容' },
{ time: '2019-05-09 09:12', extra: '节点辅助说明信息', content: '第四个节点内容' },
];
</script>
<Timeline {dataSource} mode="alternate" />时间轴在右侧
- 第一个节点内容节点辅助说明信息2019-07-14 10:35
- 第二个节点内容节点辅助说明信息2019-06-13 16:17
- 第三个节点内容节点辅助说明信息2019-05-14 18:34
- 第四个节点内容节点辅助说明信息2019-05-09 09:12
代码
<script lang="ts">
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{ time: '2019-07-14 10:35', extra: '节点辅助说明信息', content: '第一个节点内容' },
{ time: '2019-06-13 16:17', extra: '节点辅助说明信息', content: '第二个节点内容' },
{ time: '2019-05-14 18:34', extra: '节点辅助说明信息', content: '第三个节点内容' },
{ time: '2019-05-09 09:12', extra: '节点辅助说明信息', content: '第四个节点内容' },
];
</script>
<Timeline {dataSource} mode="right" />使用 dataSource
dataSource 项的 content、time、extra 只接受字符串或数字;自定义内容使用 snippet content、time、extra,参数为 { item, index };自定义圆点使用项的 dot snippet,无参数。
- 第一个节点内容节点辅助说明信息2019-07-14 10:35
- 第二个节点内容节点辅助说明信息2019-06-13 16:17
- 第三个节点内容节点辅助说明信息2019-05-14 18:34
- 第四个节点内容节点辅助说明信息2019-05-09 09:12
代码
<script lang="ts">
import { IconAlertTriangle } from '@fibrae/semi-icons-svelte';
import { Timeline, type TimelineData } from '@fibrae/semi-ui-svelte';
const dataSource: TimelineData[] = [
{
time: '2019-07-14 10:35',
extra: '节点辅助说明信息',
content: '第一个节点内容',
type: 'ongoing',
},
{
time: '2019-06-13 16:17',
extra: '节点辅助说明信息',
content: '第二个节点内容',
color: 'pink',
},
{
time: '2019-05-14 18:34',
extra: '节点辅助说明信息',
content: '第三个节点内容',
type: 'warning',
dot: warningDot,
},
{
time: '2019-05-09 09:12',
extra: '节点辅助说明信息',
content: '第四个节点内容',
type: 'success',
},
];
</script>
{#snippet warningDot()}<IconAlertTriangle />{/snippet}
<Timeline {dataSource} mode="alternate">
{#snippet content({ item, index })}
{#if index === 1}
<span style="font-size: 18px">{item.content}</span>
{:else}
{item.content}
{/if}
{/snippet}
</Timeline>API 参考
TimeLine
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| content | dataSource 每一项内容的 snippet,参数 { item, index },缺省渲染 item.content。 | TypeSnippet<[TimelineSnippetProps]> | - |
| dataSource | 数据数组,按数据渲染各节点;项的字段见下表,其中 dot 为该节点自定义圆点的 snippet,未设置时画默认圆点。 | TimelineData[] | - |
| extra | dataSource 每一项辅助说明的 snippet,参数 { item, index },缺省渲染 item.extra。 | TypeSnippet<[TimelineSnippetProps]> | - |
| mode | 时间轴与内容的相对位置,可选 left、right、center、alternate。 | TimelineMode | "left" |
| time | dataSource 每一项时间的 snippet,参数 { item, index },缺省渲染 item.time。 | TypeSnippet<[TimelineSnippetProps]> | - |
class、style(字符串)与原生属性(如 id、aria-label)落在根元素 ul 上。
dataSource 项的字段:
| 字段 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| content | 节点内容,自定义内容使用 content snippet | string | number | - |
| time | 时间文本,自定义内容使用 time snippet | string | number | - |
| extra | 辅助内容,自定义内容使用 extra snippet | string | number | - |
| dot | 自定义圆点,未设置时画默认圆点 | Snippet | - |
| color | 自定义的圆圈色值 | string | - |
| type | 当前圆圈的模式 | 'default' | 'ongoing' | 'success' | 'warning' | 'error' | default |
| position | 自定义节点位置,可以覆盖 TimeLine 的模式选项 | 'left' | 'right' | - |
| onClick | 点击节点的回调,参数为 MouseEvent;点击 extra 区域不会触发 | (event: MouseEvent) => void | - |
| class | li 的类名 | ClassValue | - |
| style | li 的样式字符串 | string | - |
TimeLine.Item
Svelte 版没有 TimeLine.Item,节点由 dataSource 的项表示,字段见上方表格:class、style 与其他 li 属性写在项里并落在 li 上;有 onClick 时,内容区域带 role="button" 与 tabindex="0",支持 Enter 和 Space。time、extra 为空时不渲染对应容器。
Accessibility
ARIA
- 组件中时间点的连线以及时间点本身被设置了
aria-hidden,不会响应 Accessibility API - 可以通过传入
aria-label设置 TimeLine 组件的标签
<script lang="ts">
import { Timeline } from '@fibrae/semi-ui-svelte';
const dataSource = [
{ time: '2015-09-01', content: '创建服务现场' },
{ time: '2015-09-02', content: '初步排除网络异常' },
];
</script>
<Timeline aria-label="xx事故处理过程时间线" {dataSource} />
设计变量
| Sass 变量 | 值 | 用法 |
|---|---|---|
| $color-timeline_dot_default-bg-default | var(--semi-color-primary) | 时间轴节点圆点背景色 - 进行中 |
| $color-timeline_dot_success-bg-default | var(--semi-color-success) | 时间轴节点圆点背景色 - 成功 |
| $color-timeline_dot_warning-bg-default | var(--semi-color-warning) | 时间轴节点圆点背景色 - 警告 |
| $color-timeline_dot_error-bg-default | var(--semi-color-danger) | 时间轴节点圆点背景色 - 错误 |
| $color-timeline_dot_info-bg-default | var(--semi-color-tertiary-light-active) | 时间轴节点圆点背景色 - 默认 |
| $color-timeline_tail-border | var(--semi-color-text-3) | 时间轴连线颜色 |
| $color-timeline_time_default-text-default | var(--semi-color-text-2) | 时间轴文字颜色 - 默认 |
| $color-timeline_item_head-bg | transparent | 时间轴头部背景颜色 |
| $color-timeline_item_content-text-default | var(--semi-color-text-0) | 时间轴标题文字颜色 |
| $spacing-timeline-margin | $spacing-none | 时间轴整体外边距 |
| $spacing-timeline-padding | $spacing-tight | 时间轴整体内边距 |
| $spacing-timeline_tail-top | $spacing-base-loose | 时间轴连线顶部位置 |
| $spacing-timeline_tail-left | $spacing-extra-tight | 时间轴连线左侧位置 |
| $spacing-timeline_head-top | 5px | 时间轴节点圆点顶部位置 |
| $spacing-timeline_head_custom-top | 10px | 时间轴自定义图标节点圆点顶部位置 |
| $spacing-timeline_head_custom-left | 5px | 时间轴自定义图标节点圆点左侧位置 |
| $spacing-timeline_content-marginLeft | 25px | 时间轴内容左侧外边距 |
| $spacing-timeline_time-marginTop | $spacing-extra-tight | 时间轴时间文本顶部外边距 |
| $spacing-timeline_time-top | -2px | 时间轴时间文本顶部位置 |
| $spacing-timeline_item-margin | $spacing-none | 时间轴各节点外边距 |
| $spacing-timeline_item-paddingBottom | $spacing-loose | 时间轴各节点底部外边距 |
| $spacing-timeline_item_content_time-marginLeft | calc(-40px - 100%) | 时间轴时间文本左侧外边距 |
| $spacing-timeline_item_right_item-left | calc(100% - 9px) | 时间轴在右侧时,各节点左侧位置 |
| $spacing-timeline_item_right_item_content | $spacing-none | 时间轴在右侧时,各节点内容外边距 |
| $spacing-timeline_item_left_item_content-left | calc(50% - 4px) | |
| $spacing-timeline_item_head_custom-left | 50% | |
| $spacing-timeline_item_head-marginLeft | -4px | |
| $width-timeline | 100% | 时间轴整体宽度 |
| $width-timeline_dot | 9px | 时间轴节点圆点宽度 |
| $width-timeline_head_custom | auto | 时间轴节点自定义图标宽度 |
| $width-timeline_tail-border | $border-thickness-control | 时间轴连线宽度 |
| $width-timeline_head_custom-border | $border-thickness | 时间轴自定义连线宽度 |
| $width-timeline_item_content_time | 100% | 时间轴时间文本宽度 |
| $width-timeline_item_right_content | calc(100% - 28px) | |
| $width-timeline_item_left_item_content | calc(50% - 14px) | |
| $width-timeline_item_right_item_content | calc(50% - 20px) | |
| $height-timline_tail | calc(100% - 20px) | 时间轴连线高度 |
| $height-timeline_head_custom | auto | 时间轴自定义连线高度 |
| $radius-timeline_head | var(--semi-border-radius-circle) | 时间轴节点圆点圆角 |
| $radius-timeline_head_custom | 0 | 时间轴节点自定义图标圆角 |
| $motion-timeline_head_custom-transform | translate(-50%, -50%) | |
| $motion-timeline_head_custom-transform-rtl | translate(50%, -50%) |