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实现类似翻书效果的过渡动画的示例代码
Sep 06 HTML / CSS
css3制作彩色边线3d立体按钮的示例(css3按钮)
May 06 HTML / CSS
目前不被任何主流浏览器支持的CSS3属性汇总
Jul 21 HTML / CSS
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
Apr 26 HTML / CSS
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
Jun 28 HTML / CSS
CSS3实现渐变背景兼容问题
May 06 HTML / CSS
详解CSS3+JS完美实现放大镜模式
Dec 03 HTML / CSS
localStorage 设置过期时间的方法实现
Dec 21 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
Apr 04 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
May 03 HTML / CSS
HTML5+CSS3实现机器猫
Oct 17 HTML / CSS
canvas实现手机的手势解锁的步骤详细
Mar 16 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实现MySQL更新记录的代码
2008/06/07 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
React组件生命周期详解
2017/07/03 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
Python中操作文件之write()方法的使用教程
2015/05/25 Python
python实现比较文件内容异同
2018/06/22 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python变量的存储原理详解
2019/07/10 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
毕业生自我鉴定
2013/11/05 职场文书
销售总监工作职责
2013/11/21 职场文书
教学实验楼管理制度
2014/02/01 职场文书
物理力学求职信
2014/02/18 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
干部考核工作总结
2015/08/12 职场文书
投资入股协议书
2016/03/22 职场文书
改造DE1103三步曲
2022/04/07 无线电