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 相关文章推荐
学做Bootstrap的第一个页面
May 15 HTML / CSS
纯CSS实现预加载动画效果
Sep 06 HTML / CSS
CSS3实现类似翻书效果的过渡动画的示例代码
Sep 06 HTML / CSS
CSS3实现苹果手机解锁的字体闪亮效果示例
Jan 05 HTML / CSS
HTML5 canvas基本绘图之绘制线段
Jun 27 HTML / CSS
详解使用HTML5的classList属性操作CSS类
Oct 13 HTML / CSS
canvas像素画板的实现代码
Nov 21 HTML / CSS
html5菜单折纸效果
Apr 22 HTML / CSS
详解HTML5中div和section以及article的区别
Jul 14 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
Oct 08 HTML / CSS
iframe跨域的几种常用方法
Nov 11 HTML / CSS
html+css实现环绕倒影加载特效
Jul 07 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
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
python的launcher用法知识点总结
2020/08/07 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
JPA的特点
2014/10/25 面试题
英语专业毕业生自我鉴定
2013/11/09 职场文书
写给女生的道歉信
2014/01/14 职场文书
清扬洗发水广告词
2014/03/14 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
身份证丢失证明
2015/06/19 职场文书
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle