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 相关文章推荐
讨论javascript(一)工厂方式 js面象对象的定义方法
Dec 15 Javascript
javascript 全等号运算符使用说明
May 31 Javascript
jquery中获取元素的几种方式小结
Jul 05 Javascript
10个基于浏览器的JavaScript调试工具分享
Feb 07 Javascript
extjs ColumnChart设置不同的颜色实现代码
May 17 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
Angular中实现树形结构视图实例代码
May 05 Javascript
详解vue express启动数据服务
Jul 05 Javascript
详解Node中导入模块require和import的区别
Aug 11 Javascript
ES6 javascript的异步操作实例详解
Oct 30 Javascript
使用JS来动态操作css的几种方法
Dec 18 Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 Javascript
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面试题附答案
2009/01/07 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
2016/10/20 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
如何基于python生成list的所有的子集
2019/11/11 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
用python实现学生管理系统
2020/07/24 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
讲党性心得体会
2014/09/03 职场文书
购房委托书
2014/10/15 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
python中subplot大小的设置步骤
2021/06/28 Python
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript