当前位置:首页 > VUE

vue实现头像组件

2026-01-17 08:43:52VUE

Vue 头像组件实现

基础实现

创建一个可复用的头像组件,支持图片链接或文字缩写显示:

<template>
  <div class="avatar" :style="avatarStyle">
    <img v-if="src" :src="src" :alt="alt" @error="handleError">
    <span v-else class="avatar-text">{{ text }}</span>
  </div>
</template>

<script>
export default {
  props: {
    src: {
      type: String,
      default: ''
    },
    alt: {
      type: String,
      default: ''
    },
    size: {
      type: Number,
      default: 40
    },
    text: {
      type: String,
      default: ''
    },
    bgColor: {
      type: String,
      default: '#ccc'
    },
    textColor: {
      type: String,
      default: '#fff'
    }
  },
  data() {
    return {
      imageError: false
    }
  },
  computed: {
    avatarStyle() {
      return {
        width: `${this.size}px`,
        height: `${this.size}px`,
        lineHeight: `${this.size}px`,
        backgroundColor: this.bgColor,
        color: this.textColor
      }
    }
  },
  methods: {
    handleError() {
      this.imageError = true
    }
  }
}
</script>

<style scoped>
.avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  overflow: hidden;
  font-weight: bold;
  text-transform: uppercase;
}

.avatar img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.avatar-text {
  font-size: calc(40% + 1vw);
}
</style>

高级功能扩展

添加更多功能如形状选择、状态指示和悬停效果:

<template>
  <div 
    class="avatar-wrapper"
    :class="[shape, { 'has-status': status }]"
    :style="{ '--status-color': statusColor }"
  >
    <div class="avatar" :style="avatarStyle">
      <img v-if="src && !imageError" :src="src" :alt="alt" @error="handleError">
      <span v-else class="avatar-text">{{ text }}</span>
    </div>
    <div v-if="status" class="status-indicator"></div>
  </div>
</template>

<script>
export default {
  props: {
    shape: {
      type: String,
      default: 'circle',
      validator: value => ['circle', 'square', 'rounded'].includes(value)
    },
    status: {
      type: Boolean,
      default: false
    },
    statusColor: {
      type: String,
      default: '#4CAF50'
    },
    // 保留基础props
  },
  // 保留基础data, computed, methods
}
</script>

<style scoped>
.avatar-wrapper {
  position: relative;
  display: inline-block;
}

.avatar-wrapper.circle .avatar {
  border-radius: 50%;
}

.avatar-wrapper.square .avatar {
  border-radius: 0;
}

.avatar-wrapper.rounded .avatar {
  border-radius: 20%;
}

.status-indicator {
  position: absolute;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background-color: var(--status-color);
  bottom: 0;
  right: 0;
  border: 2px solid white;
}

.avatar:hover {
  opacity: 0.9;
  transform: scale(1.05);
  transition: all 0.3s ease;
}
</style>

使用示例

<template>
  <div>
    <!-- 基础用法 -->
    <Avatar src="https://example.com/avatar.jpg" alt="用户头像" />

    <!-- 文字缩写 -->
    <Avatar text="VU" size="60" bgColor="#2196F3" />

    <!-- 高级用法 -->
    <Avatar 
      src="https://example.com/avatar.jpg" 
      shape="rounded" 
      size="80" 
      status 
      statusColor="#FF5722"
    />
  </div>
</template>

<script>
import Avatar from './components/Avatar.vue'

export default {
  components: {
    Avatar
  }
}
</script>

功能总结

  • 支持图片显示和加载失败处理
  • 支持文字缩写显示
  • 可自定义大小、背景色、文字颜色
  • 可选圆形、方形或圆角形状
  • 可添加状态指示器
  • 支持悬停动画效果
  • 完全响应式设计

组件可根据实际需求进一步扩展,如添加上传功能、多尺寸响应式处理或与后端API集成等功能。

vue实现头像组件

标签: 组件头像
分享给朋友:

相关文章

vue如何实现目录组件

vue如何实现目录组件

Vue 目录组件实现方法 基于递归组件实现树形目录 递归组件适合处理嵌套层级不确定的目录结构。创建一个可自调用的组件,通过 v-for 遍历子节点并递归渲染自身。 <template&g…

vue实现表格上传头像

vue实现表格上传头像

实现表格上传头像的功能 在Vue中实现表格上传头像功能,需要结合文件上传组件和表格组件。以下是一个完整的实现方案。 安装依赖 确保项目中安装了必要的依赖,如element-ui或ant-design…

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &…

vue实现组件

vue实现组件

Vue 组件实现基础 Vue 组件是可复用的 Vue 实例,用于封装 UI 和逻辑。通过 .vue 文件或直接注册组件实现。 单文件组件 (SFC) 示例 <template>…

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现方法 Vue组件是Vue.js的核心概念之一,用于构建可复用的UI模块。以下是Vue组件的几种常见实现方式: 单文件组件(SFC) 使用.vue文件格式,将模板、脚本和样式封装在…

vue实现组件封装

vue实现组件封装

Vue 组件封装方法 封装组件的基本步骤 创建独立的 .vue 文件,包含 template、script 和 style 三个部分。通过 props 接收父组件传递的数据,使用 $emit 触发…