视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
HTML中文件上传时使用的<inputtype="file">元素的样式自定义
2020-11-27 14:44:03 责编:小采
文档


Web页面中,在需要上传文件时基本都会用到<input type="file">元素,它的默认样式:

chrome下:

IE下:

不管是上面哪种,样式都比较简单,和很多网页的风格都不太协调。

根据用户的需求,设计风格,改变其显示样式的场合就比较多了。

如果,要像下面一样做一个bootstrap风格的上传按钮该如何实现。

搭建上传按钮所需的基本元素


代码如下: <span> <span>上传</span> <input type="file"> </span>

效果(chrome):

现在看到的分两行显示。

外围之所以没有换成div,是因为在IE7-浏览器中,只要不是设成inline,它的宽度全都会撑开到能撑到的宽度。如果设成inline,那元素的宽度就无法调整,所以这里用span然后设成inline-block能解决这样的问题。

增加样式将两行变成一行


代码如下: <span"> <span>上传</span> <input type="file"> </span>

css:


代码如下: .fileinput-button { position: relative; display: inline-block; } .fileinput-button input{ position: absolute; right: 0px; top: 0px; }

效果:

默认是没有浅蓝色边框,只有鼠标去点击后,才会显示,这里显示出来是为了看得清楚。

通过将外围的span设成display:relative,将input设成display:absolute的方式让他们都脱离文档流。

通过将input限定在外围的span中进行绝对定位的方式让本来两行显示的变成一行显示。

实际上这里已经overflow了,真正的宽度是“上传”文字的宽度,修改fileinput-button样式增加overflow: hidden


代码如下: .fileinput-button { position: relative; display: inline-block; overflow: hidden; }

效果:

很有意思,能看到上边后右边的蓝色边框了吧,其实就是把左边和下边的溢出部分给隐藏了。

这时候用鼠标去点击“上传”两个字实际上是点在input上,能够显示“打开”对话框,因为显示层级上input要比“上传”更靠近用户。

注意input定位中的right,为什么不用left定位。

当我们改成left后。

效果(chrome):

效果(IE):

在chrome下input元素中的选择按钮露出来,但是没关系,可以通过后面的设透明的方式把它透明掉。

但是在IE下确是会把输入框露出来,关键是鼠标移到输入框上时,指针会变成输入状态,这个就很没法处理了。

通过right的定位方式把输入框移到左边去的方式,可以在IE下回避出现鼠标指针变成输入态的情况。

透明input元素

css:


代码如下: .fileinput-button { position: relative; display: inline-block; overflow: hidden; } .fileinput-button input{ position: absolute; left: 0px; top: 0px; opacity: 0; -ms-filter: 'alpha(opacity=0)'; }

效果:

input完全不见了踪影,点击“上传”依然有效。

可以支持IE8+。

引入bootstrap,并添加按钮样式

head中增加外部css和js的引用。


代码如下: <link rel="stylesheet" href="bootstrap/bootstrap.css"> <link rel="stylesheet" href="bootstrap/bootstrap-theme.css"> <script src="bootstrap/jquery-1.10.2.js"></script> <script src="bootstrap/bootstrap.js"></script>

增加按钮样式。


代码如下: <span> <span>上传</span> <input type="file"> </span>

效果:

解决大小问题

如果为fileinput-button样式增加width:100px,将外围的span设成宽100px,会发现点击下部是没有反应的,原因就是input是默认大小,无法覆盖下部。

可以通过为input设置一个很大的字号将其撑大的方式来解决覆盖问题,这里就设个200px。


代码如下: .fileinput-button input{ position:absolute; right: 0px; top:0px; opacity: 0; -ms-filter: 'alpha(opacity=0)'; font-size: 200px; }

这样就能解决覆盖问题。

完成。

参考:jQuery-File-Upload

如果是要兼容IE7-可以参考jQuery-File-Upload中的写法。

代码:

XML/HTML Code复制内容到剪贴板

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <title></title>  
  5.     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">  
  6.     <link rel="stylesheet" href="bootstrap/bootstrap.css">  
  7.     <link rel="stylesheet" href="bootstrap/bootstrap-theme.css">  
  8.     <script src="bootstrap/jquery-1.10.2.js"></script>  
  9.     <script src="bootstrap/bootstrap.js"></script>  
  10.     <style>  
  11.         .fileinput-button {   
  12.             position: relative;   
  13.             display: inline-block;   
  14.             overflow: hidden;   
  15.         }   
  16.         .fileinput-button input{   
  17.             position:absolute;   
  18.             right: 0px;   
  19.             top: 0px;   
  20.             opacity: 0;   
  21.             -ms-filter: 'alpha(opacity=0)';   
  22.             font-size: 200px;   
  23.         }   
  24.     </style>  
  25. </head>  
  26. <body style="padding: 10px">  
  27.     <div align="center">  
  28.         <span class="btn btn-success fileinput-button">  
  29.             <span>上传</span>  
  30.             <input type="file">  
  31.         </span>  
  32.     </div>  
  33. </body>  
  34. </html>  

下载本文
显示全文
专题