jQuery实现切换页面过渡动画效果


Posted in Javascript onOctober 29, 2015

直接为大家介绍制作过程,希望大家可以喜欢。

HTML结构

该页面切换特效的HTML结构使用一个<main>元素来作为页面的包裹元素,div.cd-cover-layer用于制作页面切换时的遮罩层,div.cd-loading-bar是进行ajax加载时的loading进度条。

<main>
 <div class="cd-index cd-main-content">
  <div>
   <h1>Page Transition</h1>
   <!-- your content here -->
  </div>
 </div>
</main>
 
<div class="cd-cover-layer"></div> <!-- this is the cover layer -->
 
<div class="cd-loading-bar"></div> <!-- this is the loading bar -->

 CSS样式

该页面切换特效中使用body::before和body::after伪元素在页面切换过程中创建两个遮罩层来遮住页面内容。它们的定位是固定定位,高度等于50vh,宽度为100%。默认情况下,使用CSS transform属性将它们隐藏起来(translateY(-100%)/translateY(100%))。当用户切换页面的时候,这些元素被移动回视口当中(通过在<body>元素上添加.page-is-changing class)。
下面的图片演示了这个过程:

jQuery实现切换页面过渡动画效果

页面切换特效

body::after, body::before {
 /* these are the 2 half blocks which cover the content once the animation is triggered */
 height: 50vh;
 width: 100%;
 position: fixed;
 left: 0;
}
body::before {
 top: 0;
 transform: translateY(-100%);
}
body::after {
 bottom: 0;
 transform: translateY(100%);
}
body.page-is-changing::after, body.page-is-changing::before {
 transform: translateY(0);
}

页面切换时,页面内容的淡入淡出效果是通过改变div.cd-cover-layer的透明度实现的。它覆盖了.cd-main-content元素,并具有相同的背景色,然后在<body>被添加.page-is-changing class的时候,将透明度从0修改为1。
Loading进度条使用.cd-loading-bar::before伪元素来制作。默认它被缩小(scaleX(0))和transform-origin: left center。当页面切换开始时它被使用scaleX(1)放大会原来的尺寸。

.cd-loading-bar {
 /* this is the loading bar - visible while switching from one page to the following one */
 position: fixed;
 height: 2px;
 width: 90%;
}
.cd-loading-bar::before {
 /* this is the progress bar inside the loading bar */
 position: absolute;
 left: 0;
 top: 0;
 height: 100%;
 width: 100%;
 transform: scaleX(0);
 transform-origin: left center;
}
.page-is-changing .cd-loading-bar::before {
 transform: scaleX(1);
}

特效中平滑的过渡效果使用CSS Transitions来实现。每一个动画元素都被添加了不同的transition-delay,以实现不同的元素动画顺序。
 JAVASCRIPT

该页面切换特效中在链接上使用data-type="page-transition"属性,用于触发页面切换事件。当插件检测到用户点击事件,changePage()方法将被执行。

$('main').on('click', '[data-type="page-transition"]', function(event){
  event.preventDefault();
  //detect which page has been selected
  var newPage = $(this).attr('href');
  //if the page is not animating - trigger animation
  if( !isAnimating ) changePage(newPage, true);
});

这个方法会触发页面切换动画,并通过loadNewContent()方法加载新内容。

function changePage(url, bool) {
  isAnimating = true;
  // trigger page animation
  $('body').addClass('page-is-changing');
  //...
  loadNewContent(url, bool);
  //...
}

当新的内容被加载后,会替代原来<main>元素中的内容。.page-is-changing class被从body中移除,新加载的内容会被添加到window.history中(使用pushState()方法)。

function loadNewContent(url, bool) {
  var newSectionName = 'cd-'+url.replace('.html', ''),
   section = $('<div class="cd-main-content '+newSectionName+'"></div>');
    
  section.load(url+' .cd-main-content > *', function(event){
   // load new content and replace <main> content with the new one
    $('main').html(section);
    //...
    $('body').removeClass('page-is-changing');
    //...
 
    if(url != window.location){
     //add the new page to the window.history
     window.history.pushState({path: url},'',url);
    }
 });
}

为了在用户点击浏览器的回退按钮时触发相同的页面切换动画效果,插件中监听popstate事件,并在它触发时执行changePage()函数。

$(window).on('popstate', function() {
  var newPageArray = location.pathname.split('/'),
    //this is the url of the page to be loaded 
    newPage = newPageArray[newPageArray.length - 1];
  if( !isAnimating ) changePage(newPage);
});
Javascript 相关文章推荐
IE事件对象(The Internet Explorer Event Object)
Jun 27 Javascript
javascript中数组中求最大值示例代码
Dec 18 Javascript
javascript实现iframe框架延时加载的方法
Oct 30 Javascript
Jquery简单实现GridView行高亮的方法
Jun 15 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
js实现简单的网页换肤效果
Jan 18 Javascript
JS给按钮添加跳转功能类似a标签
May 30 Javascript
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
收集前端面试题之url、href、src
Mar 22 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 Javascript
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
js实现跨域的4种实用方法原理分析
Oct 29 #Javascript
异步JS框架的作用以及实现方法
Oct 29 #Javascript
图解JavaScript中的this关键字
May 28 #Javascript
jquery validate demo 基础
Oct 29 #Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 #Javascript
jquery实现的伪分页效果代码
Oct 29 #Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
Oct 29 #Javascript
You might like
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
使用PHP批量生成随机用户名
2008/07/10 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
使用js简单实现了tree树菜单
2013/11/20 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
Python中functools模块函数解析
2017/03/12 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
python实现任意位置文件分割的实例
2018/12/14 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
幼儿园元旦亲子活动方案
2014/02/17 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
大学学生个人总结
2015/02/15 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书