1

我目前有以下过渡块组件:

<div
   v-if="!surveyResultIsReady"
   class="vh-md-40 position-relative"
   >
   <transition
      name="custom-classes-transition"
      enter-active-class="animated slideInRight"
      leave-active-class="animated slideOutLeft"
      >
      <div
         v-bind:key="step"
         class="w-100 position-absolute mx-auto"
         >
         <SurveyActiveQuestion
            v-if="!surveyResultIsReady"
            v-bind:question="activeQuestion()"
            v-bind:totalQuestions="totalQuestions"
            v-on:activeQuestionAnswered="activeQuestionAnswered()"
            />
      </div>
   </transition>
</div>

转换由this.step值 ( v-bind:key="step") 控制。

过渡看起来很棒this.step++,过渡向“正确”方向滑动:从左向右滑动。但是,this.step--过渡的时候是一样的。

我想知道,我将如何纠正此问题以从右向左滑动以获取this.step--方向?

4

2 回答 2

1

您需要两个不同的 CSS 进入状态来进行转换,因为您想从两个方向滑入。使用绑定 for enter-class(与 不同enter-active-class),您可以将幻灯片定位隔离为 2 个单独的 CSS 输入类,并根据step. 例如,这是新的绑定:

:enter-class="enterClass"

enterClasswatch是使用on设置为递增或递减类名称字符串的数据属性step

watch: {
  step(old, value) {
    this.enterClass = value > old ? 'slide-in-right' : 'slide-in-left'; 
  }
}

以下是课程:

.animated {
  transition: transform .5s;
}
.slide-in-left {
  transform: translate(-100%, 0);
}
.slide-in-right {
  transform: translate(100%, 0);
}

DEMO 综上所述,这是您的代码的简化版本:

new Vue({
  el: "#app",
  data() {
    return {
      step: 1,
      enterClass: ''
    }
  },
  watch: {
    step(value, old) {
      this.enterClass = value > old ? 'slide-in-left' : 'slide-in-right'; 
    }
  }
});
[v-cloak] {
  display:none;
}

#app {
  background: #fff;
  border-radius: 4px;
}

.slider {
  position: relative;
  overflow-x: hidden;
  border: 1px solid #cccccc;
  border-radius: 3px;
  height: 40px;
  margin-bottom: 4px;
}

.slider > div {
  position: absolute;
  width: 100%;
  text-align: center;
}

.animated {
  transition: transform .5s;
}
.slide-in-left {
  transform: translate(-100%, 0);
}
.slide-in-right {
  transform: translate(100%, 0);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app" v-cloak>
  <div class="slider">
    <transition name="slide"
      enter-active-class="animated"
      :enter-class="enterClass"
    >
      <div :key="step">
        Content <br />
        {{ step }}
      </div>
    </transition>
  </div>
  <button @click="--step">-</button>
  <button @click="++step">+</button>
</div>

leave-class如果你想让它更漂亮,你可以用同样的方式添加

于 2020-01-06T18:51:48.180 回答
0

您可以使用 GSAP。我在视频中看到了它(带有时间的链接)https://youtu.be/14yOawLavB0?t=734 有代码示例(您可以通过您的步骤轻松使用它)和结果。

于 2020-01-07T01:45:38.323 回答