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 相关文章推荐
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
关于jQuery object and DOM element
Apr 15 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
Jquery选中或取消radio示例
Sep 29 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
详解js中Json的语法与格式
Nov 22 Javascript
jQuery zTree树插件动态加载实例代码
May 11 jQuery
vue2.0结合Element-ui实战案例
Mar 06 Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
Apr 28 Javascript
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
通过layer实现可输入的模态框的例子
Sep 27 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
DOMXML函数笔记
2006/10/09 PHP
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
python write无法写入文件的解决方法
2019/01/23 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
浅谈sklearn中predict与predict_proba区别
2020/06/28 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
俄罗斯商务邀请函
2014/01/26 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
靠谱准确的求职信
2019/04/02 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python