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实现漂亮便签样式
Mar 18 HTML / CSS
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
Jul 21 HTML / CSS
CSS3 @font-face属性使用指南
Dec 12 HTML / CSS
CSS3制作缩略图的详细过程
Jul 08 HTML / CSS
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
Aug 25 HTML / CSS
HTML5 canvas基本绘图之绘制阴影效果
Jun 27 HTML / CSS
HTML5中的进度条progress元素简介及兼容性处理
Jun 02 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
Oct 16 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 HTML / CSS
Html5获取高德地图定位天气的方法
Dec 26 HTML / CSS
在HTML中引入CSS的几种方式介绍
Dec 06 HTML / CSS
css3应用示例:新增的选择器
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判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
JS加ASP二级域名转向的代码
2007/05/17 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
javascript运动详解
2015/07/06 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
个人自荐信
2013/12/05 职场文书
幼儿园教师节活动方案
2014/02/02 职场文书
上班玩手机检讨书
2014/02/17 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
品质保证书格式
2015/02/28 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
python画条形图的具体代码
2022/04/20 Python