当前位置:首页 > JavaScript

JS实现头像上传预览

2026-01-31 03:29:19JavaScript

实现头像上传预览的方法

HTML部分 创建一个文件输入框和一个用于预览的图片元素:

<input type="file" id="avatar-upload" accept="image/*">
<img id="avatar-preview" src="#" alt="头像预览" style="display:none; max-width:200px;">

JavaScript部分 监听文件输入变化并处理预览:

JS实现头像上传预览

document.getElementById('avatar-upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const preview = document.getElementById('avatar-preview');
  const reader = new FileReader();

  reader.onload = function(e) {
    preview.src = e.target.result;
    preview.style.display = 'block';
  }

  reader.readAsDataURL(file);
});

添加图片验证功能

在读取文件前检查文件类型和大小:

const MAX_SIZE = 2 * 1024 * 1024; // 2MB
if (!file.type.match('image.*')) {
  alert('请选择图片文件');
  return;
}

if (file.size > MAX_SIZE) {
  alert('图片大小不能超过2MB');
  return;
}

使用canvas压缩图片

对大图片进行压缩处理:

JS实现头像上传预览

function compressImage(file, callback) {
  const img = new Image();
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  img.onload = function() {
    const MAX_WIDTH = 800;
    const MAX_HEIGHT = 800;
    let width = img.width;
    let height = img.height;

    if (width > height) {
      if (width > MAX_WIDTH) {
        height *= MAX_WIDTH / width;
        width = MAX_WIDTH;
      }
    } else {
      if (height > MAX_HEIGHT) {
        width *= MAX_HEIGHT / height;
        height = MAX_HEIGHT;
      }
    }

    canvas.width = width;
    canvas.height = height;
    ctx.drawImage(img, 0, 0, width, height);
    callback(canvas.toDataURL('image/jpeg', 0.7));
  };

  img.src = URL.createObjectURL(file);
}

完整实现示例

document.getElementById('avatar-upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const MAX_SIZE = 2 * 1024 * 1024;
  if (!file.type.match('image.*')) {
    alert('请选择图片文件');
    return;
  }

  if (file.size > MAX_SIZE) {
    compressImage(file, function(compressedDataUrl) {
      const preview = document.getElementById('avatar-preview');
      preview.src = compressedDataUrl;
      preview.style.display = 'block';
    });
  } else {
    const preview = document.getElementById('avatar-preview');
    const reader = new FileReader();
    reader.onload = function(e) {
      preview.src = e.target.result;
      preview.style.display = 'block';
    }
    reader.readAsDataURL(file);
  }
});

样式优化建议

为上传区域添加更好的视觉效果:

#avatar-preview {
  border-radius: 50%;
  object-fit: cover;
  width: 120px;
  height: 120px;
  margin-top: 10px;
  border: 2px solid #eee;
}

#avatar-upload {
  display: none;
}

.upload-label {
  display: inline-block;
  padding: 8px 15px;
  background: #4CAF50;
  color: white;
  cursor: pointer;
  border-radius: 4px;
}

对应的HTML调整:

<label for="avatar-upload" class="upload-label">选择头像</label>
<input type="file" id="avatar-upload" accept="image/*">

标签: 头像上传
分享给朋友:

相关文章

vue上传视频实现

vue上传视频实现

Vue 实现视频上传功能 安装依赖 确保项目中已安装 axios 或 vue-upload-component 等上传库。通过 npm 安装: npm install axios 前端组件实现 创建…

jquery 上传

jquery 上传

jQuery 文件上传方法 使用 jQuery 实现文件上传可以通过多种方式完成,以下是常见的几种方法: 使用原生表单和 AJAX 创建一个包含文件输入的表单,并通过 jQuery 的 AJAX…

php 实现上传视频

php 实现上传视频

上传视频的基本流程 在PHP中实现视频上传功能需要处理文件接收、验证、存储等步骤。核心是通过$_FILES超全局变量获取上传的文件信息,结合move_uploaded_file函数完成存储。 创建H…

vue实现上传进度

vue实现上传进度

Vue 实现文件上传进度 在 Vue 中实现文件上传进度可以通过 XMLHttpRequest 或 axios 的 onUploadProgress 事件来监听上传进度。以下是两种常见实现方式: 使…

vue实现上传头像显示

vue实现上传头像显示

Vue 实现上传头像并显示 前端实现(Vue 3 + Element Plus) 模板部分 <template> <div class="avatar-upload">…

react实现头像上传

react实现头像上传

实现头像上传功能 使用React实现头像上传功能需要结合文件输入、图片预览和上传逻辑。以下是一个完整的实现方案: 创建上传组件 创建一个React组件来处理头像上传功能,包含文件选择和预览功能:…