Vue.js 路由器过渡渐变间隙

Vue.js router transition fade gap

我在 vue.js

中使用惊人的过渡来滑动路由器页面
<template>
  <div>
    <header-comp></header-comp>
    <transition
            name="custom-classes-transition"
            mode="out-in"
            enter-active-class="animated slideInLeft"
            leave-active-class="animated slideOutRight"
    >
        <router-view></router-view>
    </transition>
    <footer-comp></footer-comp>
  </div>
</template>

<style>
    @import 'https://cdn.jsdelivr.net/npm/animate.css@3.5.1';
</style>

它运行得非常好和流畅,但是...当第一个页面完全消失时,新的页面进入。这在过渡之间造成了差距。

在 Vue 手册中:Transition-Modes 有几个示例。我需要复制第三个按钮示例,但我缺少必须使用的模式。

有什么建议吗?

实际上,因为您不需要任何特殊行为并且实际上希望两个转换同时发生,所以您根本不应该使用 mode。只需删除它,它就会像您描述的那样工作。来自您粘贴的文档 link:

Simultaneous entering and leaving transitions aren’t always desirable though, so Vue offers some alternative transition modes

  • in-out: New element transitions in first, then when complete, the current element transitions out.

  • out-in: Current element transitions out first, then when complete, the new element transitions in.

mode="in-out": 新元素先转入,完成后,当前元素转出。

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!',
    showOn: true
  },
  methods: {
    handleClick() {
      console.log(this.message);
    }
  }
})
.slide-fade-enter-active {
  transition: all .3s ease;
  position: absolute;
  left: 0;
  top: 0;
}
.slide-fade-leave-active {
  position: absolute;
  left: 0;
  top: 0;
}
.slide-fade-enter, .slide-fade-leave-to {
  transform: translateX(10px);
  opacity: 0;
}

#app {
  position: relative;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<body>
  <div id="app">
    <transition  name="slide-fade" mode="in-out">
      <button v-if="showOn"
        key="on"
      type="button"
      @click="showOn=false">On</button>
      <button v-else type="button"
      key="off"
      @click="showOn=true">Off</button>
    </transition>
  </div>
</body>

过渡元素的主要问题是您希望它们同时在 DOM 中占据相同的 space(即使在视觉上,一进一出 - 这只是通过 transforms 完成,但两个元素需要在 DOM).

中占用相同的 space

因此您需要提供其中之一 position:absolute 并使用 CSS 正确调整大小和位置,以匹配没有 position:absolute 时的确切位置和大小(这是它在不进行过渡时的内容)。

这是一个 working example。请注意,您可能需要将不同的样式应用于不同的元素。
由于您没有提供带有您自己的标记的最小的、可重现的示例,因此无法知道。

在上面的例子中,我给出了后续的<div>(进入的)

position: absolute;
width: 100%;
top: 60px;
left: 0;

如果您选择将所有 <router-view> 包装到带有 position:relative 的通用包装器元素中,top 需要是 0(在示例中 60px占了<nav>的身高)。

注意: ,正如其他人已经指出的,你不需要mode="in-out" .但这仍然会给您留下定位问题。


编辑:我又玩了两个例子。

  • height:100vh 中的一个 using a flexbox container,其中顶部和底部元素不会增长,而中间元素会增长。当中间元素太大时,它会变成可滚动的。
  • another one 我玩转场效果和 Bootstrap Vue.