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 相关文章推荐
让IE6、IE7、IE8支持CSS3的脚本
Jul 20 HTML / CSS
CSS3 特效范例整理
Aug 22 HTML / CSS
CSS实现定位元素居中的方法
Jun 23 HTML / CSS
CSS3实现可关闭的下拉手风琴菜单效果
Aug 31 HTML / CSS
css3边框_动力节点Java学院整理
Jul 11 HTML / CSS
浅谈css3中calc在less编译时被计算的解决办法
Dec 04 HTML / CSS
HTML5图片预览实例分享
Jun 04 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
Sep 11 HTML / CSS
Html5 canvas实现粒子时钟的示例代码
Sep 06 HTML / CSS
Canvas 帧动画吃苹果小游戏
Aug 05 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
Sep 08 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
Oct 12 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
2006/10/09 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
javascript 写类方式之六
2009/07/05 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
利用python获取Ping结果示例代码
2017/07/06 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
开放系统互连参考模型
2016/06/29 面试题
金融专业应届生求职信
2013/11/02 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
化验室安全管理制度
2015/08/06 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
公开致歉信
2019/06/24 职场文书
golang定时器
2022/04/14 Golang