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 相关文章推荐
页面中js执行顺序
Nov 09 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
Jun 04 Javascript
使用js修改客户端注册表的方法
Aug 09 Javascript
JavaScript限定复选框的选择个数示例代码
Aug 25 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
微信小程序 教程之事件
Oct 18 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
Jan 23 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
从原生JavaScript到React深入理解
Jul 23 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的FTP学习(三)
2006/10/09 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
TensorFlow实现简单卷积神经网络
2018/05/24 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python 简单的调用有道翻译
2020/11/25 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
教师推荐信范文
2013/11/24 职场文书
大学四年规划书范文
2013/12/27 职场文书
写给老师的感谢信
2015/01/20 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
我的生日感言
2015/08/03 职场文书
调解协议书范本
2016/03/21 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技