定价

AvatarGroup 使用手册

v1.8.7 · @snowui-design-system/components

许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。

组件介绍

将多个头像排列或叠放展示,并以数量提示收起的成员,适合团队、协作者与参与者列表。

使用选择

用于多个参与者头像的横向或叠放展示。联系人详情列表仍使用普通列表,不用 AvatarGroup 承载整行信息。

  • 参与排列与 +N 计数的直接子项必须声明 as="item";用 max 限制可见数量。

  • row 的 size 表示单个头像尺寸;stack 的 size 表示组容器尺寸,不要用同一数值假定两种布局的头像大小相同。

快速开始

以下示例展示推荐的基本组合。更多场景与组合限制见后文。

<script lang="ts">	import { Avatar, AvatarGroup } from '@snowui-design-system/components';	import { Avatar3d04, AvatarAbstract02, AvatarAbstract04, AvatarByewind, AvatarFemale04, AvatarFemale06, AvatarMale03, AvatarMale05 } from '@snowui-design-system/resource-svelte';</script> <AvatarGroup size={40} layout="row" max={4}>	<Avatar as="item" src={AvatarByewind} dataName="ByeWind, maintainer" />	<Avatar as="item" src={AvatarFemale04} dataName="Maya, design" />	<Avatar as="item" src={Avatar3d04} dataName="Leo, components" />	<Avatar as="item" src={AvatarMale03} dataName="Noah, documentation" />	<Avatar as="item" src={AvatarAbstract02} dataName="Ari, accessibility" />	<Avatar as="item" src={AvatarFemale06} dataName="Sofia, research" />	<Avatar as="item" src={AvatarMale05} dataName="Eli, engineering" />	<Avatar as="item" src={AvatarAbstract04} dataName="Kai, community" />	<Avatar as="item" fallbackSeed="user-community-108" aria-label="Additional community member" /></AvatarGroup>

API

关键字 类型 默认值 描述
max number — 未传时 row 不限制数量,stack 最多四个位置。row 显示最多 max 个头像,另加 +N;stack 的 max 包含 +N 的位置,最多四个。显式值向下取整且不小于 0,计数文案最高为 +99。
layout AvatarGroupLayout "row" row 为水平重叠排列;stack 为圆形堆叠,最多四个显示位置。两种模式对 size 和 max 的解释不同,见对应属性。
size ResourceSize — 12/16/20/24/28/32/40/48/80;row 表示单个头像尺寸,stack 表示组容器尺寸并按 max 推导头像大小。未传时读取父级尺寸上下文。
enableResponsive boolean true 启用根 Frame 的响应式能力;头像排列与溢出计数仍由 AvatarGroup 自身管理,关闭此项不会关闭溢出逻辑。
enableContext boolean true 是否为子组件(Avatar/Icon/Badge)提供尺寸上下文。
children Snippet — 按顺序提供 as="item" 的直接子元素,通常为 Avatar;这些子项参与排列、隐藏与 +N 计数,其他内容不计入。

未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。

使用边界与详细说明

组合模式

AvatarGroup 使用显式组合模式:调用方显式书写 <Avatar as="item">,AvatarGroup 只负责排列、叠放、溢出计数和统一 size Context,不拥有 Avatar 的业务数据,因此不提供 parts.Avatar。每个 Avatar 的差异 Props 直接写在对应实例上。

用于将多个头像或任意子元素以叠放形式组合展示,并在超出显示数量时自动以数字提示。

布局模型

主布局模型:复合管理布局。

  • AvatarGroup 的区域结构为 group root / visible avatar items / overflow count / stack positioning。

  • 子项 Avatar、Icon、Badge 仍各自保持内禀原子或内联外壳布局;AvatarGroup 只管理集合排列、遮罩切割和溢出计数。

  • row 和 stack 是集合布局模式,不是 Button 式内联外壳,也不是 Frame 的三槽位宿主。

  • 尺寸上下文通过 Frame context 下发给子项,排列和重叠规则属于 AvatarGroup 私有逻辑。

功能概览 (User)

  • 多头像布局(支持线性叠放与圆形堆叠)

  • 超出数量时自动显示 +N 溢出计数(最高显示 +99)

  • 与任意子元素组合(不仅限于 Avatar)

  • 边框切割叠放与溢出头像配色遵循 Avatar 规则


