jQuery:消除动画之间的白屏"pause"
jQuery: eliminate white screen "pause" between animations
我刚刚发现 Barba.js 并且发现它非常有用。它提供同一网站的 URL 之间的平滑过渡。
我整理了一个Plunker,由两个页面(index.html和about.html)组成,在帮助下加载顺利jQuery 的 fadeIn()
和 fadeOut()
方法。
$(document).ready(function() {
var transEffect = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(val => this.fadeInNewcontent($(this.newContainer)));
},
fadeInNewcontent: function(nc) {
nc.hide();
var _this = this;
$(this.oldContainer).fadeOut(1000).promise().done(() => {
nc.css('visibility', 'visible');
nc.fadeIn(1000, function() {
_this.done();
});
$('html, body').animate({
scrollTop: 300
},1000);
});
}
});
Barba.Pjax.getTransition = function() {
return transEffect;
}
Barba.Pjax.start();
});
这个动画的问题是它们之间有一个白屏间隔。
我怎样才能消除这个间隔,使过渡更顺畅? "smoother" 我的意思是类似于 this one(单击 "view case")。
用setTimeout()
叠加淡出淡入如何?这应该可以防止它完全消隐,这是要避免的。
您可以尝试以下操作:
$(document).ready(function() {
var transEffect = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(val => this.fadeInNewcontent($(this.newContainer)));
},
fadeInNewcontent: function(nc) {
nc.hide();
var _this = this;
// manipulate these values
let fadeOutTime = 1000;
let fadeInTime = 1000;
let overlapTime = 100;
$(this.oldContainer).fadeOut(fadeOutTime);
// use setTimeout() to begin fadeIn before fadeOut is completely done
setTimeout(function () {
nc.css('visibility', 'visible');
nc.fadeIn(fadeInTime, function() {
_this.done();
});
$('html, body').animate({
scrollTop: 300
}, fadeInTime);
}, fadeOutTime - overlapTime)
}
});
Barba.Pjax.getTransition = function() {
return transEffect;
}
Barba.Pjax.start();
});
注意:这只是一个尝试,plunker 很有用,但很难看到动画的实际效果。
更新
我想你需要像上面这样的东西,但是如果你想淡出 in/out 黑色,那么你还需要做一些事情,比如创建一个 div 包装器将您的内容添加到您的正文中,并给它 div 您应用程序的背景颜色 #eff3f6,然后将实际的正文背景设为黑色。您需要做一些工作才能获得您想要的确切效果,但类似的内容或在下面评论中的 SO link 中应该有所帮助。
白色屏幕是主体颜色,因为您正在使用 promise().done(..)
jquery
在 fadeOut
完成后应用 fadeIn
,因此主体颜色会出现。所以,这是一个类似于您所拥有的示例:
<style type="text/css">
.One{
width: 100%;
height: 100%;
position: absolute;
margin: 0px;
padding: 0px;
top: 0px;
left: 0px;
background-color: #476d80;
cursor: pointer;
z-index: 1;
}
.Two{
width: 100%;
height: 100%;
position: absolute;
margin: 0px;
padding: 0px;
top: 0px;
left: 0px;
background-color: #03A9F4;
cursor: pointer;
display: none;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('div.one').click(function(){
$(this).fadeOut(1000).promise().done(function(){
$('div.Two').fadeIn(1000);
});
});
});
</script>
<div class="One"></div>
<div class="Two"></div>
就像您在上面的示例中看到的那样,也会出现白屏,所以如果您不希望出现这种情况,请不要使用 promise().done(..)
。
$(document).ready(function(){
$('div.one').click(function(){
$(this).fadeOut(1000);
$('div.Two').fadeIn(1000);
});
});
您可以这样编辑您的代码:
$(this.oldContainer).fadeOut(1000).promise().done(() => {
$('html, body').animate({
scrollTop: 300
},1000);
});
nc.css('visibility', 'visible');
nc.fadeIn(1000, function() {
_this.done();
});
我想出了这个版本的脚本:
$(function(){
var transEffect = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(val => this.fadeInNewcontent($(this.newContainer)));
},
fadeInNewcontent: function(nc) {
var _this = this;
nc.css('visibility', 'visible');
nc.show().promise().done(() => {
$(this.oldContainer).fadeOut(50);
if (!isMobile.any()) {
$('html, body').delay(100).animate({
scrollTop: 200
},700);
}
});
}
});
Barba.Pjax.getTransition = function() {
return transEffect;
}
Barba.Pjax.start();
});
更好了,但不够流畅。查看 real life project 上的效果。我该如何改进它?
我刚刚发现 Barba.js 并且发现它非常有用。它提供同一网站的 URL 之间的平滑过渡。
我整理了一个Plunker,由两个页面(index.html和about.html)组成,在帮助下加载顺利jQuery 的 fadeIn()
和 fadeOut()
方法。
$(document).ready(function() {
var transEffect = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(val => this.fadeInNewcontent($(this.newContainer)));
},
fadeInNewcontent: function(nc) {
nc.hide();
var _this = this;
$(this.oldContainer).fadeOut(1000).promise().done(() => {
nc.css('visibility', 'visible');
nc.fadeIn(1000, function() {
_this.done();
});
$('html, body').animate({
scrollTop: 300
},1000);
});
}
});
Barba.Pjax.getTransition = function() {
return transEffect;
}
Barba.Pjax.start();
});
这个动画的问题是它们之间有一个白屏间隔。
我怎样才能消除这个间隔,使过渡更顺畅? "smoother" 我的意思是类似于 this one(单击 "view case")。
用setTimeout()
叠加淡出淡入如何?这应该可以防止它完全消隐,这是要避免的。
您可以尝试以下操作:
$(document).ready(function() {
var transEffect = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(val => this.fadeInNewcontent($(this.newContainer)));
},
fadeInNewcontent: function(nc) {
nc.hide();
var _this = this;
// manipulate these values
let fadeOutTime = 1000;
let fadeInTime = 1000;
let overlapTime = 100;
$(this.oldContainer).fadeOut(fadeOutTime);
// use setTimeout() to begin fadeIn before fadeOut is completely done
setTimeout(function () {
nc.css('visibility', 'visible');
nc.fadeIn(fadeInTime, function() {
_this.done();
});
$('html, body').animate({
scrollTop: 300
}, fadeInTime);
}, fadeOutTime - overlapTime)
}
});
Barba.Pjax.getTransition = function() {
return transEffect;
}
Barba.Pjax.start();
});
注意:这只是一个尝试,plunker 很有用,但很难看到动画的实际效果。
更新
我想你需要像上面这样的东西,但是如果你想淡出 in/out 黑色,那么你还需要做一些事情,比如创建一个 div 包装器将您的内容添加到您的正文中,并给它 div 您应用程序的背景颜色 #eff3f6,然后将实际的正文背景设为黑色。您需要做一些工作才能获得您想要的确切效果,但类似的内容或在下面评论中的 SO link 中应该有所帮助。
白色屏幕是主体颜色,因为您正在使用 promise().done(..)
jquery
在 fadeOut
完成后应用 fadeIn
,因此主体颜色会出现。所以,这是一个类似于您所拥有的示例:
<style type="text/css">
.One{
width: 100%;
height: 100%;
position: absolute;
margin: 0px;
padding: 0px;
top: 0px;
left: 0px;
background-color: #476d80;
cursor: pointer;
z-index: 1;
}
.Two{
width: 100%;
height: 100%;
position: absolute;
margin: 0px;
padding: 0px;
top: 0px;
left: 0px;
background-color: #03A9F4;
cursor: pointer;
display: none;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('div.one').click(function(){
$(this).fadeOut(1000).promise().done(function(){
$('div.Two').fadeIn(1000);
});
});
});
</script>
<div class="One"></div>
<div class="Two"></div>
就像您在上面的示例中看到的那样,也会出现白屏,所以如果您不希望出现这种情况,请不要使用 promise().done(..)
。
$(document).ready(function(){
$('div.one').click(function(){
$(this).fadeOut(1000);
$('div.Two').fadeIn(1000);
});
});
您可以这样编辑您的代码:
$(this.oldContainer).fadeOut(1000).promise().done(() => {
$('html, body').animate({
scrollTop: 300
},1000);
});
nc.css('visibility', 'visible');
nc.fadeIn(1000, function() {
_this.done();
});
我想出了这个版本的脚本:
$(function(){
var transEffect = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(val => this.fadeInNewcontent($(this.newContainer)));
},
fadeInNewcontent: function(nc) {
var _this = this;
nc.css('visibility', 'visible');
nc.show().promise().done(() => {
$(this.oldContainer).fadeOut(50);
if (!isMobile.any()) {
$('html, body').delay(100).animate({
scrollTop: 200
},700);
}
});
}
});
Barba.Pjax.getTransition = function() {
return transEffect;
}
Barba.Pjax.start();
});
更好了,但不够流畅。查看 real life project 上的效果。我该如何改进它?