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网格的三个新特性详解
Apr 04 HTML / CSS
利用css3-animation实现逐帧动画效果
Mar 10 HTML / CSS
CSS3打造磨砂玻璃背景效果
Sep 28 HTML / CSS
详解CSS3实现响应式手风琴效果
Jun 10 HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
Jul 10 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
Jan 06 HTML / CSS
详解HTML5中的picture元素响应式处理图片
Jan 03 HTML / CSS
详解Canvas 跨域脱坑实践
Nov 07 HTML / CSS
html5中嵌入视频自动播放的问题解决
May 25 HTML / CSS
HTML5逐步分析实现拖放功能的方法
Sep 30 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
Jan 27 HTML / CSS
CSS实现章节添加自增序号的方法
Jun 23 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
angularJS 入门基础
2015/02/09 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
vue路由 遍历生成复数router-link的例子
2019/10/30 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
Python中的取模运算方法
2018/11/10 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
商务邀请函范文
2014/01/14 职场文书
小组合作学习反思
2014/02/18 职场文书
幼儿园小班评语
2014/04/18 职场文书
煤矿安全承诺书
2014/05/22 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
化工厂员工工作总结
2015/10/15 职场文书