Вам нужно два разных CSS ввода состояний для перехода, потому что вы хотите скользить в обоих направлениях. Используя привязку для enter-class
(не то же самое, что enter-active-class
), вы можете изолировать расположение слайдов в 2 отдельных CSS ввода классов и поменять их местами на основе изменения в step
. Например, вот новая привязка:
:enter-class="enterClass"
enterClass
- это свойство данных, для которого задана строка имени увеличивающегося или уменьшающегося имени класса с использованием watch
в 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
таким же образом, если хотите сделать его более интересным