@hckn

Как при рестарте анимации сохранять текущее значение, а не обнулять?

Набросал аккордеон. https://codesandbox.io/s/ko3r37oz5v

Проблема: если нажать 3 раза на кнопку (т.е. стартануть анимацию, отменить ее, и стартануть заново), то анимация стартует с самого начала (аккордеон схлопывается мгновенно).

enter (el, done) {
      function animate () {
        if (TWEEN.update()) {
          requestAnimationFrame(animate)
        }
      }
      let value = { height: 0 }
      new TWEEN.Tween(value)
        .to({ height: el.offsetHeight }, 2000)
        // .easing(TWEEN.Easing.Cubic.In)
        .onUpdate(function(object) {
          el.style.setProperty('height', value.height + 'px')
        })
        .onComplete(() => {
          done()
          console.log('DONE')
        })
        .start()
      animate()
    }


Можно ли как-то закешировать значение let value = { height: 0 }, и если оно не равно 0, то начинать анимацию именно с этого места, а не с 0?
  • Вопрос задан
  • 113 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега Vue.js
Способ на мой взгляд довольно костыльный, но... массив, который вы обходите через v-for - добавить его элементам свойство height, и передавать сами элементы в Tween. Как-то так.
Ответ написан
profesor08
@profesor08
Перемудрил как-то с этим TWEEN. Попробуй gsap, получится гораздо проще.
import {TimelineMax} from "gsap";

export default {
  props: [],
  data () {
    return {
      blocks: [
        {title: 'one', content: 'lorem three...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...', show: false},
        {title: 'two', content: 'lorem three...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...', show: false},
        {title: 'three', content: 'lorem three...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...lorem two...', show: false}
      ]
    }
  },
  methods: {

    switchBlock (n) {
      if (this.blocks[n].show === true) {
        this.blocks[n].show = false;
      }
      else {
        this.blocks.forEach(function(block) {
          block.show = false;
        });

        this.blocks[n].show = true;
      }
    },

    enter (el, done) {

      new TimelineMax()
        .from(el, .5, {
          height: 0
        });
    },

    leave (el, done) {

      new TimelineMax()
        .to(el, .5, {
          height: 0
        });
    }
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы