JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析


Posted in Javascript onFebruary 12, 2020

本文实例讲述了JS+HTML实现自定义上传图片按钮并显示图片功能的方法。分享给大家供大家参考,具体如下:

在web开发中,上传文件功能通过type为file的input标签即可实现。但input的显示效果仅为一个按钮,且不能修改UI。如果要实现自定义上传按钮,一般需要设置input为不可见,然后将input与自定义界面放在同一个div中,并将input铺在界面上方:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>图片上传</title>
</head>
<body>
  <!-- 要将父布局的position设置为relative,父布局将无法包裹input -->
  <div style="position: relative;">
    <!--设置input的position为absolute,使其不按文档流排版,并设置其包裹整个布局 -->
    <!-- 设置opactity为0,使input变透明 -->
    <!-- 只接受jpg,gif和png格式 -->
    <input id="upload-input" style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" type="file" accept="image/gif, image/jpg, image/png" />
    <!-- 自定义按钮效果 -->
    <div style="text-align: top">
      <span style="font-size: 12px;">上传文件:</span>
      <img id="upload" src="./upload.png" style="width: 40px; height: 40px; vertical-align: middle;" />
    </div>
  </div>
</body>
</html>

效果如下:

JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
图片上传

这样,自定义按钮效果就完成了。但是,这样还不能把图片显示出来。要实现显示上传图片功能,可以通过以下方法实现:

  1. FileReader将文件转Base64显示。FileReader能够异步读取文件,并将文件转化为可读取的编码。我们可以通过input获取上传图片的file实例。我们可以通过FileReader将file实例转化为Base64,然后通过img标签加载图片的Base64编码。
<script type="text/javascript">
  function showImg(input) {
    var file = input.files[0];
    var reader = new FileReader()
    // 图片读取成功回调函数
    reader.onload = function(e) {
      document.getElementById('upload').src=e.target.result
    }
    reader.readAsDataURL(file)
  }
</script>
  1. 通过window.URL.createObjectURL创建url。通过该方法可以为file实例创建一个临时的url,img可以通过该url将图片加载出来。由于是临时的url,因此同一个file实例,每次创建的url都会不一样:
function showImg(input) {
    var file = input.files[0];
    var url = window.URL.createObjectURL(file)
    document.getElemtById('upload').src=url
  }

使用上述方法中的其中一种,并将showImg方法挂在input的onchange属性上,就能够显示图片了:

<input id="upload-input" style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" 
type="file" accept="image/gif, image/jpg, image/png" 
onchange="showImg(this)"/>

显示效果如下:

JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
显示上传的图片

上述代码中,点击input标签时,一次性只能选择一张图片,如果要选择多张图片,则要给input添加multiple属性:

<input id="upload-input" 
style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" type="file" 
accept="image/gif, image/jpg, image/png" multiple onchange="showImg(this)"/>

然后通过多个img显示files里面的图片即可,代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>图片上传</title>
</head>
<body>
  <!-- 要将父布局的position设置为relative,父布局将无法包裹input -->
  <div style="position: relative;">
    <!--设置input的position为absolute,使其不按文档流排版,并设置其包裹整个布局 -->
    <!-- 设置opactity为0,使input变透明 -->
    <!-- 只接受jpg,gif和png格式 -->
    <input id="upload-input" style="position: absolute; top: 0; bottom: 0; left: 0;right: 0; opacity: 0;" type="file" accept="image/gif, image/jpg, image/png" onchange="showImg(this)" multiple />
    <!-- 自定义按钮效果 -->
    <div style="text-align: top">
      <span style="font-size: 12px;">上传文件:</span>
      <img id="upload" src="./upload.png" style="width: 40px; height: 40px; vertical-align: middle;" />
    </div>
  </div>
  <div id="imgContainer" style="margin-top: 10px;"></div>
</body>
<script type="text/javascript">
  function showImg(obj) {
    var files = obj.files
    // document.getElementById("imgContainer").innerHTML = getImgsByUrl(files)
    getImgsByFileReader(document.getElementById("imgContainer"), files)
  }
  // 使用window.URL.createObjectURL(file)读取file实例并显示图片
  function getImgsByUrl(files) {
    var elements = ''
    for (var i = 0; i < files.length; i++) {
      var url = window.URL.createObjectURL(files[i])
      elements += "<img src='"+ url + "' style='width: 40px; height: 40px; vertical-align: middle; margin-right: 5px;' />"
    }
    return elements
  }
  // 使用FileReader读取file实例并显示图片
  function getImgsByFileReader(el, files) {
    for (var i = 0; i < files.length; i++) {
      let img = document.createElement('img')
      img.setAttribute('style', 'width: 40px; height: 40px; vertical-align: middle; margin-right: 5px;')
      el.appendChild(img)
      var reader = new FileReader()
      reader.onload = function(e) {
        img.src = e.target.result
      }
      reader.readAsDataURL(files[i])
    }
  }
</script>
</html>

最终显示效果如图:

JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
多图上传

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
用javascript自动显示最后更新时间
Mar 15 Javascript
基于jquery的代码显示区域自动拉长效果
Dec 07 Javascript
jquery checkbox实现单选小例
Nov 27 Javascript
node.js中的http.createServer方法使用说明
Dec 14 Javascript
vue+Java后端进行调试时解决跨域问题的方式
Oct 19 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
jQuery实现轮播图及其原理详解
Apr 12 jQuery
使用JS获取页面上的所有标签
Oct 18 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
Aug 27 Javascript
深入分析jQuery.one() 函数
Jun 03 jQuery
js加减乘除精确运算方法实例代码
Jan 17 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
Feb 06 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 #Javascript
JavaScript 替换所有匹配内容及正则替换方法
Feb 12 #Javascript
使用webpack搭建pixi.js开发环境
Feb 12 #Javascript
十分钟教你上手ES2020新特性
Feb 12 #Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
Feb 12 #Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 #Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 #Javascript
You might like
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
javascript动态设置样式style实例分析
2015/05/13 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
《陶罐和铁罐》教学反思
2014/02/19 职场文书
党员干部承诺书范文
2014/03/25 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
《穷人》教学反思
2016/02/19 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis