{ "schemaVersion": 1, "sourceKind": "authored-spec", "provenance": "authored-in-repo", "specFile": "spec/移动端规格.md", "specSection": "21 · 链接 Link", "confidence": "high", "slug": "mobile-link", "name": "链接 Link", "semanticTypeCandidates": [ "link", "anchor" ], "variantDimensions": [ { "name": "tone", "values": [ "brand", "default", "danger", "success" ] }, { "name": "underline", "values": [ "false", "true" ] }, { "name": "block", "values": [ "false", "true" ] } ], "representativeVariants": [ { "tone": "brand", "underline": "false", "label": "品牌色链接(默认,行内主入口)" }, { "tone": "default", "underline": "false", "label": "次要链接(继承父级文字色)" }, { "tone": "danger", "underline": "false", "label": "破坏性操作链接" }, { "tone": "brand", "underline": "true", "label": "正文段落内链接(必须带下划线)" } ], "anatomy": { "link": "根元素,有 href 时是原生 a,无 href 时是原生 button(只回传事件)", "label": "链接文字,单行不换行(超长由宿主截断)", "icon": "可选尾部图标,继承链接颜色,与文字间距 4px", "href": "跳转地址;禁用时不渲染该属性(否则仍可被打开)", "text": "纯文字快捷入口,与默认插槽二选一" }, "structurePatterns": { "tone": "brand 默认 / default 继承父级 / danger 破坏性 / success 完成态", "underline": "false 默认(靠颜色区分)/ true 常驻下划线(正文段落内)", "block": "false 内联 / true 撑满容器、整行可点" }, "usageHints": [ "一段内联文字承载「跳转 / 打开下一级」或「触发一次轻量动作」", "点击热区高度不小于 44px,文字可短但热区不缩水(内边距撑开)", "按下反馈为颜色变化,不做位移缩放(避免长按抖动)", "相邻链接之间至少留 8px 间距,防止误触(同时给出 16px 的更稳选择)", "禁用链接点击不触发事件,也不跳转" ], "doNotInvent": [ "外跳协议处理(tel: / mailto: / 唤起 App)", "已访问状态的样式", "链接的埋点 / 统计" ], "unknowns": [ "一屏内链接的最大推荐数量", "链接与相邻文字的推荐最小间距(同时给出 8px 与 16px 两档)" ], "interaction": [ "点击热区高度不小于 44px,文字可短但热区不缩水(内边距撑开)", "按下反馈为颜色变化,不做位移缩放(避免长按抖动)", "相邻链接之间至少留 8px 间距,防止误触(同时给出 16px 的更稳选择)", "禁用链接点击不触发事件,也不跳转" ], "accessibility": [ "有 href 用原生 a(可聚焦、可长按复制、读屏报「链接」);无 href 用原生 button", "禁用链接不能用 href,且要 aria-disabled=\"true\" + tabindex=\"-1\"(移出 tab 序列)", "链接文字必须自解释,不要出现孤立的「点击这里」(读屏会脱离上下文朗读)", "颜色不是唯一线索:正文段落内的链接必须带下划线或图标,避免色觉障碍用户无法识别" ], "api": { "source": "implementation", "note": "props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs", "requiredNote": "「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。", "props": [ { "name": "tone", "type": "'brand' | 'default' | 'danger' | 'success'", "default": "'brand'", "desc": "变体 tone:brand 默认 / default 继承父级文字色(规格 §21.3)", "required": false }, { "name": "underline", "type": "boolean", "default": "false", "desc": "变体 underline:常驻下划线,正文段落内必须开启(规格 §21.3/§21.6)", "required": false }, { "name": "disabled", "type": "boolean", "default": "false", "desc": "置灰且不响应点击,并移出 tab 序列(规格 §21.4/§21.6)", "required": false }, { "name": "href", "type": "string", "default": "''", "desc": "跳转地址;有值时渲染原生 a,禁用时不渲染该属性(规格 §21.2)", "required": false }, { "name": "text", "type": "string", "default": "''", "desc": "纯文字快捷入口,与默认插槽二选一(规格 §21.2)", "required": false }, { "name": "block", "type": "boolean", "default": "false", "desc": "变体 block:撑满容器、整行可点(规格 §21.3)", "required": false } ], "events": [ { "name": "click", "params": "—", "desc": "点击时触发(disabled 时不触发;有 href 时导航由浏览器完成)" } ], "slots": [ { "name": "default", "desc": "链接文字,可含图标(规格 §21.2 label)" } ] }, "variantClasses": { "tone": { "brand": [], "default": [ ".kole-m-link--default" ], "danger": [ ".kole-m-link--danger" ], "success": [ ".kole-m-link--success" ] }, "underline": { "false": [], "true": [ ".kole-m-link--underline" ] }, "block": { "false": [], "true": [ ".is-block" ] } }, "demos": [ { "id": "tone", "group": "01 组件类型", "title": "语义色", "desc": "默认品牌色;secondary 场景用 default 继承父级文字色;破坏性操作用 danger。", "variant": "tone=brand | default | danger | success" }, { "id": "underline", "group": "01 组件类型", "title": "正文段落内链接", "desc": "段落里的链接必须带下划线 —— 只靠颜色区分会让色觉障碍用户看不出来。", "variant": "underline=true" }, { "id": "disabled", "group": "02 组件状态", "title": "禁用", "desc": "置灰且不响应;同时去掉 href 并移出 tab 序列,否则读屏仍会把它当可点项。", "variant": "disabled=true" }, { "id": "block", "group": "02 组件状态", "title": "整行链接", "desc": "列表里「查看全部」这类入口用 block,整行都可点(热区 44px),不必精准点文字。", "variant": "block=true" }, { "id": "event", "group": "02 组件状态", "title": "不跳转的链接", "desc": "无 href 时渲染 button:只回传事件,用于打开弹窗或展开区块,不做页面跳转。", "variant": "href=''" }, { "id": "with-icon", "group": "02 组件状态", "title": "带图标", "desc": "尾部图标继承链接颜色,与文字间距 4px;图标自身不是热区。", "variant": "tone=brand + 图标" } ], "related": [ { "slug": "mobile-button", "why": "触发一个明确动作(提交、确认)用按钮;链接只用于跳转或极轻的次要动作" }, { "slug": "cell", "why": "整行进入下级、且行内有多段信息时用单元格;行内文字短语才用链接" }, { "slug": "mobile-icon", "why": "需要给链接配图标时用它渲染字形;图标不承担点击" } ] }