jQuery和CSS3通过AJAX调用切换页面过渡动画特效
这是一款效果非常酷的JQUERY和CSS3通过AJAX调用切换页面过渡动画特效插件。该页面切换特效使用AJAX来动态加载链接内容,在页面加载的时候,使用CSS3来制作非常酷的页面过渡动画效果。插件中使用pushState
方法来管理浏览器的浏览历史。
制作方法
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)。
body::after, body::before { /* these are the 2 half blocks which cover the content once the animation is triggered */ height : 50 vh; 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()
函数。