3

我刚刚发现了Barba.js,发现它非常有用。它提供了同一网站的 URL 之间的平滑转换。

在 jQuery和方法的帮助下,我整理了一个由两个页面(index.html 和 about.html)组成的Plunker ,它们可以顺利加载。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();
});

这个动画的问题是它们之间有一个白屏间隔

我怎样才能消除这个间隔,使过渡更平滑?我所说的“更流畅”是指类似于这个(点击“查看案例”)

4

3 回答 3

1

白色屏幕是主体颜色,因为您使用的是在完成后promise().done(..) jquery应用,因此主体颜色会出现。因此,这是一个类似于您所拥有的示例:fadeInfadeOut

<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();
});
于 2018-07-25T14:08:25.600 回答
0

我提出了这个版本的脚本:

$(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();
});

它更好,但不够平滑。看看对现实生活项目的影响。我该如何改进它?

于 2018-07-27T19:00:51.140 回答
0

如何使用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 很有帮助,但很难看到动画的实际效果。

更新

我认为你需要类似上面的东西,但是如果你想淡入/淡出黑色,那么你还需要做一些事情,比如在你体内的所有内容周围创建一个 div 包装器,然后给那个 div您的应用程序的背景颜色#eff3f6,然后将实际的主体背景设置为黑色。您需要做一些工作才能获得您想要的确切效果,但是类似的内容或下面评论中的 SO 链接应该会有所帮助。

于 2018-07-19T00:41:54.220 回答