天天看点

全屏网格折叠动画插件

前言

Duang,Duang,Duang,博主又来分享插件了,这次是一个炫酷的网格折叠动画效果,其原理模拟纸板折叠过程的动画,页面使用了大量CSS3属性,具体效果请看演示页面(建议使用新版谷歌、火狐浏览器观看,对于ie9以下不支持CSS3属性的浏览器不兼容)。

博主个人建议:这个效果可以用于网站引导用户进行操作,或者在页面资源加载较多时作为信息展示页面使用。

线上演示地址:

https://yangyunhe369.github.io/jQuery-Flod-Grid/

github地址:

https://github.com/yangyunhe369/jQuery-Flod-Grid

ps:github地址有代码演示,以及插件源码可供参考,线上演示地址可供预览。

插件逻辑

分析这个插件逻辑之前,先说一下实现动画效果的CSS3属性:transform-origin。这个属性主要用于设置旋转元素的基点位置,就是用于改变网格翻转时基点,因为默认网格翻转是以网格中心点为基点进行翻转,这样的动画效果不符合我们预期。下面这张图大概讲解了一下transform-origin属性配合rotate属性实现网格翻转动画的原理。

在这张图里,你会看到每个网格对应一个数字,这是方便理解整体网格区域与窗口显示区域的关系。整体网格容器是由33个网格组成,一共分为3排,每排11个。在我们的可视区域内,如果不算上屏幕两边的半个网格区域,一共有6个网格,所有还有5个网格(包括未显示完整的网格)未显示。可以根据序号得出左边有3个网格(0、1、2),右边有2个网格(9、10)隐藏了。

ps:这里的序号对应每个网格排列的序号(从 0 开始计算)

下面是分解动画的过程:

从这里可以观察出,每排的网格都会逐渐向中心折叠,这里的中心元素分别对应序号5(第6个网格)、16(第17个网格)、27(第28个网格)。当第一排和第三排网格都折叠完毕时,第一排网格和第三排网格(5、27)朝向网格16折叠,最后网格16的原点基于中心的进行折叠。这就是所有网格动画的一个完整的执行过程。

源码解析

下面展示一下源码:

//定义基础变量,以及插件api
var _ops = $.extend({
    shadeTime: 1000, //遮罩层遮挡网格时长
    flodTime: 1000, //初始化页面执行网格折叠动画的延迟时长
    showBtnTime: 4500, //折叠动画开始至显示按钮的延迟时长
    loading_zzc: 'loading_zzc', //遮罩层的class
    loading_btns: 'loading_btns', //网格动画控制按钮的class
    btn_logo: 'btn_logo', //网格动画控制按钮子元素的class
    preloader: 'preloader', //网格容器的class
    square_box: 'square_box', //网格容器子元素的class
    square: 'square' //网格的class
}, options);
var $this = $(this),
    _shadeTime = _ops.shadeTime, //遮罩层遮挡网格时长
    _flodTime = _ops.flodTime, //初始化页面执行网格折叠动画的延迟时长
    _showBtnTime = _ops.showBtnTime, //折叠动画开始至显示按钮的延迟时长
    _loading_zzc = _ops.loading_zzc, //遮罩层的class
    _loading_btns = _ops.loading_btns, //网格动画控制按钮的class
    _btn_logo = _ops.btn_logo, //网格动画控制按钮子元素的class
    _preloader = _ops.preloader, //网格容器的class
    _square_box = _ops.square_box, //网格容器子元素的class
    _square = _ops.square; //网格的class           

以下是关于网格折叠动画的代码:

var p = 'perspective(600px)'; //定义 3D 元素距视图的距离
for(var i=0;i<5;i++){
  $('.'+_square).eq(i).css({'transform':p+' rotateY(-90deg)','transition-delay':(i+1)*0.3+'s'});
}
for(var j=11;j>5;j--){
  $('.'+_square).eq(j).css({'transform':p+' rotateY(90deg)','transition-delay':(11-j)*0.3+'s'});
}
for(var k=12;k<16;k++){
  $('.'+_square).eq(k).css({'transform':p+' rotateY(-90deg)','transition-delay':(k-9)*0.3+'s'});
}
for(var m=22;m>16;m--){
  $('.'+_square).eq(m).css({'transform':p+' rotateY(90deg)','transition-delay':(23-m)*0.3+'s'});
}
for(var s=23;s<27;s++){
  $('.'+_square).eq(s).css({'transform':p+' rotateY(-90deg)','transition-delay':(s-19)*0.3+'s'});
}
for(var g=33;g>27;g--){
  $('.'+_square).eq(g).css({'transform':p+' rotateY(90deg)','transition-delay':(35-g)*0.3+'s'});
}
$('.'+_square).eq(5).css({'transform':p+' rotateX(90deg)','transition-delay':'2.4s'});
$('.'+_square).eq(27).css({'transform':p+' rotateX(-90deg)','transition-delay':'2.7s'});
$('.'+_square).eq(16).css({'transform':p+' rotateX(90deg)','transition-delay':'3.2s'});           

以下是关于网格展开动画的代码:

var p = 'perspective(600px)'; //定义 3D 元素距视图的距离
for(var i=4;i>-1;i--){
  $('.'+_square).eq(i).css({'transform':p+' rotateY(0deg)','transition-delay':(9-i)*0.3+'s'});
}
for(var j=6;j<12;j++){
  $('.'+_square).eq(j).css({'transform':p+' rotateY(0deg)','transition-delay':(j-1)*0.3+'s'});
}
for(var k=15;k>11;k--){
  $('.'+_square).eq(k).css({'transform':p+' rotateY(0deg)','transition-delay':(19-k)*0.3+'s'});
}
for(var m=17;m<23;m++){
  $('.'+_square).eq(m).css({'transform':p+' rotateY(0deg)','transition-delay':(m-13)*0.3+'s'});
}
for(var s=26;s>22;s--){
  $('.'+_square).eq(s).css({'transform':p+' rotateY(0deg)','transition-delay':(29-s)*0.3+'s'});
}
for(var g=28;g<34;g++){
  $('.'+_square).eq(g).css({'transform':p+' rotateY(0deg)','transition-delay':(g-25)*0.3+'s'});
}
$('.'+_square).eq(5).css({'transform':p+' rotateX(0deg)','transition-delay':'0.6s'});
$('.'+_square).eq(27).css({'transform':p+' rotateX(0deg)','transition-delay':'0.3s'});
$('.'+_square).eq(16).css({'transform':p+' rotateX(0deg)','transition-delay':'0s'});           

本插件的完整源码,可以访问github地址:

作者: 弦云孤赫 原文链接:

http://www.yangyunhe.me/2017/jquery-flodGrid/

本文可以转载,但务必注明原作者和原出处。

继续阅读