关于type="file"的input框样式修改小结

   2015-08-09 0
核心提示:表单中的input type=”file”在前端开发中经常会用到,但是很悲剧的是input type=”file”在各个浏览器下表现不统一,样式很难起作用;那么我们如何来处理这个问题呢,这就是我们今天讨论的主要内容了
关于type="file"的input是啥?

这个是啥我觉得没必要再说了,反正大家都知道,然后在现在有各种手机的时代,还可以通过直接拍照的方式来上传,反正比以前好玩多了。

并且以前是只能上传一个文件,现在的话,只要增加multiple属性就可以上传多个文件,并且还有很多的文件格式支持,废话不多说,具体请看http://www.w3.org/html/ig/zh/wiki/HTML5/number-state#.E6.96.87.E4.BB.B6.E4.B8.8A.E4.BC.A0.E7.8A.B6.E6.80.81

上传按钮的样式调整

玩过CSS的人朋友都知道,在HTML元素中,表单控件元素的样式修改是最痛苦的,很多控件的样式是跟着系统主题来改变的,想要去修改的话,只能模拟来实现,尤其尤其是在IE浏览器中。

对于type="file"这个上传按钮,曾经我们修改他的样式,有人用过模拟的方式,但据说用模拟的方式有可能会出现什么所谓的安全性问题,好吧,这对于我这样的一个页面仔,切图仔而言,不懂,就算懂了也不知道怎么去处理。那就不模拟吧……

可是不模拟的话,又要怎么修改样式呢?

图片定位叠加方案

之前的之前,我所知道的方法,其实大家也都知道的方法,就是通过将type="file"这个上传按钮透明后,然后叠加在一个图片上,这样就可以让人感觉是通过点击上传图片后实现的,也不用看那个原生的上传按钮了。


复制代码
代码如下:
<input type="file" id="upfile" ><span ></span>.up_icon,.up_input {position: absolute;top: 10px;left: 10px;width: 64px;height: 64px;z-index: 2}.up_icon {overflow: hidden;font-size: 0;line-height: 99em;background: url(http://sfault-image.b0.upaiyun.com/346/967/3469672357-54250d7235406_articlex) no-repeat 0 0;z-index: 1;}

看一下demo:http://jsbin.com/qacijusihivi/1/

在这个demo中应该很清晰可以看到实现的方式,通过定位的方式将上传按钮定位在图片之上,图片可以作为一个空标签的背景图片,然后把上传按钮的opacity透明度设置为0之后就看不到这个按钮了,但是实际是存在的,然后……然后……就没有然后了,效果就有了……

针对webkit的方案

这个针对webkit内核的方案其实有点扯,没多少实际用处,因为只有对webkit内核有效,如果不支持带-webkit-前缀的写法,就没任何效果了,所以各位看官就当娱乐一下看看吧。


复制代码
代码如下:
<input type="file" id="upfile">input[type="file"]::-webkit-file-upload-button {position: absolute;top: 10px;left: 10px;width: 64px;height: 64px;overflow: hidden;line-height: 99em;background:url(http://sfault-image.b0.upaiyun.com/346/967/3469672357-54250d7235406_articlex) no-repeat 0 0;border: 0 none;z-index: 2;}

先看demo:http://jsbin.com/wicihihabifi/1/

在这个demo中的HTML结构很简单,就一个[input标签就可以了,比前面看到的方法简洁多了,但是对于兼容性而言肯定是差多了,不晓得在手机端是怎么样,现在手机端大部分都是webkit内核的浏览器,算了,且当娱乐,看之乐之吧~

简单的HTML结构修改样式完全是依赖于::-webkit-file-upload-button这个伪元素,针对这个伪元素的样式做相对应的修改即可了,因为这个是一个普通的按钮元素而已。这个按钮元素如果通过展示shadow DOM的方式来查看的话,我们会更清晰。

关于type=

这是chrome开发者工具中看到的DOM树,一般而言,我们如果没开启查看shadow DOM的话,是看不到一个type="file"input中还包含这么多内容。开启的方式很简单,点击开发者工具右上角的齿轮关于type=,然后在弹出的层中把这个勾打上就可以了。

关于type=

现在各位看官可以自行查看一下其他input标签了,如果有shadow DOM的话,必然可以展开。然后在HTML5新的标签中,有一些也是有的……

最后

对于type="file"input标签,目前来说,我所知道的可以修改样式方法就这两个,然后针对webkit的方案也很有局限,但对于手机端来说应该没什么问题。或许有人说,那其他浏览器怎么办啊,是啊,怎么办呢,我也不知道。

在Firefox浏览器中,虽然有一个选择符input type="file" > button[type="button"]存在与forms.css中,但是不知道为什么,我在自己的样式添加这个选择符后,还是没看到任何效果,所以就没再继续玩下去了。

PS:对于form.css这个文件,如果是Firefox浏览器的粉丝,必然知道resource://gre-resources/forms.css这个路径的存在。

哦了,到这里就结束了,还有一个opera浏览器呢,我在mac里玩的时候,-webkit-这个前缀的样式直接被继承了……

附件:上传按钮图片:关于type=
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • React 上传进度条问题 原生js上传 input type=
    canUpload: true,//是否可以上传,初始值不可上传,所以disabled为truefilename: '',//上传文件的名称loading: false,//点击上传的时候出现加载图标fileList: [],//已上传的文件列表isNumber: true,//判断数量是否为数字,var file = document.getElementById(
    03-08
  • html type="number" 在IOS中无效 还能输入其他
    解决 方法  oninput="this.value=this.value.replace(/[^0-9.]+/,'');" 例如:input /    
    03-08
  • 是干什么的,为什么要把html写在js中? 这是什
    这一段存放了一个模板。在js里面,经常需要使用js往页面中插入html内容。比如这样:var number = 123;$('#d').append('div class="t"'+number+'/div')如果html很短还好说,但是遇到描述里面的这么大段,直接用字符串存储会很困难,因为不光要处理单引号,还需
    03-08
  • 和<input type="datetime-local"/>中的下拉箭头
    项目中使用了bootstrp,结果发现在Chrome中,类型为input type="date"/和input type="datetime-local"/中的下拉箭头消失了查了下资料,据说是chrome的BUG,而且只是chrome 25系列版本的BUG解决办法,就是加上如下的CSS,说白了,就是调整箭头和上下选择按钮的
    02-08
  • jquery.form插件 提交表单 type="hidden"取不到
    1、外国文献:说可以改成其他的(非hidden),再加style="display:none"隐藏。INPUT type="password" style="display:none"name="invisible-password"value="mypassword"https://www.w3.org/TR/html4/interact/forms.html#successful-controls2、文
    02-08
  • css修改input type="file" 样式的方法
      首先找到了一个网站,可以参考这个网站http://www.quirksmode.org/dom/inputfile.html另外我们可以想办法把file的背景颜色去掉,position=absolute,z-index=-1,这样隐去file,然后用label 标签里边加上文字,设置样式,具体代码如下div style="margin-bot
    02-08
  • html5 input type=search
    styleinput[type="search"]{ border-radius:2px;} input::-webkit-search-cancel-button {margin-right:10px}}/stylesearch:input type="search"/
    02-08
  • ">jQuery动态添加<input type="file">
    ">jQuery动态添加<input type="file">
      有时候需要在页面上允许用户上传多个文件,个数由用户自己决定,个数多了也可以删除,使用jQuery可以很简单的实现这个功能。!DOCTYPE htmlhtmlheadtitletest.html/titlemeta http-equiv="content-type" content="text/html; charset=UTF-8"script type="t
    02-08
点击排行