Skip to content

xtf-avatar-group

组件说明

xtf-avatar-group 是头像组组件,用于以堆叠、展开或波浪布局展示多个头像。支持最大显示数量限制与溢出计数、自定义溢出样式、点击交互和插槽定制,适用于团队列表、参与者展示和评论区等场景。


基础用法

1. 最简示例

通过 items 传入头像数据数组,默认以堆叠布局展示:

vue
<template>
  <xtf-avatar-group :items="items" />
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: '张三' },
        { name: '李四' },
        { name: '王五' },
        { name: '赵六' },
        { name: '钱七' },
        { name: '孙八' }
      ]
    }
  }
}
</script>

2. 最大数量与溢出计数

通过 max 限制最大显示数量,超出部分自动显示 +N 溢出计数:

vue
<template>
  <xtf-avatar-group :items="items" :max="3" @more-click="onMoreClick" />
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: '张三' },
        { name: '李四' },
        { name: '王五' },
        { name: '赵六' },
        { name: '钱七' },
        { name: '孙八' }
      ]
    }
  },
  methods: {
    onMoreClick({ restCount, hiddenItems }) {
      uni.showToast({ title: '还有 ' + restCount + ' 人', icon: 'none' })
    }
  }
}
</script>

3. 布局变体

通过 layout 切换三种布局:'stack'(堆叠)、'spread'(展开)、'wave'(波浪):

vue
<template>
  <view>
    <xtf-text level="caption" color="secondary">堆叠</xtf-text>
    <xtf-avatar-group :items="items" layout="stack" size="md" />

    <xtf-text level="caption" color="secondary" style="margin-top: 24rpx">展开</xtf-text>
    <xtf-avatar-group :items="items" layout="spread" size="md" />

    <xtf-text level="caption" color="secondary" style="margin-top: 24rpx">波浪</xtf-text>
    <xtf-avatar-group :items="items" layout="wave" size="md" />
  </view>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: '张三' },
        { name: '李四' },
        { name: '王五' },
        { name: '赵六' },
        { name: '钱七' }
      ]
    }
  }
}
</script>

4. 溢出样式定制

通过 moreType / moreVariant / moreTheme / moreShape 定制溢出项的视觉风格:

vue
<template>
  <view>
    <xtf-text level="caption" color="secondary">文字溢出(默认)</xtf-text>
    <xtf-avatar-group :items="items" :max="3" more-type="text" more-variant="solid" />

    <xtf-text level="caption" color="secondary" style="margin-top: 24rpx">柔和溢出</xtf-text>
    <xtf-avatar-group :items="items" :max="3" more-type="text" more-variant="soft" />

    <xtf-text level="caption" color="secondary" style="margin-top: 24rpx">头像溢出</xtf-text>
    <xtf-avatar-group :items="items" :max="3" more-type="avatar" more-theme="secondary" />

    <xtf-text level="caption" color="secondary" style="margin-top: 24rpx">玻璃溢出</xtf-text>
    <xtf-avatar-group :items="items" :max="3" more-type="text" more-variant="glass" />
  </view>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: '张三' },
        { name: '李四' },
        { name: '王五' },
        { name: '赵六' },
        { name: '钱七' },
        { name: '孙八' }
      ]
    }
  }
}
</script>

5. 光环与交互

通过 ring 为所有头像添加光环,通过 clickable 启用点击交互,通过 overlap 调整堆叠重叠量:

vue
<template>
  <xtf-avatar-group
    :items="items"
    :max="4"
    size="lg"
    ring
    clickable
    :overlap="20"
    @item-click="onItemClick"
    @more-click="onMoreClick"
  />
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: '张三', status: 'online' },
        { name: '李四', status: 'busy' },
        { name: '王五' },
        { name: '赵六', status: 'away' },
        { name: '钱七' },
        { name: '孙八' }
      ]
    }
  },
  methods: {
    onItemClick({ item, index }) {
      uni.showToast({ title: '点击了: ' + item.name, icon: 'none' })
    },
    onMoreClick({ restCount }) {
      uni.showToast({ title: '还有 ' + restCount + ' 人', icon: 'none' })
    }
  }
}
</script>

全部属性

