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 相关文章推荐
Uglifyjs(JS代码优化工具)入门 安装使用
Apr 13 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
Jan 25 Javascript
JS调用CS里的带参方法实例
Aug 01 Javascript
获取表单控件原始(初始)值的方法
Aug 21 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
Aug 27 Javascript
jQuery CSS3相结合实现时钟插件
Jan 08 Javascript
Javascript 5种方法实现过滤删除前后所有空格
Jun 22 Javascript
Cookies 和 Session的详解及区别
Apr 21 Javascript
JS立即执行函数功能与用法分析
Jan 15 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 Javascript
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
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在各种web服务器的运行模式详解
2013/06/03 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
市场营销专业毕业生自荐信
2013/11/02 职场文书
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS
golang内置函数len的小技巧
2021/07/25 Golang
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript