前言

  上传图片是常见的需求,多使用input标签。本文主要介绍 input标签的样式美化 和 实现图片预览

  用到的知识点有:

    1、input标签的使用

    2、filelist对象 和 file对象

    3、fileReader对象

样式美化

  原生的input标签样式单一,且在不同浏览器下的表现还不一致。所以为了美观和统一,我们需要自定义input标签的样式。

  实现的方式有很多中,这里采用的是:用一个div将input标签包裹,然后再将input标签透明度设置为0,再对div设置自己需要的样式。html和css如下:

      <div class="upload-file">
<input type="file" class="input-file" multiple="true"> // mulitiple属性控制是否允许上传多个文件
<span class="tip">点击上传图片</span>
</div>
    .upload-file{
position: relative;
width: 100px;
padding: 10px 15px;
border: 1px solid rgb(119, 154, 80);
border-radius: 5px;
background-color: rgb(66, 215, 142);
color: #333333;
font-size: 14px;
text-align: center;
overflow: hidden;
} .upload-file span{ //单行显示
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
} .upload-file:hover{ //简单的hover效果
font-size: 15px;
border-color: rgb(39, 226, 81);
} .upload-file input[type='file']{
height: 100%;
width: 100%;
position: absolute; //设置为绝对定位,不会影响到其他元素
top:;
right:;
opacity:; //透明度为0
filter: alpha(opacity=0);
cursor: pointer;
}

  这样点击div,其实也就点击到了input标签,可已正常触发选择文件的。

  效果如下:

               

  

  但是这样就会产生一个问题,如何获取选择文件的文件名称呢?需要用到file对象的name属性

filelist和file对象--获取文件名

  input元素选择文件后会返回FileList对象,比如

//input元素
var fileInput = document.querySelector('.input-file');
//filelist对象
var filelist = fileInput.files
//file对象 

var file = filelist.item(0)
或者 var file = filelist[0]

  我们知道,每个input[type='file']都有一个files属性,返回的就是filelist 就和nodelist类似,不是数组。filelist就是由多个file对象组成的,每个file对象都是一个文件。

  filelist对象有个length属性,可以获取长度;还有item(index)方法,可以获取到file对象,当然可以通过 filelist[index]来获取。

  file对象常用的属性有:

    lastModified : 返回当前 File 对象所引用文件最后修改时间, 自 1970年1月1日0:00 以来的毫秒数。
    lastModifiedDate : 返回当前 File 对象所引用文件最后修改时间的 Date 对象。
    name : 文件名。
    size : 文件大小。
    type :文件类型。

  所以我们可以通过file对象的name属性来获取到文件名,在修改到span元素中

    var fileInput = document.querySelector('.input-file');
var tip = document.querySelector('.tip'); fileInput.addEventListener('change',function(e){ //监听change事件,选择文件后触发
if(this.files.length === 1){ //处理文件名
tip.textContent = this.files[0].name;
}else {
tip.textContent = '已选择 ' + this.files.length + ' 个文件';
}
})

  效果如下:

     

  现在已经自定义了input[type='file']的样式,而且实现了原有的功能。那么如何实现图片预览呢?

FileReader 对象 --实现图片预览

  FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容。也就是说FIlereader对象可以读取到input选择的文件。filereader对象在读取file对象时,当读取完成时,readystate属性的值会变为DONE,会触发load事件。而且有多种读取方式:

  readAsBinaryString()读取完成后,result属性中包含原始数据的二进制数据,readAsDataURL()读取完成后,result属性中包含data:url格式的数据,readAsText()读取完成后,result属性中包含字符串格式的数据,readAsArrayBuffer()result属性中将包含一个ArrayBuffer对象以表示所读取文件的内容。

  这里上传的时图片,所以使用readAsDataURL()读取。现在html中加入个预览触发按钮,而预览图片存放的区域。

//简单结构
<div class="preview">
<button type="button" name="button">预览</button>
</div> //样式
.preview{
margin-top: 10px;
width: 150px;
} .preview img{
margin: 5px 0;
width: 100%;
}

  实现预览功能,注释中已有详细解释,不再重复。注意一定要等filereader读取完成后,再进行赋值,不然图片的src属性会是空的

    var preview = document.querySelector('.preview')
var previewBtn = preview.children[0]; previewBtn.addEventListener('click',function(e){
var filelist = fileInput.files;
if(filelist.length < 1){
alert("未选择图片,无法预览");
return false;
} [].slice.call(filelist).forEach(function(value,index){ //遍历file对象
var fileReader = new FileReader(); //创建一个filereader对象
var img = new Image(); //创建一个图片对象
fileReader.readAsDataURL(value) //读取所上传对的文件
fileReader.onload = function(){
img.src = this.result; //读取完成后,赋值给img对象
preview.appendChild(img) //添加到预览区域
}
})
})

  效果如下:

  

