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 SocialHistory 检查访问者是否访问过某站点
Aug 02 Javascript
js或者jquery判断图片是否加载完成实现代码
Mar 20 Javascript
使用jquery动态加载js文件的方法
Dec 24 Javascript
js获取字符串字节数方法小结
Jun 09 Javascript
js实现Select列表各项上移和下移的方法
Aug 14 Javascript
easyui combobox开启搜索自动完成功能的实例代码
Nov 08 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
Nov 30 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 Javascript
微信小程序实现同时上传多张图片
Feb 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
Yii框架组件和事件行为管理详解
2016/05/20 PHP
php封装一个异常的处理类
2017/06/08 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
js select option对象小结
2013/12/20 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
python3操作mysql数据库的方法
2017/06/23 Python
python tornado微信开发入门代码
2018/08/24 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
Django框架反向解析操作详解
2019/11/28 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Python学习之os模块及用法
2020/06/03 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
什么是接口(Interface)?
2013/02/01 面试题
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
Python里面如何实现tuple和list的转换
2012/06/13 面试题
个人应聘自我评价分享
2013/11/18 职场文书
会展中心部门工作职责
2013/11/27 职场文书
希特勒的演讲稿
2014/05/23 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
公司承诺函范文
2015/01/21 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang