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 面向对象编程(一) 封装
Aug 28 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
javascript中普通函数的使用介绍
Dec 19 Javascript
微信小程序 window_x64环境搭建
Sep 30 Javascript
详解在Angular项目中添加插件ng-bootstrap
Jul 04 Javascript
详解基于vue的移动web app页面缓存解决方案
Aug 03 Javascript
JavaScript贪吃蛇小组件实例代码
Aug 20 Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
基于jQuery实现的设置文本区域的光标位置
Jun 15 jQuery
微信小程序WebSocket实现聊天对话功能
Jul 06 Javascript
VUE.CLI4.0配置多页面入口的实现
Nov 25 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/09/30 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
javascript知识点收藏
2007/02/22 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
微信小程序实现折叠面板
2018/01/31 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
python实现感知器算法(批处理)
2019/01/18 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
python list多级排序知识点总结
2019/10/23 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
python中的django是做什么的
2020/07/31 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
毕业生实习鉴定
2013/12/11 职场文书
商场活动策划方案
2014/01/24 职场文书
工人先锋号申报材料
2014/12/29 职场文书
2015年仓库工作总结
2015/04/09 职场文书
孕妇病假条怎么写
2015/08/17 职场文书