2. 视觉规则

  1. 布局规则:

    • row: 线性排列,数量不限;使用边框切割方式进行叠放。

    • stack: 圆形堆叠,2/3 个头像固定位置排列,4 个及以上固定显示 3 个头像 + +N。当发生溢出时,+N 占用一个头像位置(stack 中如 max=2 或 max=3 时显示 1/2 个头像 + +N;row 则保留 max 个头像,另显示计数)。

  2. 位置与层级(stack 模式):

    • 中心点角度(以圆心为原点,顺时针为负角):

      • max=2:-45°、135°

      • max=3:-90°、150°、30°

      • max>=4:-45°、-135°、135°、45°

    • 层级顺序:从下到上依次为 红、绿、蓝、紫。

    • +N 位置:始终占用 红色位置(最低层)。

  3. True Cutout 边框切割:头像叠放使用基于 CSS Mask 的真实边框切割技术,确保在任何背景颜色下均呈现精准的缝隙。

    • 切割比例:边框厚度基准为 0.04em(相对于头像尺寸)。

    • Row 布局:切除左侧项与右侧项重叠的部分。

    • Stack 布局:低层头像根据与其重叠的所有高层头像的相对坐标,动态生成复合遮罩进行精准切割。

  4. 统一尺寸驱动 (Unified Sizing):

    • 核心逻辑:通过单一属性 size 控制视觉。

    • Stack 模式:size 代表容器。头像按 max 对应比例自动分发(1:1.8, 1:2.0, 1:2.2)。内部传导允许亚像素精度(如 36.36px)。

    • Row 模式:size 代表头像。容器高度自动跟随。

  5. 对齐优化:容器强制执行 vertical-align: top 和 line-height: 0,确保在任何字号环境下头像均能像素级对齐。

  6. 叠放间距:叠放重叠比例固为头像尺寸的 25% (0.25)。

  7. 溢出头像颜色:+N 头像的文字为固定黑色,底色为 #EDEDED。配合 stack 模式时,计数器自动应用绝对定位以消除布局抖动。

  8. 资源匹配:向子组件透传 size 时,系统自动向上取整(Math.round),确保 AvatarByewind 等资源组件能加载到最匹配的图片分辨率。

3. 使用示例

<AvatarGroup size={24}>    <Avatar as="item" src={AvatarByewind} />    <Avatar as="item" src={AvatarByewind} />    <Avatar as="item" /></AvatarGroup>
<AvatarGroup max={2} size={32}>    <Avatar as="item" src={AvatarByewind} />    <Avatar as="item" src={AvatarByewind} />    <Avatar as="item" />    <Avatar as="item" /></AvatarGroup>
<AvatarGroup layout="stack" size={80} max={3}>    <Avatar as="item" src={AvatarByewind} />    <Avatar as="item" src={AvatarByewind} />    <Avatar as="item" />    <Avatar as="item" /></AvatarGroup>

[!IMPORTANT] 溢出背景样式: 头像组溢出计数 (+N) 的背景颜色已按用户要求制定为灰色 #EDEDED。此样式具有最高优先级,且作为系统默认回退方案。

在此处添加您的自定义说明、业务逻辑约束或特定示例。



AvatarGroup 样式覆盖

先阅读 完整 LICENSE;同任务、同版本、同范围去重。

优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。

变量 用途与默认参考
--snowui-avatar-group-item-size-override 单个 item 尺寸(尺寸 px,默认值见组件源码)
--snowui-avatar-group-size-override 整体尺寸(尺寸 px,默认值见组件源码)

设计指南 · Token · 组合边界

AvatarGroup 类型与状态

必填属性:无具名必填属性。

可双向绑定:本组件未声明具名双向绑定属性;状态更新通过公开回调或所属宿主处理。

继承声明:FrameProps。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。

共享 Frame API · 返回 API

以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。

AvatarGroupLayout

来源:components/src/components/AvatarGroup.svelte

type AvatarGroupLayout = "row" | "stack";

ResourceSize

来源:components/src/context.ts

export type ResourceSize = 12 | 16 | 20 | 24 | 28 | 32 | 40 | 48 | 80;