js实现文件上传表单域美化特效


Posted in Javascript onNovember 02, 2015

一款效果非常时尚的文件上传表单域美化特效,下面给出制作的简要教程。

先上几个效果饱饱眼福:

js实现文件上传表单域美化特效

js实现文件上传表单域美化特效

js实现文件上传表单域美化特效

使用方法

这些文件上传域的美化使用的方法都是隐藏原生的<input type="file">元素,然后使用一个<label>元素来制作美化效果。

 HTML结构

该文件上传域美化效果最基本的HTML结构如下:

<input type="file" name="file" id="file" class="inputfile" />
<label for="file">Choose a file</label>

 CSS样式

首先需要隐藏<input>元素。这里不能使用display: none或visibility: hidden来隐藏它,因为这样做只后,<input>元素里的值不会被上传到服务器端,而且按TAB键时这个<input>元素也不会被找到。隐藏的方法如下:

.inputfile {
 width: 0.1px;
 height: 0.1px;
 opacity: 0;
 overflow: hidden;
 position: absolute;
 z-index: -1;
}

接下来给<label>元素设置样式。这里要将<label>元素制作为一个按钮的样式。

.inputfile + label {
 font-size: 1.25em;
 font-weight: 700;
 color: white;
 background-color: black;
 display: inline-block;
}
 
.inputfile:focus + label,
.inputfile + label:hover {
 background-color: red;
}

当鼠标滑过label时需要将光标显示为一个小手的形状。

.inputfile + label {
 cursor: pointer; /* "hand" cursor */
}

为了制作可以使用键盘导航的效果,需要添加下面的代码。

.inputfile:focus + label {
 outline: 1px dotted #000;
 outline: -webkit-focus-ring-color auto 5px;
}

-webkit-focus-ring-color auto 5px可以在 Chrome,Opera 和 Safari浏览器中获取默认的边框外观。

js实现文件上传表单域美化特效

如果你使用了类似FastClick(一个在移动触摸设备上消除300毫秒tap-pause的工具库),并且你需要添加一些文本标签,那么按钮将不会正常工作,除非设置了pointer-events: none。

<label for="file"><strong>Choose a file</strong></label>    
.inputfile + label * {
 pointer-events: none;
}

JavaScript

最后需要做的事情是标识用户选择了哪些文件。原生的文件上传域是有这个功能的,但是这里使用的是虚拟的按钮。特效中使用javascript来实现这个功能。

<input type="file" name="file" id="file" class="inputfile" data-multiple-caption="{count} files selected" multiple />    
var inputs = document.querySelectorAll( '.inputfile' );
Array.prototype.forEach.call( inputs, function( input )
{
 var label = input.nextElementSibling,
 labelVal = label.innerHTML;
 
 input.addEventListener( 'change', function( e )
 {
 var fileName = '';
 if( this.files && this.files.length > 1 )
  fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
 else
  fileName = e.target.value.split( '\\' ).pop();
 
 if( fileName )
  label.querySelector( 'span' ).innerHTML = fileName;
 else
  label.innerHTML = labelVal;
 });
});

 浏览器禁用JavaScript的处理

如果浏览器禁用了JavaScript,那么只有使用原生的文件上传域组件。我们需要做的事情是在<html>元素上添加一个.no-js的class,然后使用Javascript来替换它。

<html class="no-js">
 <head>
  <!-- remove this if you use Modernizr -->
  <script>(function(e,t,n){var r=e.querySelectorAll("html")[0];r.className=r.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")})(document,window,0);</script>
 </head>
</html>
.
js .inputfile {
 width: 0.1px;
 height: 0.1px;
 opacity: 0;
 overflow: hidden;
 position: absolute;
 z-index: -1;
}
 
.no-js .inputfile + label {
 display: none;
}

以上就是js实现文件上传表单域美化特效,希望对大家的学习有所帮助。

Javascript 相关文章推荐
计算新浪Weibo消息长度(还可以输入119字)
Jul 02 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
Sep 23 Javascript
使用angular写一个hello world
Jan 23 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
Feb 05 Javascript
使用jquery清空、复位整个输入域
Apr 02 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
JS 实现 ajax 异步浏览器兼容问题
Jan 21 Javascript
JS验证码实现代码
Sep 14 Javascript
详解基于Wepy开发小程序插件(推荐)
Aug 01 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
Feb 14 Javascript
微信小程序webSocket的使用方法
Feb 20 Javascript
非常实用的12个jquery代码片段
Nov 02 #Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 #Javascript
jquery 表单验证之通过 class验证表单不为空
Nov 02 #Javascript
纯javascript移动优先的幻灯片效果
Nov 02 #Javascript
JS实现点击按钮获取页面高度的方法
Nov 02 #Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 #Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
Nov 02 #Javascript
You might like
php生成文件
2007/01/15 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
详解Python中的join()函数的用法
2015/04/07 Python
Python制作数据导入导出工具
2015/07/31 Python
Python实现定时任务
2017/02/08 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
查看keras的默认backend实现方式
2020/06/19 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
办公室驾驶员岗位职责
2013/11/15 职场文书
高中毕业生生活的自我评价
2013/12/08 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
开工典礼致辞
2015/07/29 职场文书
学风建设主题班会
2015/08/17 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python
Python道路车道线检测的实现
2021/06/27 Python
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL