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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
JQueryEasyUI Layout布局框架的使用
Apr 08 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
Feb 26 Javascript
JavaScript实现标题栏文字轮播效果代码
Oct 24 Javascript
javascript实现uploadify上传格式以及个数限制
Nov 23 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
Sep 27 Javascript
Node.js中的cluster模块深入解读
Jun 11 Javascript
vue中多个倒计时实现代码实例
Mar 27 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
JS代码优化的8点建议
Feb 04 Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 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 防恶意刷新实现代码
2010/05/16 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
PHP之短标签开启设置
2013/06/17 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
培养自己的php编码规范
2015/09/28 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python数据存储之 h5py详解
2019/12/26 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
联谊活动策划书
2014/01/26 职场文书
行政副总岗位职责
2014/02/23 职场文书
高中军训感言500字
2014/02/24 职场文书
市场营销专业求职信
2014/06/17 职场文书
投标售后服务承诺书
2015/04/29 职场文书
匿名信格式范文
2015/05/27 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
python 网络编程要点总结
2021/06/18 Python