总结

  总结来说,就是  input[type='file']的files属性 --> filelist对象 --> file对象 --> filereader对象读取file对象。通过它们的一些参数值实现我们想要的功能。由于只是简单demo,不严谨的地方和丑陋的样式就多多包涵了。

  再下一步就是要上传图片到服务器了,会在下个随笔中记录。

input[type='file']样式美化及实现图片预览的更多相关文章

  1. css input[type=file] 样式美化,input上传按钮美化

    css input[type=file] 样式美化,input上传按钮美化 参考:http://www.haorooms.com/post/css_input_uploadmh

  2. 文件上传input type="file"样式美化

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. input[type=file] 样式美化,input上传按钮美化

    <style>.file { position: relative; display: inline-block; background: #D0EEFF; border: 1px sol ...

  4. input[type=file]样式更改以及图片上传预览

    以前知道input[type=file]可以上传文件,但是没用过,今天初次用,总感觉默认样式怪怪的,想修改一下,于是折腾了半天,总算是小有收获. 以上是默认样式,这里我想小小的修改下: HTML代码如 ...

  5. input[type=file]的美化

    __ 一般的选择框在美化过程中会出现各种问题,样式出错,文字无法更改等... 所有随之而生的便是这样的一种修饰方式:[将type=file的input与另一个按钮通过js绑定,这样便可以通过改变另一个 ...

  6. 知识点:定义input type=file 样式的方法(转)

    ——“当我们想要用css美化表单的时候,有两个控件就会和前段人员作对,一个是是大名鼎鼎的select,另一个就是我现在要说说的 input type=file” 为什么要美化file控件?试想一下,别 ...

  7. html的文件控件<input type="file">样式的改变

    一直以来,<input type="file">上传文件标签默认样式都是让人不爽的,使用它多要给它整整容什么的,当然如果用ui插件还比较方便,不能就自己来操刀实践一下! ...

  8. 关于PHP HTML <input type="file" name="img"/>上传图片,图片大小,宽高,后缀名。

    在我们的系统中,不免要上传图片,视频等文件,在上传中,需要做的一些判断,文件大小等方面. 注意: 在php.ini 中的post_max_size,upload_max_filesize默认为2M,在 ...

  9. input[type=file]中使用ajaxSubmit来图片上传

    今天在使用input[type=file]上传图片到服务器时,因为项目要求,并不是像常见的通过按钮来提交表单事件,而是图片上传后就自动执行表单提交事件,将上传的图片信息传给服务器. 刚开始我是这样执行 ...

随机推荐

  1. Java集合框架,未完

    一.集合类 集合的由来: 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点:1,用于存储对象的容器.(容器本身就是 ...

  2. Maven Install指令构建时出现找不到符号

    检查引用的JRE编译的版本,可能由于JRE编译版本太低导致的  

  3. python第二课

    本节内容 1.列表list.切片 2.字典dict

  4. IO 调优

    磁盘优化 1.增加缓存 2.优化磁盘的管理系统 3.设计合理的磁盘存储数据块 4.应用合理的RAID策略 TCP网络参数调优 网络IO优化 1.减少网络交互次数 2.减少网络传输数据量的大小 3.尽量 ...

  5. 典型的NIO代码

    public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector ...

  6. Windows下MongoDB常用命令

    以下命令中的启动与暂停服务命令需要使用管理员身份运行cmd.exe,其他命令需要先cd到Mongodb安装目录的bin目录. 1.启动服务:net start [Mongodb服务名].示例: net ...

  7. ubuntu16.04 配置opensips服务器并编译pjsip测试

    一.版本相关 1) ubuntu版本: 16.04 2) opensips版本:2.1.2 3) pjsip版本 :2.5.5 4) ffmpeg版本:3.3.4 5) sdl版本:2.0 6) vs ...

  8. 自学LinkedBlockingQueue源码

    自学LinkedBlockingQueue源码 参考:http://www.jianshu.com/p/cc2281b1a6bc 本文需要关注的地方 生产者-消费者模式好处: 读取和插入操作所使用的锁 ...

  9. LeetCode 485. Max Consecutive Ones (最长连续1)

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  10. Hbuilder中添加Babel自动编译

    Hbuilder是一个不错的H5开发IDE. Babel是EMCAScript最新标准的编译器,很多ES的最新特性都可以在Babel中尝试. 如果可以有办法在Hbuilder中直接使用ES6,并通过B ...