文件上传input简便美化方案

时间:2022-08-28 12:32:51

文件上传input在各个浏览器里表现形式都不一样:

ie6

 文件上传input简便美化方案

ie7,8,9

文件上传input简便美化方案

ff

文件上传input简便美化方案

chrome

文件上传input简便美化方案

这里介绍一种简单实用的,在各种浏览器下表现一致的美化方法,效果如下:

文件上传input简便美化方案

ie6无法美化,只能应用部分效果,如下:

文件上传input简便美化方案

选择文件后(以ff为例,不用浏览器显示的路径不同):

文件上传input简便美化方案

html代码:

1  <form id="UploadForm" method="post" enctype="multipart/form-data">
2    <div class="file-uploader-wrap">
3      <input type="file" class="file-uploader" name="uploadDataField" id="FileUploader"/>
4      <div class="file-uploader-wrap-fake">
5        <input type="text" id="PathDisplayer" class="input-text" disabled />
6        <a href="javascript:void(0)" class="link-btn" >选择文件</a>
7      </div>
8    </div>
9  </form>

css代码:

body{
font-size
: 12px;
text-align
: left;
}
.input-text
{
height
: 23px;
width
: 315px;
line-height
: 23px;
vertical-align
: middle;
background
: #FAFBFD;
border
:1px solid #d4d4d4;
}
.link-btn
{
width
: 78px;
height
: 25px;
display
: inline-block;
line-height
: 25px;
text-align
: center;
vertical-align
: middle;
background
: url('./images/btn.png') 0 -110px;
color
: #6d767f;
text-decoration
: none;
}
.file-uploader-wrap
{
position
: relative;
width
: 405px;
height
: 27px;
margin-top
: 20px;
}
.file-uploader-wrap-fake
{
position
: absolute;
top
: 0;
left
: 0;
z-index
: 1;
height
: 27px;
_display
: none;
}
.file-uploader-wrap .file-uploader
{
position
: relative;
width
: 400px;
height
: 27px;
text-align
: right;
filter
: alpha(opacity = 0);
opacity
: 0;
z-index
: 2;
cursor
: pointer;
_filter
: none;
_text-align
: left;
_line-height
: 27px;
}

js代码:

 1 window.onload = function(){
2 var fileUploader = document.getElementById('FileUploader');
3 var pathDisplayer = document.getElementById('PathDisplayer');
4 if(fileUploader.addEventListener){
5 fileUploader.addEventListener('change', fileUploaderChangeHandler, false);
6 }else if(fileUploader.attachEvent){
7 fileUploader.attachEvent('onclick', fileUploaderClickHandler);
8 }else{
9 fileUploader.onchange = fileUploaderChangeHandler;
10 }
11
12 function fileUploaderChangeHandler(){
13 pathDisplayer.value = fileUploader.value;
14 }
15 function fileUploaderClickHandler(){
16 setTimeout(function(){
17 fileUploaderChangeHandler();
18 }, 0);
19 }
20 }

在样式方面,采用的是将上传input设置为透明,并且置于文本框和选择文件按钮之上的方法。

.file-uploader中的text-align:right样式是为了将file input置于右边,从而使点击选择文件按钮时可以点击到file input。

js主要作用是选择文件后将路径显示在文本框中。

  1. ie7,8只支持file input的click事件,在点击file input时触发,然后利用ie7,8中选择文件对话框出现时会阻断setTimeout的原理,在选择文件后获取file input的值。
  2. 由于ie6中文件选择对话框并不能阻断setTimeout,无法在选择文件后及时获取到文件路径,所以无法对ie6进行美化。
  3. ie9既支持click事件,也支持change事件。
  4. ff和chrome只支持change事件,change事件在文件选择之后触发。

选择文件后,就可以进行同步或者异步的文件上传了。