tn-avatar-group.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <view class="tn-avatar-group-class tn-avatar-group">
  3. <view v-for="(item, index) in lists" :key="index" class="tn-avatar-group__item" :style="[itemStyle(index)]">
  4. <tn-avatar
  5. :src="item.src || ''"
  6. :text="item.text || ''"
  7. :icon="item.icon || ''"
  8. :size="size"
  9. :shape="shape"
  10. :imgMode="imgMode"
  11. :border="true"
  12. :borderSize="4"
  13. ></tn-avatar>
  14. </view>
  15. </view>
  16. </template>
  17. <script>
  18. export default {
  19. name: 'tn-avatar-group',
  20. props: {
  21. // 头像列表
  22. lists: {
  23. type: Array,
  24. default() {
  25. return []
  26. }
  27. },
  28. // 头像类型
  29. // square 带圆角正方形 circle 圆形
  30. shape: {
  31. type: String,
  32. default: 'circle'
  33. },
  34. // 大小
  35. // sm 小头像 lg 大头像 xl 加大头像
  36. // 如果为其他则认为是直接设置大小
  37. size: {
  38. type: [Number, String],
  39. default: ''
  40. },
  41. // 当设置为显示头像信息时,
  42. // 图片的裁剪模式
  43. imgMode: {
  44. type: String,
  45. default: 'aspectFill'
  46. },
  47. // 头像之间的遮挡比例
  48. // 0.4 代表 40%
  49. gap: {
  50. type: Number,
  51. default: 0.4
  52. }
  53. },
  54. computed: {
  55. itemStyle() {
  56. return (index) => {
  57. let style = {}
  58. if (this._checkSizeIsInline()) {
  59. switch(this.size) {
  60. case 'sm':
  61. style.marginLeft = index != 0 ? `${-48 * this.gap}rpx` : ''
  62. break
  63. case 'lg':
  64. style.marginLeft = index != 0 ? `${-96 * this.gap}rpx` : ''
  65. break
  66. case 'xl':
  67. style.marginLeft = index != 0 ? `${-128 * this.gap}rpx` : ''
  68. break
  69. }
  70. } else {
  71. const size = Number(this.size.replace(/(px|rpx)/g, '')) || 64
  72. style.marginLeft = index != 0 ? `-${size * this.gap}rpx` : ''
  73. }
  74. return style
  75. }
  76. }
  77. },
  78. data() {
  79. return {
  80. }
  81. },
  82. methods: {
  83. // 检查是否使用内置的大小进行设置
  84. _checkSizeIsInline() {
  85. if (/(xs|sm|md|lg|xl|xxl)/.test(this.size)) return true
  86. else return false
  87. }
  88. }
  89. }
  90. </script>
  91. <style lang="scss" scoped>
  92. .tn-avatar-group {
  93. display: flex;
  94. flex-direction: row;
  95. &__item {
  96. position: relative;
  97. }
  98. }
  99. </style>