代码演示
如何引入
<script setup lang="ts">
import { Avatar, AvatarGroup } from '@fibrous/semi-ui-vue';
</script>
尺寸
可以通过 size 属性设置图标大小,支持extra-extra-small,extra-small,small,default,medium,large,extra-large。
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
const sizes = ['extra-extra-small', 'extra-small', 'small', 'default', 'medium', 'large', 'extra-large'];
</script>
<template>
<div>
<Avatar v-for="size in sizes" :key="size" alt="用户" :size="size" :style="{ margin: '4px' }">U</Avatar>
</div>
</template>颜色
Avatar 支持默认色板的 15 种颜色和白色,包括:amber、 blue、 cyan、 green、 grey、 indigo、 light-blue、 light-green、 lime、 orange、 pink、 purple、 red、 teal、 violet、 yellow。也可以通过 style 来自定义颜色样式。默认为grey。
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
</script>
<template>
<div>
<Avatar alt="Alice Swift" :style="{ margin: '4px' }">AS</Avatar>
<Avatar alt="Bob Matteo" color="red" :style="{ margin: '4px' }">BM</Avatar>
<Avatar alt="Taylor Joy" color="light-blue" :style="{ margin: '4px' }">TJ</Avatar>
<Avatar alt="Zank Lance" :style="{ color: '#f56a00', backgroundColor: '#fde3cf', margin: '4px' }">ZL</Avatar>
<Avatar alt="Youself Zhang" :style="{ backgroundColor: '#87d068', margin: '4px' }">YZ</Avatar>
</div>
</template>自适应字符大小
字符类型的头像,字体大小会根据头像宽度自适应调整。使用gap调整字符头像距离左右两侧的像素大小。
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
</script>
<template>
<div>
<Avatar :style="{ margin: '4px' }">AS</Avatar>
<Avatar :gap="4" :style="{ margin: '4px' }">Semi</Avatar>
<Avatar :gap="10" :style="{ margin: '4px' }">Semi</Avatar>
</div>
</template>图片
可以通过 src 设置图片格式的头像。
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
const src = '/assets/placeholder/avatar-a.svg';
</script>
<template>
<div>
<Avatar alt="漂亮的猫咪" :src="src" :style="{ margin: '4px' }" />
<Avatar alt="可爱的猫咪" size="small" :src="src" :style="{ margin: '4px' }" />
</div>
</template>形状
Avatar 支持 circle、square 两种形状,默认为 circle。
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
</script>
<template>
<div>
<Avatar alt="用户" :style="{ margin: '4px' }">U</Avatar>
<Avatar alt="用户" shape="square" :style="{ margin: '4px' }">U</Avatar>
</div>
</template>事件
Avatar 支持 @click、@mouseEnter、@mouseLeave。通过 #hoverMask 插槽传入悬停覆盖层,覆盖层无默认样式。
代码
<script setup lang="ts">
import { IconCamera } from '@fibrous/semi-icons-vue';
import { Avatar } from '@fibrous/semi-ui-vue';
</script>
<template>
<Avatar alt="Bob Downton" color="red">
BD
<template #hoverMask>
<div
:style="{
backgroundColor: 'var(--semi-color-overlay-bg)',
height: '100%',
width: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}"
>
<IconCamera />
</div>
</template>
</Avatar>
</template>顶部和底部 Slot
topSlot、bottomSlot 属性配置标记外观,#topSlotText、#bottomSlotText 插槽提供内容。使用 #topSlot、#bottomSlot 可以完全自定义标记。
代码
<script setup lang="ts">
import { IconPlus } from '@fibrous/semi-icons-vue';
import { Avatar } from '@fibrous/semi-ui-vue';
</script>
<template>
<Avatar alt="漂亮的猫咪" :border="{ color: '#FE2C55', motion: true }" :bottomSlot="{ shape: 'circle', bgColor: '#FE2C55' }" contentMotion size="large" src="/assets/placeholder/avatar-a.svg" :style="{ margin: '4px' }" :topSlot="{ gradientStart: 'rgb(255,23,100)', gradientEnd: 'rgb(237,52,148)' }">
<template #topSlotText>直播</template>
<template #bottomSlotText>
<IconPlus />
</template>
</Avatar>
</template>顶部
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
const sizes = ['medium', 'large', 'extra-large'];
</script>
<template>
<div>
<Avatar v-for="size in sizes" :key="size" color="amber" :size="size" :topSlot="{ gradientStart: 'rgb(255,23,100)', gradientEnd: 'rgb(237,52,148)' }">
T
<template #topSlotText>直播</template>
</Avatar>
</div>
</template>底部
T
代码
<script setup lang="ts">
import { IconPlus } from '@fibrous/semi-icons-vue';
import { Avatar } from '@fibrous/semi-ui-vue';
const sizes = ['medium', 'large', 'extra-large'];
</script>
<template>
<div>
<Avatar v-for="size in sizes" :key="size" :bottomSlot="{ shape: 'square', bgColor: '#FE2C55' }" color="amber" :size="size">
T
<template #bottomSlotText>直播中</template>
</Avatar>
<br /><br /><br />
<Avatar v-for="size in sizes" :key="`plus-${size}`" :bottomSlot="{ shape: 'circle', bgColor: '#FE2C55' }" color="amber" :size="size">
T
<template #bottomSlotText>
<IconPlus />
</template>
</Avatar>
</div>
</template>额外边框
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
</script>
<template>
<div><Avatar v-for="index in 3" :key="index" border color="amber" :style="{ marginRight: '8px' }">T</Avatar></div>
</template>额外动效
通过 border 的 motion 字段和 contentMotion 开启边框和内容区域的额外动效。
代码
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
const sizes = ['medium', 'large', 'extra-large'];
</script>
<template>
<div>
<Avatar v-for="size in sizes" :key="size" :border="{ motion: true }" color="amber" contentMotion :size="size" :style="{ marginRight: '8px' }">T</Avatar>
</div>
</template>头像组
可以通过 AvatarGroup 将 avatar 显示为组。
代码
<script setup lang="ts">
import { Avatar, AvatarGroup } from '@fibrous/semi-ui-vue';
</script>
<template>
<div>
<AvatarGroup>
<Avatar alt="Lisa LeBlanc" color="red">LL</Avatar>
<Avatar alt="Caroline Xiao">CX</Avatar>
<Avatar alt="Rafal Matin" color="amber">RM</Avatar>
<Avatar alt="Zank Lance" :style="{ color: '#f56a00', backgroundColor: '#fde3cf' }">ZL</Avatar>
<Avatar alt="Youself Zhang" :style="{ backgroundColor: '#87d068' }">YZ</Avatar>
</AvatarGroup>
</div>
</template>可以通过 maxCount 设置展示的头像数量。
代码
<script setup lang="ts">
import { Avatar, AvatarGroup } from '@fibrous/semi-ui-vue';
</script>
<template>
<div>
<AvatarGroup :maxCount="3">
<Avatar alt="Lisa LeBlanc" color="red">LL</Avatar>
<Avatar alt="Caroline Xiao">CX</Avatar>
<Avatar alt="Rafal Matin" color="amber">RM</Avatar>
<Avatar alt="Zank Lance" :style="{ color: '#f56a00', backgroundColor: '#fde3cf' }">ZL</Avatar>
<Avatar alt="Youself Zhang" :style="{ backgroundColor: '#87d068' }">YZ</Avatar>
</AvatarGroup>
</div>
</template>可以通过 #more="{ restNumber, restAvatars }" 作用域插槽自定义 more 标签。
代码
<script setup lang="ts">
import { cloneVNode, type VNode } from 'vue';
import { Avatar, AvatarGroup, Popover } from '@fibrous/semi-ui-vue';
// The group provides existing slot vnodes; cloning preserves their content while overriding the popup size.
function SmallAvatar({ avatar }: { avatar: VNode }) {
return cloneVNode(avatar, { size: 'extra-small' });
}
</script>
<template>
<AvatarGroup :maxCount="3">
<Avatar alt="Lisa LeBlanc" color="red">LL</Avatar>
<Avatar alt="Caroline Xiao">CX</Avatar>
<Avatar alt="Rafal Matin" color="amber">RM</Avatar>
<Avatar alt="Zank Lance" :style="{ color: '#f56a00', backgroundColor: '#fde3cf' }">ZL</Avatar>
<Avatar alt="Youself Zhang" :style="{ backgroundColor: '#87d068' }">YZ</Avatar>
<template #more="{ restNumber, restAvatars }">
<Popover :autoAdjustOverflow="false" position="bottomRight" :style="{ padding: '12px 8px', paddingBottom: 0 }">
<Avatar>{{ `+${restNumber}` }}</Avatar>
<template #content>
<div v-for="(avatar, index) in restAvatars" :key="index" :style="{ paddingBottom: '12px' }">
<SmallAvatar :avatar="avatar" />
<span :style="{ marginLeft: '8px', fontSize: '14px' }">这是段文字描述</span>
</div>
</template>
</Popover>
</template>
</AvatarGroup>
</template>可以通过 overlapFrom 控制头像组的覆盖方式。可选值有 start 和 end,分别表示左边覆盖右边和右边覆盖左边。默认值为 start。
代码
<script setup lang="ts">
import { Avatar, AvatarGroup } from '@fibrous/semi-ui-vue';
const directions = ['start', 'end'] as const;
</script>
<template>
<div>
<div v-for="direction in directions" :key="direction">
<AvatarGroup :overlapFrom="direction">
<Avatar alt="Lisa LeBlanc" color="red">LL</Avatar>
<Avatar alt="Caroline Xiao">CX</Avatar>
<Avatar alt="Rafal Matin" color="amber">RM</Avatar>
<Avatar alt="Zank Lance" :style="{ color: '#f56a00', backgroundColor: '#fde3cf' }">ZL</Avatar>
<Avatar alt="Youself Zhang" :style="{ backgroundColor: '#87d068' }">YZ</Avatar>
</AvatarGroup>
</div>
</div>
</template>API 参考
Avatar
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| color | 头像的预设背景颜色。 | AvatarColor | semiDefault("Avatar", "color", "grey") |
| shape | 头像形状,可选 circle 或 square。 | AvatarShape | undefined |
| size | 头像尺寸,支持预设名称或合法 CSS 尺寸。 | string | undefined |
| src | 图片头像的资源地址。 | string | semiGlobalDefault("Avatar", "src") |
| srcSet | 图片头像的响应式资源集合。 | string | semiGlobalDefault("Avatar", "srcSet") |
| alt | 头像图片或文字的替代文本。 | string | semiGlobalDefault("Avatar", "alt") |
| gap | 字符内容与头像左右两侧的间距,单位为像素。 | number | semiDefault("Avatar", "gap", 3) |
| imgAttr | 传给内部 img 元素的原生属性。 | ImgHTMLAttributes | semiGlobalDefault("Avatar", "imgAttr") |
| topSlot | 顶部标记的渐变色、文字颜色、类名和样式;内容使用 topSlotText 插槽。 | AvatarTopSlot | semiGlobalDefault("Avatar", "topSlot") |
| bottomSlot | 底部标记的形状、背景色、文字颜色、类名和样式;内容使用 bottomSlotText 插槽。 | AvatarBottomSlot | semiGlobalDefault("Avatar", "bottomSlot") |
| border | 显示额外边框,可配置颜色和动画。 | Typeboolean | { color?: string | undefined; motion?: boolean | undefined; } | semiGlobalDefault("Avatar", "border") |
| contentMotion | 启用头像内容区域的动画。 | boolean | semiGlobalDefault("Avatar", "contentMotion") |
| onError | 图片加载失败时调用,返回 false 阻止默认回退;保留为函数 prop 以读取返回值。 | Type(() => boolean | void) | undefined |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| mouseEnter | 指针进入头像时触发。 | [event: MouseEvent] |
| mouseLeave | 指针离开头像时触发。 | [event: MouseEvent] |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | 头像的文字或自定义内容。 | any |
| hoverMask | 悬停时显示的覆盖层,自行设置样式。 | any |
| topSlot | 完全自定义顶部标记。 | any |
| bottomSlot | 完全自定义底部标记。 | any |
| topSlotText | 预设顶部标记中的文字或节点。 | any |
| bottomSlotText | 预设底部标记中的文字或节点。 | any |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
class、style 与原生属性经 attrs 传入。可点击头像的 tabindex、aria-* 落在内部唯一的焦点元素上。
AvatarGroup
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| shape | 组内头像的形状。 | AvatarShape | semiDefault("AvatarGroup", "shape", "circle") |
| size | 组内头像的尺寸。 | string | semiDefault("AvatarGroup", "size", "medium") |
| overlapFrom | 头像重叠方向,可选 start 或 end。 | AvatarGroupOverlapFrom | semiDefault("AvatarGroup", "overlapFrom", "start") |
| maxCount | 显示的最大头像数,超出后显示 +N。 | number | semiGlobalDefault("AvatarGroup", "maxCount") |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| 无 |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | 组内的 Avatar。 | any |
| more | 自定义溢出标签,接收剩余数量 restNumber 与头像 VNode 数组 restAvatars。 | Type{ restNumber: number; restAvatars: VNode<RendererNode, RendererElement, { [key: string]: any; }>[]; } |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
class、style、aria-* 等 attrs 落在 AvatarGroup 根元素上,不会传给组内的头像。
Accessibility
- Avatar 一般不用于操作,不需要被获取焦点。但当 Avatar 可以被点击操作时(如:Semi 官网上方的头像)需要被聚焦,并响应键盘
Enter和空格事件。 - 可点击且有图片或文字的 Avatar 只有一个 Tab 停靠点,即图片或文字标签;它收到的焦点顺序与
aria-*属性(包括 Tooltip 注入的)都落在这个元素上。 - 当 Avatar 与其他组件结合使用时,需要同时检查该组件的可访问性指南。
- Avatar的
alt属性可以被屏幕阅读器读取,使用头像组件时,请使用alt属性解释头像的内容。
<script setup lang="ts">
import { Avatar } from '@fibrous/semi-ui-vue';
const src = '/assets/placeholder/avatar-a.svg';
</script>
<template>
<Avatar alt="一只可爱的猫咪" :src="src" />
<Avatar alt="姜鹏志" :src="src" />
</template>
替代文本描述头像内容,避免空字符串,也不必重复说明「图片」。可点击时用 @click 声明操作,组件自动提供 Tab 停靠点,并将 Enter 和空格转为点击。
设计变量
| Sass 变量 | 值 | 用法 |
|---|---|---|
| $animation_duration-additionalBorder | 800ms | 边框动画持续时间 |
| $animation_duration-content | 1000ms | 内容动画持续时间 |
| $animation_opacity-additionalBorder-start | 1 | 边框动画起始透明度 |
| $animation_opacity-additionalBorder-end | 0 | 边框动画结束透明度 |
| $animation_scale-additionalBorder-start | 1 | 边框动画起始缩放比例 |
| $animation_scale-additionalBorder-end | 1.15 | 边框动画结束缩放比例 |
| $animation_scale-content-start | 1 | 边框动画起始缩放比例 |
| $animation_scale-content-middle | 0.9 | 边框动画中间态缩放比例 |
| $z-avatar-default | 100 | 头像 z-index |
| $color-avatar_default-border-default | var(--semi-color-bg-1) | 头像描边颜色 |
| $color-avatar_more_default-bg-default | var(--semi-grey-5) | 「更多」描边颜色 |
| $color-avatar-outline-focus | $color-focus-ring | 头像聚焦轮廓颜色 |
| $width-avatar_extra_extra_small | 20px | 头像尺寸 - 极小 |
| $font-avatar_extra_extra_small-size | 10px | 文本字号 - 极小 |
| $font-avatar_extra_extra_small-lineHeight | 15px | 文本行高 - 极小 |
| $width-avatar_extra_small | 24px | 头像尺寸 - 超小 |
| $font-avatar_extra_small-size | 10px | 文本字号 - 超小 |
| $font-avatar_extra_small-lineHeight | 15px | 文本行高 - 超小 |
| $width-avatar_small | 32px | 头像尺寸 - 小 |
| $width-avatar_default | 40px | 头像尺寸 - 默认 |
| $width-avatar_medium | 48px | 头像尺寸 - 中 |
| $width-avatar_large | 72px | 头像尺寸 - 大 |
| $width-avatar_extra_large | 128px | 头像尺寸 - 超大 |
| $font-avatar_extra_large-size | 64px | 文本字号 - 超大 |
| $font-avatar_extra_large-lineHeight | 77px | 文本行高 - 超大 |
| $radius-avatar | var(--semi-border-radius-circle) | 头像圆角 |
| $width-avatar_extra_large-border | 3px | 头像组头像描边尺寸 - 超大 |
| $spacing-avatar_extra_large-marginLeft | -32px | 头像组头像左侧外边距 - 超大 |
| $width-avatar_large-border | 3px | 头像组头像描边尺寸 - 大 |
| $spacing-avatar_large-marginLeft | -18px | 头像左侧外边距 - 大 |
| $width-avatar_medium-border | 2px | 头像组头像描边尺寸 - 中 |
| $spacing-avatar_medium-marginLeft | -12px | 头像左侧外边距 - 中 |
| $width-avatar_default-border | 2px | 头像组头像描边尺寸 - 默认 |
| $spacing-avatar_default-marginLeft | -12px | 头像左侧外边距 - 默认 |
| $width-avatar_small-border | 2px | 头像组头像描边尺寸 - 小 |
| $spacing-avatar_small-marginLeft | -12px | 头像左侧外边距 - 小 |
| $width-avatar_extra_small-border | 1px | 头像组头像描边尺寸 - 超小 |
| $spacing-avatar_extra_small-marginLeft | -10px | 头像左侧外边距 - 超小 |
| $width-avatar_extra_extra_small-border | 1px | 头像组头像描边尺寸 - 极小 |
| $spacing-avatar_extra_extra_small-marginLeft | -4px | 头像左侧外边距 - 极小 |
| $width-avatar-outline | $width-focus-ring | 头像聚焦轮廓宽度 |
| $width-avatar_additional-border | 1.5px | 额外描边尺寸 |
| $color-avatar_additional-border | var(--semi-color-primary) | 额外描边颜色 |
| $spacing-avatar_additional-borderGap | 2px | 额外描边与内侧间距 |
| $width-avatar-bottom_slot_circle_extra_small | 12px | extra small 头像底部 slot 圆形半径 |
| $width-avatar-bottom_slot_circle_small | 12px | small 头像底部 slot 圆形半径 |
| $width-avatar-bottom_slot_circle_default | 16px | default 头像底部 slot 圆形半径 |
| $width-avatar-bottom_slot_circle_medium | 18px | medium 头像底部 slot 圆形半径 |
| $width-avatar-bottom_slot_circle_large | 28px | large 头像底部 slot 圆形半径 |
| $width-avatar-bottom_slot_circle_extra_large | 28px | extra large 头像底部 slot 圆形半径 |
| $color-avatar-bottom_slot_bg | var(--semi-color-primary) | 头像底部 slot 背景色 |
| $radius-avatar-bottom_slot_square | 4px | 底部 slot square 圆角 |
| $font-avatar_bottom_slot-extra_small-fontSize | 5px | extra small 底部 slot 文字大小 |
| $font-avatar_bottom_slot-small-fontSize | 5px | small 底部 slot 文字大小 |
| $font-avatar_bottom_slot-default-fontSize | 12px | default 底部 slot 文字大小 |
| $font-avatar_bottom_slot-medium-fontSize | 12px | medium 底部 slot 文字大小 |
| $font-avatar_bottom_slot-large-fontSize | 12px | large 底部 slot 文字大小 |
| $font-avatar_bottom_slot-extra_large-fontSize | 14px | extra large 底部 slot 文字大小 |
| $spacing-avatar-bottom_slot_square-paddingX | 4px | 底部 slot square 形状左边距 |
| $spacing-avatar-bottom_slot_square-paddingY | 1px | 底部 slot square 形状右边距 |
| $font-avatar_top_slot-small-fontSize | 5px | small 顶部 slot 文字大小 |
| $font-avatar_top_slot-default-fontSize | 6px | default 顶部 slot 文字大小 |
| $font-avatar_top_slot-medium-fontSize | 8px | medium 顶部 slot 文字大小 |
| $font-avatar_top_slot-large-fontSize | 14px | large 顶部 slot 文字大小 |
| $font-avatar_top_slot-extra_large-fontSize | 16px | extra large 顶部 slot 文字大小 |
| $spacing-avatar-top_slot_small-content-marginTop | 0px | small 顶部文字 marginTop |
| $spacing-avatar-top_slot_default-content-marginTop | -2px | default 顶部文字 marginTop |
| $spacing-avatar-top_slot_medium-content-marginTop | 0px | medium 顶部文字 marginTop |
| $spacing-avatar-top_slot_large-content-marginTop | 0px | large 顶部文字 marginTop |
| $spacing-avatar-top_slot_extra_large-content-marginTop | 0px | extra large 顶部文字 marginTop |
| $color-avatar-bottom_slot_square-border | var(--semi-color-bg-0) | 底部 square 边框颜色 |
| $width-avatar-bottom_slot_square_extra_small-border | 2px | small 头像底部 square 边框宽度 |
| $width-avatar-bottom_slot_square_small-border | 2px | small 头像底部 square 边框宽度 |
| $width-avatar-bottom_slot_square_default-border | 2px | default 头像底部 square 边框宽度 |
| $width-avatar-bottom_slot_square_medium-border | 2px | medium 头像底部 square 边框宽度 |
| $width-avatar-bottom_slot_square_large-border | 2px | large 头像底部 square 边框宽度 |
| $width-avatar-bottom_slot_square_extra_large-border | 2px | extra large 头像底部 square 边框宽度 |
| $color-avatar-top_slot_text | var(--semi-color-bg-0) | 顶部 Slot 文字颜色 |
| $spacing-avatar-top_slot_small-shift | -28px | small 顶部 slot 偏移量, 和 scale 一起控制 slot 的位置 |
| $spacing-avatar-top_slot_default-shift | -32px | default 顶部 slot 偏移量, 和 scale 一起控制 slot 的位置 |
| $spacing-avatar-top_slot_medium-shift | -30px | medium 顶部 slot 偏移量, 和 scale 一起控制 slot 的位置 |
| $spacing-avatar-top_slot_large-shift | -30px | large 顶部 slot 偏移量, 和 scale 一起控制 slot 的位置 |
| $spacing-avatar-top_slot_extra_large-shift | -32px | extra large 顶部 slot 偏移量, 和 scale 一起控制 slot 的位置 |
| $spacing-avatar-top_slot_small-scale | 0.4 | small 顶部 slot 缩放比例 |
| $spacing-avatar-top_slot_default-scale | 0.7 | default 顶部 slot 缩放比例 |
| $spacing-avatar-top_slot_medium-scale | 0.8 | medium 顶部 slot 缩放比例 |
| $spacing-avatar-top_slot_large-scale | 1.1 | large 顶部 slot 缩放比例 |
| $spacing-avatar-top_slot_extra_large-scale | 1.4 | large 顶部 slot 缩放比例 |
| $radius-avatar_extra_extra_small | 3px | 极小尺寸头像的圆角 |
| $radius-avatar_extra_small | 3px | 超小尺寸头像的圆角 |
| $radius-avatar_small | 3px | 小尺寸头像的圆角 |
| $radius-avatar_default | 3px | 默认尺寸头像的圆角 |
| $radius-avatar_medium | 3px | 中尺寸头像的圆角 |
| $radius-avatar_large | 6px | 大尺寸头像的圆角 |
| $radius-avatar_extra_large | 12px | 超大尺寸头像的圆角 |