分割线Divider
在内容之间画一条细分隔线;带文字时用于分区标题
通用 规格 8 · 分割线 Divider 6 端实现 触摸优先
<!-- ① 令牌:PC 令牌 + 移动端 --kole-m-* 合成单文件,引一次 -->
<link rel="stylesheet" href="kole-ui/mobile/tokens.css">
<!-- ② 本组件样式(全量则用 kole-ui/mobile/components/index.css) -->
<link rel="stylesheet" href="kole-ui/mobile/components/mobile-divider.css">
<!-- ③ 结构照抄下方任一演示块(类名与 6 端实现一致) -->
演示
每个演示都是真实渲染:预览帧加载 frameworks-mobile/Divider.html?demo=<id>(只显示该演示块),代码是该演示块在演示页里的原文,可复制。全部演示同屏可看 演示页 ↗。
01 组件类型
一条 1px 的水平分隔线。
查看代码(演示页原文 · 8 行)
<section class="demo-block" data-demo="basic">
<p class="demo-label">基础用法(水平 1px)</p>
<div class="demo-box">
<p class="demo-text" style="padding-top: var(--kole-space-12)">上一段内容</p>
<div class="kole-m-divider" role="separator" aria-hidden="true" data-assert="divider-basic"></div>
<p class="demo-text">下一段内容</p>
</div>
</section>文字两侧各一条线,用作分区标题。
查看代码(演示页原文 · 8 行)
<section class="demo-block" data-demo="text-center">
<p class="demo-label">带文字(align=center,文字两侧各一条线)</p>
<div class="demo-box">
<div class="kole-m-divider kole-m-divider--text kole-m-divider--center" role="separator" data-assert="divider-text-center">
<span class="kole-m-divider__text">2026-09-20</span>
</div>
</div>
</section>左/右对齐时另一侧的线自然变长。
查看代码(演示页原文 · 11 行)
<section class="demo-block" data-demo="align">
<p class="demo-label">文字对齐(align=left / right:short 侧收到 0,文字贴边)</p>
<div class="demo-box">
<div class="kole-m-divider kole-m-divider--text kole-m-divider--left" role="separator" data-assert="divider-align-left">
<span class="kole-m-divider__text">左对齐分组</span>
</div>
<div class="kole-m-divider kole-m-divider--text kole-m-divider--right" role="separator" data-assert="divider-align-right">
<span class="kole-m-divider__text">右对齐分组</span>
</div>
</div>
</section>02 组件状态
行内并列元素之间用垂直分割线,高度跟随父容器。
查看代码(演示页原文 · 12 行)
<section class="demo-block" data-demo="vertical">
<p class="demo-label">垂直分割线(orientation=vertical,高度跟随父容器)</p>
<div class="demo-box" style="padding-top: var(--kole-space-16)">
<div class="demo-row" data-assert="divider-vertical">
<span>已发货</span>
<div class="kole-m-divider kole-m-divider--vertical" role="separator" aria-hidden="true"></div>
<span>顺丰标快</span>
<div class="kole-m-divider kole-m-divider--vertical" role="separator" aria-hidden="true"></div>
<span>预计 09-22 送达</span>
</div>
</div>
</section>虚线用于弱分隔(如「没有更多了」)。
查看代码(演示页原文 · 7 行)
<section class="demo-block" data-demo="dashed">
<p class="demo-label">虚线(dashed=true:弱分隔,如「没有更多了」)</p>
<div class="demo-box">
<div class="kole-m-divider kole-m-divider--dashed" role="separator" aria-hidden="true" data-assert="divider-dashed"></div>
<p class="demo-text" style="text-align: center; padding-top: var(--kole-space-12)">没有更多了</p>
</div>
</section>API
props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs
Props
| 名称 | 类型 | 默认值 | 说明 | 必传 |
|---|---|---|---|---|
orientation | 'horizontal' | 'vertical' | 'horizontal' | 变体 orientation(规格 §8.3) | N |
align | 'left' | 'center' | 'right' | 'center' | 变体 align:带文字时的对齐方式(规格 §8.3) | N |
dashed | boolean | false | 变体 dashed:虚线(规格 §8.3) | N |
「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。
事件
| 名称 | 参数 | 说明 |
|---|
插槽
| 名称 | 说明 |
|---|---|
default | 可选文字,居中或左/右对齐(规格 §8.2) |
CSS 变量
组件级变量(在组件样式表里定义)。业务侧可在自己的作用域内覆盖,不必改组件源码。
| 名称 | 默认值 | 说明 |
|---|---|---|
| 本组件没有组件级 CSS 变量 | ||
何时使用
- 在内容之间画一条细分隔线;带文字时用于分区标题
- 纯静态,不参与点击与手势
- 垂直分割线高度跟随父容器(用 align-self: stretch)
- 纯装饰:role=separator + aria-hidden=true(对读屏无信息量)
交互与触控
- 纯静态,不参与点击与手势
- 垂直分割线高度跟随父容器(用 align-self: stretch)
无障碍
- 纯装饰:role="separator" + aria-hidden="true"(对读屏无信息量)
- 带文字的分割线不隐藏,文字本身即语义
相似组件
从「该用哪一个」的角度区分;PC 端的对应实现见 PC 文档站。
| 组件 | 何时用它而不是本组件 |
|---|---|
| 单元格Cell | 单元格自带行间分隔线,列表里不需要再插分割线 |
| 单元格Cell | 列表单元格自带内容分隔;独立内容区之间才使用分割线 |
规格未定 / 禁止发明
| 类别 | 条目 |
|---|---|
| 禁止发明 | 主题化分割线(渐变、图片)的表现 |
| 规格未定 | 垂直分割线的推荐间距 |
结构(anatomy)
| 字段 | 说明 |
|---|---|
divider | 根元素,水平时为 1px 高 |
text | 可选文字,居中或左/右对齐 |
line | 文字两侧的线 |
变体维度与类名映射
类名映射由构建脚本从契约 variantClasses 生成,并被 verify:mobile-docs 逐条对照组件 CSS 校验(类/变量必须真实存在)。
| 维度 | 取值 | 对应类名 / 变量 |
|---|---|---|
orientation | horizontal / vertical | horizontal (由数据驱动,无专属类) vertical .kole-m-divider--vertical |
align | left / center / right | left .kole-m-divider--left center .kole-m-divider--center right .kole-m-divider--right |
dashed | false / true | false (由数据驱动,无专属类) true .kole-m-divider--dashed |
代表变体
| 变体 | 标签 |
|---|---|
orientation=horizontal · align=center | 水平分割线 |
orientation=horizontal · align=left | 带文字(左对齐) |
orientation=horizontal · align=center | 带文字(居中) |
orientation=vertical · align=center | 垂直分割线 |
用到的令牌
构建时从本组件样式表扫描得出。蓝色为移动端自有令牌,绿色为继承的 PC 令牌(改一处两端生效)。
6 端源码
同一组件的六份实现(生产环境的类名与结构一致,差异只在技术栈写法与单位)。点开查看,右侧可复制。
frameworks-mobile/Divider.css · 纯样式(CSS) · 70 行
/* Kole UI Mobile · Divider 样式 — 对齐移动端规格 §8
分割线:纯静态(不参与点击与手势);水平 1px,垂直跟随父容器高度;
带文字时线由 ::before/::after 承担,对齐方式由 --left/--center/--right 决定。 */
.kole-m-divider {
box-sizing: border-box;
display: block;
height: 1px;
margin: var(--kole-space-8) 0;
border: 0;
background: var(--kole-color-border);
}
/* 变体 dashed:虚线(弱分隔) */
.kole-m-divider--dashed {
height: 0;
background: none;
border-top: 1px dashed var(--kole-color-border);
}
/* 带文字:变成一行「线 + 文字 + 线」 */
.kole-m-divider--text {
display: flex;
align-items: center;
gap: var(--kole-space-8);
height: auto;
margin: var(--kole-space-12) 0;
background: none;
color: var(--kole-color-text-secondary);
font-family: inherit;
font-size: var(--kole-m-font-size-label);
line-height: 1.4;
}
.kole-m-divider--text::before,
.kole-m-divider--text::after {
content: '';
flex: 1 1 auto;
height: 1px;
background: var(--kole-color-border);
}
.kole-m-divider--text.kole-m-divider--dashed::before,
.kole-m-divider--text.kole-m-divider--dashed::after {
background: none;
border-top: 1px dashed var(--kole-color-border);
height: 0;
}
/* 变体 align:文字两侧线的分配(左/右对齐时把短边收到 16px) */
.kole-m-divider--center::before,
.kole-m-divider--center::after { flex: 1 1 auto; }
.kole-m-divider--left::before { content: none; }
.kole-m-divider--left::after { flex: 1 1 auto; }
.kole-m-divider--right::after { content: none; }
.kole-m-divider--right::before { flex: 1 1 auto; }
/* 变体 orientation=vertical:跟随父容器高度 */
.kole-m-divider--vertical {
display: inline-block;
width: 1px;
height: auto;
min-height: 1em;
align-self: stretch;
margin: 0 var(--kole-space-8);
background: var(--kole-color-border);
}
.kole-m-divider__text { flex: 0 0 auto; }
frameworks-mobile/Divider.html · H5 原生(无框架) · 96 行
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>Kole UI Mobile · Divider(H5)</title>
<link rel="stylesheet" href="../.design_library/kole-ui-mobile/colors_and_type.css">
<link rel="stylesheet" href="Divider.css">
<style>
body { margin: 0; background: var(--kole-color-page-bg); font-family: var(--kole-font-family); color: var(--kole-color-text-body); }
.demo { max-width: 375px; margin: 0 auto; padding: var(--kole-m-gutter) 0; }
.demo-label { margin: 0; padding: var(--kole-space-12) var(--kole-m-gutter) var(--kole-space-8);
font-size: var(--kole-m-font-size-label); color: var(--kole-color-text-secondary); }
.demo-box { padding: 0 var(--kole-m-gutter) var(--kole-space-16); background: var(--kole-color-card-bg);
border-block: 1px solid var(--kole-color-border); }
.demo-text { margin: 0; font-size: var(--kole-m-font-size-label); color: var(--kole-color-text-secondary); }
.demo-row { display: flex; align-items: center; gap: var(--kole-space-8); font-size: var(--kole-m-font-size-label); }
.demo-block[hidden] { display: none; }
</style>
</head>
<body>
<div class="demo">
<section class="demo-block" data-demo="basic">
<p class="demo-label">基础用法(水平 1px)</p>
<div class="demo-box">
<p class="demo-text" style="padding-top: var(--kole-space-12)">上一段内容</p>
<div class="kole-m-divider" role="separator" aria-hidden="true" data-assert="divider-basic"></div>
<p class="demo-text">下一段内容</p>
</div>
</section>
<section class="demo-block" data-demo="text-center">
<p class="demo-label">带文字(align=center,文字两侧各一条线)</p>
<div class="demo-box">
<div class="kole-m-divider kole-m-divider--text kole-m-divider--center" role="separator" data-assert="divider-text-center">
<span class="kole-m-divider__text">2026-09-20</span>
</div>
</div>
</section>
<section class="demo-block" data-demo="align">
<p class="demo-label">文字对齐(align=left / right:short 侧收到 0,文字贴边)</p>
<div class="demo-box">
<div class="kole-m-divider kole-m-divider--text kole-m-divider--left" role="separator" data-assert="divider-align-left">
<span class="kole-m-divider__text">左对齐分组</span>
</div>
<div class="kole-m-divider kole-m-divider--text kole-m-divider--right" role="separator" data-assert="divider-align-right">
<span class="kole-m-divider__text">右对齐分组</span>
</div>
</div>
</section>
<section class="demo-block" data-demo="vertical">
<p class="demo-label">垂直分割线(orientation=vertical,高度跟随父容器)</p>
<div class="demo-box" style="padding-top: var(--kole-space-16)">
<div class="demo-row" data-assert="divider-vertical">
<span>已发货</span>
<div class="kole-m-divider kole-m-divider--vertical" role="separator" aria-hidden="true"></div>
<span>顺丰标快</span>
<div class="kole-m-divider kole-m-divider--vertical" role="separator" aria-hidden="true"></div>
<span>预计 09-22 送达</span>
</div>
</div>
</section>
<section class="demo-block" data-demo="dashed">
<p class="demo-label">虚线(dashed=true:弱分隔,如「没有更多了」)</p>
<div class="demo-box">
<div class="kole-m-divider kole-m-divider--dashed" role="separator" aria-hidden="true" data-assert="divider-dashed"></div>
<p class="demo-text" style="text-align: center; padding-top: var(--kole-space-12)">没有更多了</p>
</div>
</section>
</div>
<script>
/* ?demo=<id> → 只显示该演示块(文档站按块预览用;无参数时全部显示,测试与回归走无参数路径) */
(function () {
var id = new URLSearchParams(location.search).get('demo');
if (!id) return;
var blocks = Array.prototype.slice.call(document.querySelectorAll('.demo-block'));
var hit = false;
blocks.forEach(function (b) {
var on = b.getAttribute('data-demo') === id;
if (on) hit = true;
b.hidden = !on;
});
if (!hit) { blocks.forEach(function (b) { b.hidden = false; }); return; }
document.body.classList.add('demo-single');
blocks.forEach(function (b) {
var label = b.querySelector('.demo-label');
if (label && !b.hidden) label.hidden = true;
});
})();
</script>
</body>
</html>
frameworks-mobile/Divider.jsx · React · 26 行
import React from 'react';
import './Divider.css';
/* 分割线(移动端)— 规格 §8;纯装饰(role=separator + aria-hidden),带文字时不隐藏 */
export default function Divider({
orientation = 'horizontal',
align = 'center',
dashed = false,
children = null,
}) {
const withText = !!children;
const cls =
'kole-m-divider' +
(withText ? ' kole-m-divider--text' : '') +
` kole-m-divider--${align}` +
(dashed ? ' kole-m-divider--dashed' : '') +
(orientation === 'vertical' ? ' kole-m-divider--vertical' : '');
/* 纯装饰的分割线对读屏无信息量 → aria-hidden;带文字时文字本身即语义 */
return (
<div className={cls} role="separator" aria-hidden={withText ? undefined : 'true'}>
{withText ? <span className="kole-m-divider__text">{children}</span> : null}
</div>
);
}
frameworks-mobile/Divider.vue2.vue · Vue 2 · 37 行
<template>
<div
class="kole-m-divider"
:class="dividerClass"
role="separator"
:aria-hidden="hasText ? null : 'true'"
>
<span v-if="hasText" class="kole-m-divider__text"><slot>分割线</slot></span>
</div>
</template>
<script>
export default {
name: 'KoleMDivider',
props: {
orientation: { type: String, default: 'horizontal' },
align: { type: String, default: 'center' },
dashed: { type: Boolean, default: false }
},
computed: {
hasText: function () {
return !!(this.$slots.default && this.$slots.default.length);
},
dividerClass: function () {
return [
this.orientation === 'vertical' ? 'kole-m-divider--vertical' : '',
this.hasText ? 'kole-m-divider--text' : '',
'kole-m-divider--' + this.align,
this.dashed ? 'kole-m-divider--dashed' : ''
].filter(Boolean);
}
}
};
</script>
<style src="./Divider.css"></style>
frameworks-mobile/Divider.vue3.vue · Vue 3 · 32 行
<template>
<div
class="kole-m-divider"
:class="dividerClass"
role="separator"
:aria-hidden="hasText ? null : 'true'"
>
<span v-if="hasText" class="kole-m-divider__text"><slot>分割线</slot></span>
</div>
</template>
<script setup>
import { computed, useSlots } from 'vue';
const props = defineProps({
orientation: { type: String, default: 'horizontal' },
align: { type: String, default: 'center' },
dashed: { type: Boolean, default: false }
});
const slots = useSlots();
const hasText = computed(() => !!slots.default);
const dividerClass = computed(() => [
props.orientation === 'vertical' ? 'kole-m-divider--vertical' : '',
hasText.value ? 'kole-m-divider--text' : '',
`kole-m-divider--${props.align}`,
props.dashed ? 'kole-m-divider--dashed' : ''
].filter(Boolean));
</script>
<style src="./Divider.css"></style>
frameworks-mobile/Divider.uniapp.vue · uni-app(跨端:小程序 / App / H5) · 80 行
<template>
<view class="kole-m-divider" :class="dividerClass">
<text v-if="hasText" class="kole-m-divider__text"><slot>分割线</slot></text>
</view>
</template>
<script setup>
/* uni-app 端 · 分割线(移动端)— 规格 §8
跨端差异:用 view / text 结构,尺寸用 rpx(2rpx ≈ 1px);带文字时两侧的线仍用
::before / ::after(H5 / App / 微信小程序三端均支持伪元素),只有 :focus 一类
交互态不需要——分割线是纯静态组件。 */
import { computed, useSlots } from 'vue';
const props = defineProps({
orientation: { type: String, default: 'horizontal' },
align: { type: String, default: 'center' },
dashed: { type: Boolean, default: false }
});
const slots = useSlots();
const hasText = computed(() => !!slots.default);
const dividerClass = computed(() => [
props.orientation === 'vertical' ? 'kole-m-divider--vertical' : '',
hasText.value ? 'kole-m-divider--text' : '',
`kole-m-divider--${props.align}`,
props.dashed ? 'kole-m-divider--dashed' : ''
].filter(Boolean));
</script>
<style>
/* rpx 化的移动端令牌(与其它 uni-app 端组件同一写法):静态组件也要引令牌层,
否则「只抄了 PC 令牌」——门禁 U8 会拦。 */
.kole-m-divider {
--kole-m-font-size-label: 28rpx;
--kole-m-gutter: 32rpx;
display: flex;
align-items: center;
background-color: var(--kole-color-border);
height: 2rpx;
}
.kole-m-divider--text {
background-color: transparent;
height: auto;
padding: 24rpx 0;
font-size: var(--kole-m-font-size-label);
color: var(--kole-color-text-secondary);
}
/* 带文字时两侧的线用真实子元素(三端一致,不依赖伪元素) */
.kole-m-divider--text::before,
.kole-m-divider--text::after {
content: '';
flex: 1;
height: 2rpx;
background-color: var(--kole-color-border);
}
.kole-m-divider--dashed::before,
.kole-m-divider--dashed::after,
.kole-m-divider--dashed {
background-color: transparent;
border-top: 2rpx dashed var(--kole-color-border);
}
.kole-m-divider--left::before { content: none; }
.kole-m-divider--right::after { content: none; }
.kole-m-divider--vertical {
width: 2rpx;
height: auto;
min-height: 1em;
align-self: stretch;
margin: 0 16rpx;
background-color: var(--kole-color-border);
}
.kole-m-divider__text { flex-shrink: 0; padding: 0 16rpx; }
</style>
测试与回归
断言在真实的 375×640 设备帧里跑(引擎与 PC 侧共用 tests/_runtime.js,触控行为动词来自移动端 tests/mobile/_behaviors.js)。
断言 16 条 · 全部通过 报告 2026-09-20 16:50:33
node site/dev-server.js &
REG_BASE=http://127.0.0.1:3311 node tools/run-mobile-regression.mjs # 全量 5 个组件
npm run verify:mobile-docs # 本页内容完整性 + API 与源码一致性
设计契约
components/mobile-divider.json(点击展开原始 JSON)
{
"schemaVersion": 1,
"sourceKind": "authored-spec",
"provenance": "authored-in-repo",
"specFile": "spec/移动端规格.md",
"confidence": "high",
"specSection": "8 · 分割线 Divider",
"slug": "mobile-divider",
"name": "分割线 Divider",
"semanticTypeCandidates": [
"divider",
"separator"
],
"variantDimensions": [
{
"name": "orientation",
"values": [
"horizontal",
"vertical"
]
},
{
"name": "align",
"values": [
"left",
"center",
"right"
]
},
{
"name": "dashed",
"values": [
"false",
"true"
]
}
],
"representativeVariants": [
{
"orientation": "horizontal",
"align": "center",
"label": "水平分割线"
},
{
"orientation": "horizontal",
"align": "left",
"label": "带文字(左对齐)"
},
{
"orientation": "horizontal",
"align": "center",
"label": "带文字(居中)"
},
{
"orientation": "vertical",
"align": "center",
"label": "垂直分割线"
}
],
"anatomy": {
"divider": "根元素,水平时为 1px 高",
"text": "可选文字,居中或左/右对齐",
"line": "文字两侧的线"
},
"structurePatterns": {
"orientation": "horizontal / vertical",
"align": "left / center / right(带文字时生效)"
},
"usageHints": [
"在内容之间画一条细分隔线;带文字时用于分区标题",
"纯静态,不参与点击与手势",
"垂直分割线高度跟随父容器(用 align-self: stretch)",
"纯装饰:role=separator + aria-hidden=true(对读屏无信息量)"
],
"doNotInvent": [
"主题化分割线(渐变、图片)的表现"
],
"unknowns": [
"垂直分割线的推荐间距"
],
"interaction": [
"纯静态,不参与点击与手势",
"垂直分割线高度跟随父容器(用 align-self: stretch)"
],
"accessibility": [
"纯装饰:role=\"separator\" + aria-hidden=\"true\"(对读屏无信息量)",
"带文字的分割线不隐藏,文字本身即语义"
],
"api": {
"source": "implementation",
"note": "props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs",
"requiredNote": "「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。",
"props": [
{
"name": "orientation",
"type": "'horizontal' | 'vertical'",
"default": "'horizontal'",
"desc": "变体 orientation(规格 §8.3)",
"required": false
},
{
"name": "align",
"type": "'left' | 'center' | 'right'",
"default": "'center'",
"desc": "变体 align:带文字时的对齐方式(规格 §8.3)",
"required": false
},
{
"name": "dashed",
"type": "boolean",
"default": "false",
"desc": "变体 dashed:虚线(规格 §8.3)",
"required": false
}
],
"events": [],
"slots": [
{
"name": "default",
"desc": "可选文字,居中或左/右对齐(规格 §8.2)"
}
]
},
"variantClasses": {
"orientation": {
"horizontal": [],
"vertical": [
".kole-m-divider--vertical"
]
},
"align": {
"left": [
".kole-m-divider--left"
],
"center": [
".kole-m-divider--center"
],
"right": [
".kole-m-divider--right"
]
},
"dashed": {
"false": [],
"true": [
".kole-m-divider--dashed"
]
}
},
"demos": [
{
"id": "basic",
"group": "01 组件类型",
"title": "基础用法",
"desc": "一条 1px 的水平分隔线。",
"variant": "orientation=horizontal"
},
{
"id": "text-center",
"group": "01 组件类型",
"title": "带文字(居中)",
"desc": "文字两侧各一条线,用作分区标题。",
"variant": "align=center"
},
{
"id": "align",
"group": "01 组件类型",
"title": "文字对齐",
"desc": "左/右对齐时另一侧的线自然变长。",
"variant": "align=left | right"
},
{
"id": "vertical",
"group": "02 组件状态",
"title": "垂直分割线",
"desc": "行内并列元素之间用垂直分割线,高度跟随父容器。",
"variant": "orientation=vertical"
},
{
"id": "dashed",
"group": "02 组件状态",
"title": "虚线",
"desc": "虚线用于弱分隔(如「没有更多了」)。",
"variant": "dashed=true"
}
],
"related": [
{
"slug": "cell",
"why": "单元格自带行间分隔线,列表里不需要再插分割线"
},
{
"slug": "cell",
"why": "列表单元格自带内容分隔;独立内容区之间才使用分割线"
}
]
}