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 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
jQuery 1.8 Release版本发布了
Aug 14 Javascript
jQuery获取节点和子节点文本的方法
Jul 22 Javascript
js自定义弹框插件的封装
Aug 24 Javascript
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
vue中axios的封装问题(简易版拦截,get,post)
Jun 15 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
Jan 27 jQuery
Vue.js实现备忘录功能
Jun 26 Javascript
es6中reduce的基本使用方法
Sep 10 Javascript
Vue.js的模板语法详解
Feb 16 Javascript
javascript实现前端input密码输入强度验证
Jun 24 Javascript
vue 验证两次输入的密码是否一致的方法示例
Sep 29 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
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
php依赖注入知识点详解
2019/09/23 PHP
js静态作用域的功能。
2006/12/25 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
Python  连接字符串(join %)
2008/09/06 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
django使用xadmin的全局配置详解
2019/11/15 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
建筑工地宣传标语
2014/06/18 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2014年话务员工作总结
2014/11/19 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技