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 相关文章推荐
子页向父页传值示例
Nov 27 Javascript
JS实现页面超时后自动跳转到登陆页面
Jan 19 Javascript
不想让浏览器运行javascript脚本的方法
Nov 20 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
JavaScript 中有关数组对象的方法(详解)
Aug 15 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
Nov 09 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
基于JavaScript 性能优化技巧心得(分享)
Dec 11 Javascript
使用localStorage替代cookie做本地存储
Sep 25 Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 Javascript
vue中英文切换实例代码
Jan 21 Javascript
vue 使用v-for进行循环的实例代码详解
Feb 19 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 运行效率总结(提示程序速度)
2009/11/26 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
PHP实现添加购物车功能
2017/03/06 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
node.js的事件机制
2017/02/08 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Django内容增加富文本功能的实例
2017/10/17 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
教师考核材料
2014/05/21 职场文书
新店开张活动方案
2014/08/24 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL