модальное отбрасывание кадров vue при использовании переходов

#html #css #vue.js #vuejs3

Вопрос:

Я написал пользовательский модальный режим vue, и он отлично работает на моем компьютере, но на некоторых мобильных устройствах он продолжает сбрасывать кадры. Похоже, это связано с переходами — без этого все работает так, как ожидалось (но выглядит и чувствует себя плохо).

Даже переход с непрозрачностью 1 на непрозрачность 0 в этом случае вызывает задержку. (Любая анимация, вызывающая задержку)

Это действительно простой код, поэтому он должен работать на каждом устройстве — даже устройства среднего класса, такие как Samsung M31, не могут отображать анимацию без задержек. (Даже если переход-это только непрозрачность или масштаб)

Меню.vue

     <Modal :is-open="testModalIsOpen" >
      test1
      test2
      test3
      test4
      test5
    <template #footer>
      <button @click="testModalIsOpen=false">BACK</button>
    </template>
  </Modal>
 

Модальный.vue

 <template>
  <transition name="rpg-modal__transition">
    <div class="rpg-modal" v-if="isOpen" :class="classes">
      <div class="rpg-modal__backdrop"></div>
      <div class="mx-auto rpg-modal__content-wrapper">
        <div class="rpg-modal__box" style="background-color: #0b1b3d">
            <div>
              <div class="rpg-modal__body">
                <slot/>
              </div>
              <div class="rpg-modal__footer d-flex justify-content-end">
                <slot name="footer"/>
              </div>
            </div>
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
import {computed} from "@vue/reactivity";

export default {
  name: "Modal",
  props: {
    isOpen: {
      type: Boolean,
      default: false
    },
    autoPadding: {
      type: Boolean,
      default: true
    }
  },
  setup(props) {
    const classes = computed(() => ({
      'rpg-modal--auto-padding': props.autoPadding
    }));

    return {
      classes,
    };
  }
}
</script>

<style lang="scss">
.rpg-modal {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1000;
  $transition-duration: 0.3s;

  amp;__transition {
    amp;-enter-active, amp;-leave-active {
      transition: all $transition-duration;
    }

    amp;-enter-from, amp;-leave-to {
      opacity: 0;
      filter: blur(5px);
      transform: scale(1.3);
    }
  }

  amp;__backdrop {
    position: absolute;
    height: 100%;
    width: 100%;
    background-color: rgba(0, 0, 0, 0.5);
  }

  amp;__content-wrapper {
    max-width: 64vh;
    margin: auto;
  }

  amp;__box {
    $boxMargin: 13px;
    position: relative;
    margin: $boxMargin;

    max-height: calc(100vh - #{$boxMargin * 2});
    border-radius: 15px;

    background-repeat: no-repeat;
    background-size: 100% 100%;

    box-shadow: #00000073 0 0 10px;
  }

  amp;--auto-padding amp;__body {
    padding: 12px;
  }

  amp;__footer {
    border-top: 1px solid #000000;
    padding: 9px;

    > * {
      margin: .25rem;
    }
  }

  amp;__close {
    font-size: 1.5rem;
    line-height: 1;
    text-shadow: 0 1px 0 #fff;

    position: absolute;
    z-index: 20;
    background-color: rgb(62 62 62);
    box-shadow: #00000052 2px 2px 5px;
    color: white;
    height: 30px;
    width: 30px;
    padding: 0 0 4px;
    border-radius: 50px;
    border: none;
    right: 17px;
    top: 17px;
    transition: background-color 200ms;

    amp;:hover {
      background-color: #9f3e3e;
    }
  }
}
</style>
 

введите описание изображения здесь

Надеюсь, кто-нибудь сможет помочь и спасибо за любые ответы!

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

1. Я не эксперт по производительности мобильных кадров, но, может быть, я бы проверил тестирование с помощью разных анимаций? Если нет, возможно, протестируйте тот же компонент с помощью другой платформы, чтобы посмотреть, как он работает.

2. Я пробовал разные анимации. Даже простые, такие как непрозрачность от 1 до непрозрачности 0, вызывают задержку. Но только в этом модальном компоненте, и я не могу понять, почему.

3. Если бы это было только в этом модальном компоненте, я бы проверил, что вызывает задержку в этом компоненте. Или напишите анимацию тестирования нового компонента, возможно, в вашем коде есть стадия, на которой он замедляется. На самом деле я вижу длительность перехода, проверьте, правильно ли вы их используете, задержка может быть длительностью перехода, которую вы добавили.

4. фильтр размытия стоит дорого

5. Я попробовал модальный без фильтра размытия. Никакой разницы. Это работает идеально, когда я не использую никаких переходов. Он просто появляется и исчезает без задержки. Если я использую какой-либо переход (непрозрачность, преобразование или размытие…), задержка возвращается

Ответ №1:

Вы пробовали свойство изменения воли?

Свойство will-change в CSS оптимизирует анимацию, позволяя браузеру знать, какими свойствами и элементами только предстоит управлять, что потенциально повышает производительность этой конкретной операции.
отсюда

Итак, попробуйте это:

 .rpg-modal{
  will-change: transform, opacity, filter;
}
 

Кроме того, установите начальное значение модала, непрозрачность:0 и другие…