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教程(7):CSS3嵌入字体
Apr 02 HTML / CSS
移动Web—CSS为Retina屏幕替换更高质量的图片
Dec 24 HTML / CSS
纯CSS3实现地球自转实现代码(图文教程附送源码)
Dec 26 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
May 30 HTML / CSS
简单几步用纯CSS3实现3D翻转效果
Jan 17 HTML / CSS
解决margin 外边距合并问题
Jul 03 HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
Jan 07 HTML / CSS
五个2015 年最佳HTML5 框架
Nov 11 HTML / CSS
基于canvas的骨骼动画的示例代码
Jun 12 HTML / CSS
钉钉企业内部H5微应用开发详解
May 12 HTML / CSS
详解CSS开发过程中的20个快速提升技巧
May 21 HTML / CSS
分享几个实用的CSS代码块
Jun 10 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中for与foreach的区别分析
2011/03/09 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
Python爬虫爬验证码实现功能详解
2016/04/14 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
乡镇庆八一活动方案
2014/02/02 职场文书
会计学生自我鉴定
2014/02/06 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
详解nginx location指令
2022/01/18 Servers
HTTP中的Content-type详解
2022/01/18 HTML / CSS