返回

使用 Vue 3 动画过渡实现顺畅的菜单切换:打造引人注目的用户体验

vue.js

使用 Vue 3 动画过渡实现流畅菜单切换

问题概述

在 Vue 3 中创建菜单时,我们希望菜单在打开和关闭时具有流畅的动画效果。然而,如果仅为菜单的进入应用过渡,而离开时没有过渡,就会导致菜单只能滑入,而不能滑出。此外,遮罩层也应该具有动画效果,例如淡入和淡出。

解决方案

为了解决这个问题,我们需要同时为菜单进入和离开添加动画过渡,并为遮罩层添加额外的淡入淡出过渡。

步骤如下:

  1. 为菜单离开添加过渡 :使用<transition name="slide">将离开动画应用到菜单容器上。
  2. 为遮罩层添加淡入淡出过渡 :使用<transition name="fade">将淡入淡出动画应用到遮罩层上。

代码示例

<!-- 添加 "scoped" 属性以限制 CSS 仅适用于此组件 -->
<style scoped>
  span {
    cursor: pointer;
  }
</style>

<template>
  <div>
    <button @click="cartToggle">Toggle</button>
  </div>
  <div>
    <Child
      :visible="cartVisible"
      @update:visible="cartToggle"
      v-show="cartVisible"
    />
  </div>
</template>

<script setup>
import { ref } from "vue";
import Child from "./Child.vue";

const cartVisible = ref(false);
const cartToggle = () => {
  cartVisible.value = !cartVisible.value;
};
</script>
<script setup lang="ts">
import { toRefs, watchEffect, onBeforeUnmount } from "vue";

const props = defineProps({
  visible: {
    type: Boolean,
    required: true,
    default: false,
  },
});

const { visible } = toRefs(props);

const emit = defineEmits(["update:visible"]);

const hideCartBar = () => {
  emit("update:visible", false);
};

watchEffect(() => {
  document.body.style.overflow = visible.value ? "hidden" : "auto";
  document.body.style.paddingRight = visible.value ? "15px" : "0px";
});

onBeforeUnmount(() => {
  document.body.style.overflow = "auto";
  document.body.style.paddingRight = "0px";
});
</script>

<template>
  <div class="cartbar">
    <div class="cartbar-wrapper">
      <transition name="fade">
        <div
          v-show="props.visible"
          class="cartbar-overlay"
          @click="hideCartBar"
        ></div>
      </transition>
      <transition name="slide">
        <div v-show="props.visible" class="cartbar-container">
          <div class="cartbar__header">
            <h2>Menu</h2>
            <span @click="hideCartBar" class="cursor-pointer">Close</span>
          </div>
        </div>
      </transition>
      <transition name="slide">
        <div v-show="!props.visible" class="cartbar-container">
          <div class="cartbar__header">
            <h2>Menu</h2>
            <span @click="hideCartBar" class="cursor-pointer">Close</span>
          </div>
        </div>
      </transition>
    </div>
  </div>
</template>

<style scoped>
  /* transition */
  /* transition */
  .fade-enter-from,
  .fade-leave-to {
    opacity: 0;
  }

  .fade-enter-to,
  .fade-leave-from {
    opacity: 1;
  }

  .fade-enter-active,
  .fade-leave-active {
    transition: opacity 500ms;
  }

  .slide-enter-from,
  .slide-leave-to {
    transform: translateX(100%);
  }

  .slide-enter-to,
  .slide-leave-from {
    transform: translateX(0);
  }

  .slide-enter-active,
  .slide-leave-active {
    transition: transform 500ms;
  }

  /* cartbar */
  .cursor-pointer {
    cursor: pointer;
  }
  .cartbar-wrapper {
    transition: visibility 0s 0s;
    z-index: 1300;
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    display: flex;
    width: 100%;
    padding-left: calc(4px * 9);
  }

  .cartbar-overlay {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: rgba(0, 0, 0, 0.7);
    opacity: 1;
    cursor: pointer;
  }
  .cartbar-container {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    max-width: 460px;
    height: 100%;
    overflow: hidden;
    margin-left: auto;
    padding: calc(4px * 7);
    background-color: #f4f2f1;
    color: #706b5f;
  }
</style>

结论

通过在 Vue 3 中正确使用过渡组件,我们可以为菜单创建流畅的动画效果。这增强了用户体验,使菜单的打开和关闭更直观、更具吸引力。

常见问题解答

1. 为什么菜单离开时需要动画?

菜单离开时需要动画是为了提供关闭菜单时的视觉反馈。它使关闭动作更加明显,并有助于用户理解菜单已关闭。

2. 如何自定义过渡动画?

Vue 3 允许自定义过渡动画。你可以使用 enter-active-classleave-active-class 属性来指定进入和离开动画的 CSS 类。这使你能够创建独特而引人注目的动画。

3. 如何为菜单添加其他效果?

除了动画之外,你还可以为菜单添加其他效果,例如滚动效果、悬停效果或拖拽效果。这取决于你的具体需求和设计偏好。

4. 过渡动画如何影响性能?

过渡动画可能会对性能产生影响。复杂的动画或较大的元素可能会减慢页面加载速度。优化过渡动画对于确保应用程序的流畅响应至关重要。

5. Vue 3 中有哪些其他用于动画的组件?

Vue 3 提供了多种用于动画的组件,包括 TransitionGroupCSSTransitionAnimate。这些组件使你能够创建各种动画效果,例如列表过渡、复杂布局变化和关键帧动画。