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高级程序设计(第3版)学习笔记7 js函数(上)
Oct 11 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
js绘制圆形和矩形的方法
Aug 05 Javascript
纯javascript实现分页(两种方法)
Aug 26 Javascript
xtemplate node.js 的使用方法实例解析
Aug 22 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
单击按钮发送验证码,出现倒计时的简单实例
Mar 17 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
Feb 21 Javascript
从0到1搭建Element的后台框架的方法步骤
Apr 10 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 Javascript
基于ajax实现上传图片代码示例解析
Dec 03 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+SQLite存储方案
2010/09/04 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
文字幻灯片
2006/06/26 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
python实现多线程的两种方式
2016/05/22 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
简单了解django索引的相关知识
2019/07/17 Python
python写程序统计词频的方法
2019/07/29 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
公司授权委托书范本
2014/09/18 职场文书
企业法人代表证明书
2014/09/27 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2015年仓库工作总结
2015/04/09 职场文书
2015年电教工作总结
2015/05/26 职场文书
焦点访谈观后感
2015/06/11 职场文书
小学运动会宣传稿
2015/07/23 职场文书
基于Python实现股票收益率分析
2022/04/02 Python