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 相关文章推荐
jQuery获取注册信息并提示实现代码
Apr 21 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
May 17 Javascript
JavaScript验证电子邮箱的函数
Aug 22 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
Sep 24 Javascript
Vue2几种常见开局方式详解
Sep 09 Javascript
Vue的elementUI实现自定义主题方法
Feb 23 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
May 31 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 Javascript
fastadmin中调用js的方法
May 14 Javascript
vue获取data数据改变前后的值方法
Nov 07 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
Sep 21 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
小结Python用fork来创建子进程注意事项
2014/07/03 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
出国留学自荐信
2013/10/25 职场文书
公司道歉信范文
2014/01/09 职场文书
小学数学教学反思
2014/02/02 职场文书
考博导师推荐信范文
2015/03/27 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书