iter(g174): 时间线支持双侧交替

This commit is contained in:
HIsheR
2026-10-26 16:21:48 +08:00
parent 7084fe1feb
commit 2316445b1e
7 changed files with 63 additions and 12 deletions
+6 -2
View File
@@ -11,10 +11,14 @@ function node(item: TimelineItem, pending: boolean): HTMLElement {
return h('li', { class: `ua-tl-item${pending ? ' is-pending' : ''}` }, dot, h('div', { class: 'ua-tl-body' }, head, body));
}
/*** 时间线:纵向事件流,mode 决定轴线在左还是在右;pending 为真时末尾补一个进行中节点 ***/
/*** 时间线:纵向事件流,mode 决定轴线在左 / 右 / 双侧交替;pending 为真时末尾补一个进行中节点 ***/
export function timeline(props: TimelineProps): HTMLElement {
const rows: TimelineItem[] = [...props.items]; // 复制入参,避免改动调用方数组
if (props.pending) rows.push({ title: '进行中…' }); // 尾部虚节点表示流程尚未结束
const items = rows.map((row, i) => node(row, !!props.pending && i === rows.length - 1));
const items = rows.map((row, i) => {
const el = node(row, !!props.pending && i === rows.length - 1);
if (props.mode === 'alternate') el.classList.add(i % 2 ? 'is-right' : 'is-left'); // 交替排布:奇偶决定左右,轴线由样式表居中
return el;
});
return h('ol', { class: `ua-tl ua-tl-${props.mode ?? 'left'}` }, ...items);
}
+1 -1
View File
@@ -435,7 +435,7 @@ export interface TimelineItem {
/*** 时间线入参 ***/
export interface TimelineProps {
items: TimelineItem[]; // 条目列表,按时间顺序自上而下
mode?: 'left' | 'right'; // 轴线与节点所在侧;缺省 left(内容在右)
mode?: 'left' | 'right' | 'alternate'; // 轴线位置:left / right 单侧,alternate 双侧交替(轴线居中,窄屏自动退回左侧);缺省 left
pending?: boolean; // 末尾追加「进行中」虚线节点,表示流程未结束;缺省 false
}
+4 -3
View File
@@ -1920,8 +1920,8 @@
},
{
"n": "mode",
"t": "'left' | 'right'",
"d": "轴线与节点所在侧;缺省 left(内容在右),right 时内容左对齐轴线居右",
"t": "'left' | 'right' | 'alternate'",
"d": "轴线位置:left / right 单侧排布;alternate 双侧交替(轴线居中、奇偶左右分列,窄屏自动退回左侧)",
"df": "left"
},
{
@@ -1938,7 +1938,8 @@
"time 是纯展示文案,格式自由('09:12' / '10-23 18:00'),组件不做日期解析",
"流程未结束时传 pending: true,末尾自动补一个虚线脉冲节点,完成后置回 false 即消失",
"需要轴线居右(如右侧栏时间流)时传 mode: 'right',条目与节点整体镜像",
"content 为纯文本;需要按钮等交互内容时改用 accordion / card 组合"
"content 为纯文本;需要按钮等交互内容时改用 accordion / card 组合",
"要做里程碑式双侧时间线就传 mode: 'alternate':轴线居中、条目按奇偶分列左右并在窄屏退回单侧,pending 虚节点同样参与交替计数"
]
},
{
+35
View File
@@ -2156,6 +2156,41 @@ button.ua-step-dot:hover {
.ua-tl-right .ua-tl-item:last-child {
padding-bottom: 0;
}
.ua-tl-alternate::before {
left: 50%; /* 双侧交替:轴线居中,圆点贴中线 */
}
.ua-tl-alternate .ua-tl-item {
width: 50%;
padding: 0 var(--ua-space-3) var(--ua-space-3) 0;
}
.ua-tl-alternate .ua-tl-item.is-left {
text-align: right;
}
.ua-tl-alternate .ua-tl-item.is-right {
margin-left: 50%;
padding: 0 0 var(--ua-space-3) var(--ua-space-3);
text-align: left;
}
.ua-tl-alternate .ua-tl-dot {
left: auto;
right: -5px;
}
.ua-tl-alternate .is-right .ua-tl-dot {
left: -5px;
right: auto;
}
@media (max-width: 640px) {
.ua-tl-alternate::before { left: 5px; }
.ua-tl-alternate .ua-tl-item,
.ua-tl-alternate .ua-tl-item.is-right {
width: auto;
margin-left: 0;
padding: 0 0 var(--ua-space-3) 22px;
text-align: left;
}
.ua-tl-alternate .ua-tl-dot,
.ua-tl-alternate .is-right .ua-tl-dot { left: 0; right: auto; }
}
.ua-tl-dot {
position: absolute;
left: 0;