属性类型默认值作用描述适用范围
itemsArray[]头像数据数组,每项字段见下方子表核心数据源
sizeString | Number'md'头像尺寸,支持预设 'xs' / 'sm' / 'md' / 'lg' / 'xl' / 'hero' 或数值(rpx)控制头像大小
shapeString'circle'头像形状:'circle' / 'rounded' / 'rect' / 'hexagon' / 'squircle'统一设置形状
themeString''预设主题色,传递给内部 xtf-avatar统一设置主题色
ringBooleanfalse是否为所有头像显示光环突出显示头像
ringColorString''自定义光环颜色自定义光环色
maxString | Number5最大显示数量,超出显示溢出计数控制显示数量
overlapString | Number14堆叠重叠量(rpx),数值越大重叠越多调整堆叠间距
layoutString'stack'布局方式:'stack' 堆叠 / 'spread' 展开 / 'wave' 波浪适配不同展示风格
alignString'start'对齐方式:'start' / 'center' / 'end'控制水平对齐
reverseBooleanfalse是否反转排列顺序从右到左展示
wrapBooleanfalse是否换行展示头像数量较多时
morePositionString'end'溢出项位置:'end' 末尾 / 'start' 开头控制溢出位置
clickableBooleanfalse是否可点击,启用后头像有上浮反馈头像可交互场景
hoverableBooleantrue是否有悬浮交互效果关闭悬浮动效
fallbackIconString'person'回退图标名,传递给内部 xtf-avatar自定义回退图标
moreTextString''自定义溢出文案,默认为 +N自定义溢出文案
moreTypeString'text'溢出项类型:'text' 文字 / 'avatar' 头像样式溢出展示方式
moreShapeString'circle'溢出头像形状,moreType='avatar' 时生效溢出头像形状
moreThemeString'inverse'溢出头像主题色,moreType='avatar' 时生效溢出头像颜色
moreVariantString'solid'溢出文字样式:'solid' 实心 / 'soft' 柔和 / 'glass' 玻璃 / 'outline' 描边溢出视觉风格
moreRingBooleanfalse溢出头像是否显示光环溢出头像光环
moreRingColorString''溢出头像自定义光环颜色溢出光环色
moreClickableBooleantrue溢出项是否可点击关闭溢出点击
customClassString''自定义类名样式覆盖
customStyleString | Object | Array''自定义样式动态样式覆盖

items 数组每项支持的字段

字段类型默认值说明
srcString''头像图片地址
nameString''用户名,用于提取首字母和哈希渐变色
textString''自定义回退文字
shapeString继承组 shape单项形状,可覆盖组的统一设置
sizeString | Number继承组 size单项尺寸,可覆盖组的统一设置
themeString继承组 theme单项主题色,可覆盖组的统一设置
statusString''状态指示点:'online' / 'busy' / 'away' / 'offline'
ringBoolean继承组 ring单项是否显示光环
ringColorString继承组 ringColor单项自定义光环颜色
glowBooleanfalse单项是否发光
clickableBoolean继承组 clickable单项是否可点击
fallbackIconString继承组 fallbackIcon单项回退图标
id / keyString唯一标识,用于列表渲染的 key

事件

事件名称触发时机回调参数参数说明
item-click点击头像项时触发(需 clickabletrue(payload: { item: Object, index: Number, event })item 为点击项数据,index 为原始索引,event 为原生事件
more-click点击溢出项时触发(需 moreClickabletrue(payload: { restCount: Number, items: Array, hiddenItems: Array, event })restCount 为溢出数量,hiddenItems 为隐藏项数组

事件使用示例

vue
<template>
  <xtf-avatar-group
    :items="members"
    :max="2"
    clickable
    @item-click="onItemClick"
    @more-click="onMoreClick"
  />
</template>

<script>
export default {
  data() {
    return { members: [{ name: '张三' }, { name: '李四' }, { name: '王五' }] }
  },
  methods: {
    onItemClick({ item, index }) {
      console.log('点击成员', item, index)
    },
    onMoreClick({ restCount, hiddenItems }) {
      console.log('其余成员', restCount, hiddenItems)
    }
  }
}
</script>

插槽

插槽名作用域参数说明
item{ item, index }替换单个头像。
more{ restCount, items, label }替换溢出项。
vue
<template>
  <xtf-avatar-group :items="members" :max="2">
    <template #more="{ label }"><xtf-badge standalone :text="label" theme="info" /></template>
  </xtf-avatar-group>
</template>

<script>
export default {
  data() {
    return { members: [{ name: '张三' }, { name: '李四' }, { name: '王五' }] }
  }
}
</script>

主题说明

  • 溢出文字背景使用 var(--xtf-avatar-more-bg),文字色使用 var(--xtf-avatar-more-text)
  • 溢出边框色使用 var(--xtf-avatar-border)
  • soft 变体背景使用 var(--xtf-color-surface-muted),文字色使用 var(--xtf-color-text-secondary)
  • glass 变体背景使用 var(--xtf-color-glass),边框色使用 var(--xtf-card-border)
  • outline 变体背景透明,文字色使用 var(--xtf-color-text)
  • 头像阴影使用 var(--xtf-shadow-soft)
  • 交互悬浮使用 var(--xtf-motion-base) + var(--xtf-motion-spring) 动画

如需全局调整主题,请在 xtf-config-provider 或主题配置中覆盖上述 CSS 变量。

MIT Licensed