{ "schemaVersion": 1, "sourceKind": "authored-spec", "provenance": "authored-in-repo", "specFile": "spec/移动端规格.md", "specSection": "23 · 头像 Avatar", "confidence": "high", "slug": "mobile-avatar", "name": "头像 Avatar", "semanticTypeCandidates": [ "avatar", "user-image", "profile-photo" ], "variantDimensions": [ { "name": "size", "values": [ "small", "default", "large" ] }, { "name": "shape", "values": [ "circle", "square" ] }, { "name": "type", "values": [ "text", "image" ] } ], "representativeVariants": [ { "size": "default", "shape": "circle", "type": "text", "label": "文字头像(圆形,用户默认形态)" }, { "size": "large", "shape": "square", "type": "image", "label": "图片头像(圆角方形,企业 / 群组)" }, { "size": "small", "shape": "circle", "type": "text", "label": "小尺寸头像(列表行前缀位)" }, { "size": "default", "shape": "circle", "type": "image", "label": "图片加载失败退回文字(状态 fallback)" } ], "anatomy": { "avatar": "根元素,正方形圆角容器,尺寸由 size 决定", "image": "图片,铺满容器并按形状裁切", "text": "文字内容(姓名首字或简称),图片缺失时它就是主体", "fallback": "兜底节点,图片加载失败后退回的形状(文字或图标)", "badge": "可选右下角角标位,挂在线状态或未读数" }, "structurePatterns": { "size": "small(32px)/ default(40px)/ large(56px)", "shape": "circle(圆形,用于人)/ square(圆角方形,用于企业或群组)", "type": "text(文字头像)/ image(图片头像,失败退文字)" }, "usageHints": [ "用一张图或一两个字符代表一个主体(用户、企业、群组);移动端列表与详情页里大量出现,必须能单手扫读,因此尺寸只有三档、形状只有两种", "图片不可用时必须立刻退回文字,不能出现裂图", "头像本身不是按钮;可点时必须由宿主包一层原生 button 或 a,热区不小于 44×44", "图片 alt 或根节点 aria-label 必填其一,读屏读「姓名 + 头像」", "图片加载失败只触发一次 error 事件,是否替换资源由宿主决定" ], "doNotInvent": [ "图片裁剪的 focal point(人脸居中)算法", "角标位置随形状(圆 / 方)的微调规则" ], "unknowns": [ "文字头像的底色是否按名字散列取多色", "姓名超过两个汉字时的截断规则" ], "interaction": [ "头像本身不是按钮;可点时必须由宿主包一层原生 button 或 a,热区不小于 44×44", "图片加载失败只触发一次 error 事件,是否替换资源由宿主决定" ], "accessibility": [ "文字头像根节点 role=\"img\" 并带 aria-label(内容为姓名)", "图片头像直接用 ,alt 为空时视为装饰并对读屏隐藏", "角标不改变头像的可访问名" ], "api": { "source": "implementation", "note": "props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs", "requiredNote": "「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。", "props": [ { "name": "size", "type": "'small' | 'default' | 'large'", "default": "'default'", "desc": "变体 size:三档尺寸 32 / 40 / 56px,文字随尺寸放大(规格 §23.3)", "required": false }, { "name": "shape", "type": "'circle' | 'square'", "default": "'circle'", "desc": "变体 shape:circle 用于人,square 用于企业或群组(规格 §23.3)", "required": false }, { "name": "type", "type": "'text' | 'image'", "default": "'text'", "desc": "变体 type:文字头像 / 图片头像,图片失败退回文字(规格 §23.3)", "required": false }, { "name": "src", "type": "string", "default": "''", "desc": "图片地址,type=image 时必填(规格 §23.2 image)", "required": false }, { "name": "alt", "type": "string", "default": "''", "desc": "可访问名:图片头像作为 ,文字头像作为根节点 aria-label(规格 §23.6)", "required": false }, { "name": "disabled", "type": "boolean", "default": "false", "desc": "状态 disabled:置灰(如成员已离职)(规格 §23.4)", "required": false } ], "events": [ { "name": "error", "params": "(event)", "desc": "图片加载失败时触发一次;是否替换资源由宿主决定(规格 §23.5)" } ], "slots": [ { "name": "default", "desc": "文字内容(姓名首字或简称)(规格 §23.2 text)" }, { "name": "badge", "desc": "右下角角标位,挂在线状态或未读数(规格 §23.2 badge)" } ] }, "variantClasses": { "size": { "small": [ ".kole-m-avatar--small" ], "default": [], "large": [ ".kole-m-avatar--large" ] }, "shape": { "circle": [ ".kole-m-avatar--circle" ], "square": [ ".kole-m-avatar--square" ] }, "type": { "text": [], "image": [ ".kole-m-avatar__image" ] } }, "demos": [ { "id": "size", "group": "01 组件类型", "title": "三档尺寸", "desc": "small 32 / default 40 / large 56,文字字号随尺寸放大,小尺寸下仍可读。", "variant": "size=small|default|large" }, { "id": "shape", "group": "01 组件类型", "title": "两种形状", "desc": "circle 用于人(成员、好友),square 用于企业或群组(标志、团队)。", "variant": "shape=circle|square" }, { "id": "image", "group": "01 组件类型", "title": "图片头像", "desc": "type=image 时图片铺满容器并按形状裁切,语义交给 。", "variant": "type=image" }, { "id": "fallback", "group": "02 组件状态", "title": "图片兜底", "desc": "状态 fallback:图片不可用时退回文字,底色转中性底,绝不出现裂图。", "variant": "状态 fallback" }, { "id": "badge", "group": "02 组件状态", "title": "带角标", "desc": "角标位挂在线状态或未读数,绝对定位不改变头像尺寸。", "variant": "slots.badge" }, { "id": "disabled", "group": "02 组件状态", "title": "禁用", "desc": "状态 disabled:置灰用于已离职或已停用的主体。", "variant": "disabled=true" } ], "related": [ { "slug": "mobile-list", "why": "头像作为列表行的前缀位时用列表承载整行;只有单张头像时用本组件" }, { "slug": "mobile-badge", "why": "需要数字角标时用徽标组件包裹头像;只表示在线状态用本组件自带的 badge 位" }, { "slug": "mobile-tag", "why": "要用文字标注状态或分类时用标签;头像只承载主体身份" } ] }