input file上传文件样式支持html5的浏览器解决方案


Posted in HTML / CSS onNovember 14, 2012

最近在使用画布处理图像像素时用到了file上传控件,发现了file上传控件的两个兼容性问题。一个是file上传控件在火狐下无法通过css改变width,另一个是file上传控件在不同的浏览器下的外观和行为都不一样。
下面是file上传控件在IE10,firefox16,chrome22,opera12,safari5.1.7里的截图:

input file上传文件样式支持html5的浏览器解决方案 
在IE10里,双击输入框或者单击按钮都弹出文件选择框。在其他浏览器里单击输入框,按钮或文字都可以触发文件选择框。
鉴于这种混乱情况,有必要要统一样式和行为。下面是我的兼容性方案。
先看一下最终结果在各浏览器的截图:

input file上传文件样式支持html5的浏览器解决方案
基本思路:创建输入框和按钮模拟file上传控件。将file上传控件设置成透明。让file上传控件与用于模拟的按钮右对齐。修改元素的堆叠顺序,让按钮处于下面,file上传控件在中间,输入框在上面。在文件选择完毕后将file上传控件里的值赋给用于模拟的输入框。
原理:在不同的浏览器里,file上传控件的按钮的height都是可调的,而且file上传控件的右侧都是可以单击的。所以通过调节file上传控件的height,并调整file上传控件的位置(右对齐),可以让file上传控件的可单击区域与用于模拟的按钮完全覆盖。当file上传控件透明时用户单击用于模拟的按钮就触发了文件选择框。但同时file上传控件的堆叠顺序不能先于用于模拟的输入框,不然当用户将鼠标置于所见的输入框上时可能会看到光标不是指示文本而是为一个箭头(而且为一个箭头时单击会弹出文件选择框),用户将感到困惑。
实现:先看看html部分的代码。

复制代码
代码如下:

<div id="file">
<input type="text" value="未选择文件" /><input type="button" value="浏览" /><input type="file" />
</div>

然后是css部分的代码。
复制代码
代码如下:

#file {
position:relative;
width:226px;
height:25px;
border:1px #99f solid;
}
#file input {
font-size:16px;
margin:0;
padding:0;
position:relative;
vertical-align:middle;
outline:none;
}
#file input[type="text"] {
border:3px none;
width:172px;
z-index:4;
}
#file input[type="button"] {
width:54px;
height:25px;
z-index:2;
}
#file input[type="file"] {
position:absolute;
right:0px;
height:25px;
opacity:0;
z-index:3;
}

最后javascript部分,用于把file上传控件获得的文件路径显示到可见的输入框里。
复制代码
代码如下:

window.onload=function(){
var file=document.querySelector("#file input[type='file']");
var text=document.querySelector("#file input[type='text']");
file.addEventListener("change",assign,false);
function assign(){
text.value=file.value;
}
}

欢迎留言交流或指正。
HTML / CSS 相关文章推荐
css3圆角边框和边框阴影示例
May 05 HTML / CSS
css实例教程 一款纯css3实现的超炫动画背画特效
Nov 05 HTML / CSS
一款利用css3的鼠标经过动画显示详情特效的实例教程
Dec 29 HTML / CSS
实例讲解CSS3中的box-flex弹性盒属性布局
Jun 09 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
Oct 08 HTML / CSS
HTML5 video视频字幕的使用和制作方法
May 03 HTML / CSS
详解Html5原生拖拽操作
Jan 12 HTML / CSS
html5中如何将图片的绝对路径转换成文件对象
Jan 11 HTML / CSS
HTML5之SVG 2D入门4—笔画与填充
Jan 30 HTML / CSS
LocalStorage记住用户和密码功能
Jul 24 HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
Nov 15 HTML / CSS
HTML5新特性之type=file文件上传功能
Feb 02 HTML / CSS
免费获得微软MCSD证书赶快行动吧!
Nov 13 #HTML / CSS
Bootstrap 学习分享
Nov 12 #HTML / CSS
HTML5实践-图片设置成灰度图
Nov 12 #HTML / CSS
使用css如何制作时间ICON方法实践
Nov 12 #HTML / CSS
浅谈three.js中的needsUpdate的应用
Nov 12 #HTML / CSS
HTML5教程之html 5 本地数据库(Web Sql Database)
Apr 03 #HTML / CSS
用HTML5实现手机摇一摇的功能的教程
Oct 30 #HTML / CSS
You might like
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
浅述python2与python3的简单区别
2018/09/19 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
python numpy 按行归一化的实例
2019/01/21 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
英国电气世界:Electrical World
2019/09/08 全球购物
国贸专业的职业规划书
2014/03/15 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
预备党员综合考察材料
2014/05/31 职场文书
雷人标语集锦
2014/06/19 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript