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 相关文章推荐
网页的标准,IMG不支持onload标签怎么办
Jun 29 Javascript
js 无提示关闭浏览器页面的代码
Mar 09 Javascript
Knockout text绑定DOM的使用方法
Nov 15 Javascript
document节点对象的获取方式示例介绍
Dec 24 Javascript
使用js操作css实现js改变背景图片示例
Mar 10 Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
手机端页面rem宽度自适应脚本
May 20 Javascript
JS实现的倒计时效果实例(2则实例)
Dec 23 Javascript
jquery实现图片轮播器
May 23 jQuery
webpack4 CSS Tree Shaking的使用
Sep 03 Javascript
Vue ​v-model相关知识总结
Jan 28 Vue.js
微信小程序实现树莓派(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
我常用的几个类
2006/10/09 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
使用python装饰器验证配置文件示例
2014/02/24 Python
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
实用求职信范文分享
2013/12/25 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书