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 相关文章推荐
各种效果的jquery ui(接口)介绍
Sep 17 Javascript
JavaScript中几种常见排序算法小结
Feb 22 Javascript
js函数参数设置默认值的一种变通实现方法
May 26 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
Dec 08 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
jQuery Mobile页面返回不需要重新get
Apr 26 Javascript
Javascript对象字面量的理解
Jun 22 Javascript
JS正则替换掉小括号及内容的方法
Nov 29 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
Nov 15 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
Mar 19 Javascript
简单了解vue.js数组的常用操作
Jun 17 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
简单介绍Python中的RSS处理
2015/04/13 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
如何通过python检查文件是否被占用
2020/12/18 Python
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
安全标语口号
2014/06/09 职场文书
明星员工获奖感言
2014/08/14 职场文书
企业计划生育责任书
2015/05/09 职场文书
活动主持人开场白
2015/05/28 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
python基础之错误和异常处理
2021/10/24 Python
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL