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 相关文章推荐
Dom 结点创建 基础知识
Oct 01 Javascript
JS中图片缓冲loading技术的实例代码
Aug 29 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
Jquery 实现grid绑定模板
Jan 28 Javascript
jquery及js实现动态加载js文件的方法
Jan 21 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
JavaScript字符串对象
Jan 14 Javascript
JS中使用 after 伪类清除浮动实例
Mar 01 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
Jun 25 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
微信小程序实现弹框效果
May 26 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 时间日期操作实战
2011/08/26 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
js 小数取整的函数
2010/05/10 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Python使用剪切板的方法
2017/06/06 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
python求绝对值的三种方法小结
2019/12/04 Python
python实现简单飞行棋
2020/02/06 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
Prototype是怎么扩展DOM的
2014/10/01 面试题
结婚邀请函范文
2014/01/14 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书