页面切换滑动过场
今天看一篇文章页面切换的文章,作者做了很多页面切换的效果,链接如下here, 作者给了我一种页面切换的思路,记录如下,其实之前总觉得所有页面应该看成一个整体来看,可是这样反而限制了一些效果的实现,而作者的基本思路是每个页面都有独立的动画,只是每两个相邻页面的各自动画要相互配合,配合是指的动画时间契合和动画形式契合,所以我就简单学习作者的代码,练习了一个demo,以加强这种思路~
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<button id="btn">换</button>
<div class="main">
<div class="page page1 cur">我是第一页</div>
<div class="page page2">我是第二页</div>
<div class="page page3">我是第三页</div>
</div>
</body>
</html>
html, body {
height: 100%;
overflow:hidden;
}
.main {
position: relative;
width: 100%;
height: 100%;
}
.page {
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 100%;
visibility: hidden;
line-height: 50;
text-align: center;
}
.page1 {
background-color: red;
}
.page2 {
background-color: green;
}
.page3 {
background-color: blue;
}
.cur {
visibility: visible;
}
.moveToLeft {
animation: moveToLeft 3s ease both;
}
.moveFromRight {
animation: moveFromRight 3s ease both;
}
@keyframes moveToLeft {
from {transform: translateX(0);}
to {transform: translateX(-100%);}
}
@keyframes moveFromRight {
from {transform: translateX(100%);}
to {transform: translateX(0);}
}
$(function() {
var isAnimating = false;
var endPre = false;
var endNext = false;
function switchPage() {
isAnimating = true;
if($('.cur').next().length === 0) {
$('.cur').removeClass('cur');
$('.page1').addClass('cur');
isAnimating = false;
return;
}
$('.cur').addClass('moveToLeft').one('webkitAnimationEnd', function() {
console.log('3', $(this)[0]);
$(this).removeClass('cur moveToLeft');
endPre = true;
if(endNext) {
isAnimating = false;
endNext = false;
endPre = false;
}
});
$('.cur').next().addClass('cur moveFromRight').one('webkitAnimationEnd', function() {
$(this).removeClass('moveFromRight');
endNext = true;
if(endPre) {
isAnimating = false;
endPre = false;
endNext = false;
}
});
}
$("#btn").on('click', function() {
!isAnimating && switchPage();
});
});
其中对于webkitAnimationEnd的监听刚开始用了on,于是乎遇上了坑,就是每次对事件webkitAnimationEnd添加on的监听,监听回调都会进入到该事件的调用队列里去,也就是说我一直调用switchPage方法会给webkitAnimationEnd事件添加很多个回调,然而这不是我想要的,我只想每次调用switchPage只执行最近一次声明的回调,所以用了one方法,其实也可以在回调里用off把当次监听干掉,都可以,,,只是又踩坑了呵呵呵。。。
效果如下:
See the Pen 页面滑动切换 by Zhang Xiao (@zhang-xiao) on CodePen.