Как анимировать форму типа мастера с помощью Vue JS

#javascript #css #vue.js #vue-component

#javascript #css #vue.js #vue-компонент

Вопрос:

Я пытаюсь реализовать простую анимацию с помощью Vue, но пока безуспешно. У меня есть два divs, которые отображаются в зависимости от значения данного свойства данных

 <!--Step 1-->
<div v-if="step == 1" :transition="'slide'">
  <select class="form-control"  v-model="id.category">
    <option value="null">Please Select</option>
    <option v-for="cat in cats" :value="cat.id">@{{cat.name}}</option>
  </select>
</div>

<!--Step 2-->
<div v-if="step==2" :transition="'slide'"  style="background: red">
  <select @change="fixImage(id.subcategory)" class="form-control quoteForm" v-model="id.subcategory">
    <option value="null">Please Select</option>
    <option v-for="subcat in filtered_subcat" :value="subcat.id">@{{subcat.name}}</option>
  </select>
</div>
 

У меня фактически есть «следующая кнопка», которая увеличивает значение step , а затем отображает соответствующий div. Я хотел бы создать эффект типа слайда, при котором, когда пользователь нажимает «Далее», шаг 1 сдвигается влево, а шаг 2 скользит. Моя анимация css выглядит следующим образом:

 .slide-fade-enter-active {
  transition: all .3s ease;
}
.slide-fade-leave-active {
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
/* .slide-fade-leave-active below version 2.1.8 */ {
  transform: translateX(10px);
  opacity: 0;
}
 

Кто-нибудь может указать правильное направление?

Ответ №1:

Оберните изменяющееся содержимое в <transition> компонент:

 <transition name="slide-fade">
 <div v-if="step == 1">
     STEP 1 CONTENT
 </div>
</transition>

<transition name="slide-fade">
 <div v-if="step == 2">
     STEP 2 CONTENT
 </div>
</transition>
 

Имя перехода, slide-fade , соответствует указанному вами CSS. Поскольку вы, вероятно, хотите, чтобы скользящее содержимое перекрывалось, оно должно быть position: absolute . Например, содержимое выскальзывает:

 .slide-fade-leave-active {
  position: absolute;
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
 

Вот демонстрация:

 new Vue({
  el: "#app",
  data() {
    return {
        step: 1
    }
  }
}); 
 .slide-fade-enter-active {
  transition: all .3s ease;
}
.slide-fade-leave-active {
  position: absolute;
  transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-to
/* .slide-fade-leave-active below version 2.1.8 */ {
  transform: translateX(10px);
  opacity: 0;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <!--Step 1-->

  <transition name="slide-fade">
    <div v-if="step == 1">
      STEP 1 CONTENT
    </div>
  </transition>

  <!--Step 2-->
  <transition name="slide-fade">
    <div  v-if="step == 2">
      STEP 2 CONTENT
    </div>
  </transition>

  <button @click="step  ">
    Next >
  </button>
</div> 

Комментарии:

1. Если я прав, вы даже можете поместить оба div в один и тот же transition элемент.