当前位置:首页 > VUE

vue实现侧滑菜单

2026-01-21 18:42:39VUE

Vue 实现侧滑菜单的方法

使用 CSS 过渡和 Vue 指令

通过 Vue 的 v-showv-if 控制菜单显示,结合 CSS 过渡实现平滑动画效果。定义一个 isMenuOpen 数据属性,通过按钮点击切换状态。

vue实现侧滑菜单

<template>
  <div>
    <button @click="toggleMenu">Toggle Menu</button>
    <div class="menu" :class="{ 'open': isMenuOpen }">
      <!-- 菜单内容 -->
    </div>
    <div class="overlay" v-show="isMenuOpen" @click="toggleMenu"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isMenuOpen: false
    };
  },
  methods: {
    toggleMenu() {
      this.isMenuOpen = !this.isMenuOpen;
    }
  }
};
</script>

<style>
.menu {
  position: fixed;
  top: 0;
  left: -250px;
  width: 250px;
  height: 100%;
  background: #333;
  transition: transform 0.3s ease;
}
.menu.open {
  transform: translateX(250px);
}
.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  z-index: -1;
}
</style>

使用第三方库(如 vue-simple-sidenav)

对于更复杂的交互,可以使用现成的 Vue 组件库。安装 vue-simple-sidenav 后直接引入使用。

vue实现侧滑菜单

npm install vue-simple-sidenav
<template>
  <div>
    <button @click="toggleNav">Toggle Menu</button>
    <sidenav :show="showNav" @close="showNav = false">
      <!-- 菜单内容 -->
    </sidenav>
  </div>
</template>

<script>
import Sidenav from 'vue-simple-sidenav';

export default {
  components: { Sidenav },
  data() {
    return {
      showNav: false
    };
  },
  methods: {
    toggleNav() {
      this.showNav = !this.showNav;
    }
  }
};
</script>

手势支持(滑动触发)

结合 hammer.js@vueuse/gesture 实现触摸滑动操作。监听滑动手势,动态计算菜单位移。

<template>
  <div ref="menu" class="menu" :style="{ transform: `translateX(${offsetX}px)` }">
    <!-- 菜单内容 -->
  </div>
</template>

<script>
import { useSwipe } from '@vueuse/gesture';

export default {
  setup() {
    const menu = ref(null);
    const offsetX = ref(-250);

    useSwipe(menu, {
      onSwipe(e) {
        offsetX.value = Math.min(e.delta[0], 0);
      },
      onSwipeEnd(e) {
        if (e.delta[0] > 100) offsetX.value = 0;
        else offsetX.value = -250;
      }
    });

    return { offsetX, menu };
  }
};
</script>

状态管理(Vuex/Pinia)

当侧滑菜单需要跨组件控制时,通过状态管理集中管理状态。

// store.js (Pinia 示例)
import { defineStore } from 'pinia';

export const useMenuStore = defineStore('menu', {
  state: () => ({
    isOpen: false
  }),
  actions: {
    toggle() {
      this.isOpen = !this.isOpen;
    }
  }
});
<!-- 组件中使用 -->
<script setup>
import { useMenuStore } from './store';
const menu = useMenuStore();
</script>

<template>
  <button @click="menu.toggle()">Toggle</button>
  <div class="menu" :class="{ open: menu.isOpen }"></div>
</template>

注意事项

  • 移动端需添加 touch-action: none 防止浏览器默认手势干扰
  • 考虑添加 ESC 键关闭菜单的键盘事件
  • 使用 position: fixed 时注意层级(z-index)管理
  • 动画性能优化:优先使用 transformopacity 属性

标签: 菜单vue
分享给朋友:

相关文章

vue实现多选题

vue实现多选题

Vue实现多选题的方法 使用Vue实现多选题功能,可以通过v-model绑定数组、动态渲染选项、以及处理选中状态来实现。以下是一个完整的实现示例: 基础实现代码 <template>…

vue的艾特功能实现

vue的艾特功能实现

Vue 的 @ 功能实现 在 Vue 中实现类似社交平台的 @ 功能,通常涉及输入框的监听、用户匹配和选择插入。以下是具体实现方法: 监听输入框内容 使用 v-model 绑定输入框内容,并通过…

vue懒加载实现难吗

vue懒加载实现难吗

vue懒加载的实现难度 Vue懒加载的实现并不复杂,核心逻辑是通过动态导入(Dynamic Imports)和路由配置或组件异步加载完成。以下是具体实现方法: 路由懒加载实现 在Vue Router…

vue 方法实现

vue 方法实现

在 Vue 中,方法的实现通常通过 methods 选项完成。以下是 Vue 方法实现的核心要点和示例: 基本方法定义 在 Vue 组件中定义方法时,需将函数声明放在 methods 对象内。这些方…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

vue实现流程

vue实现流程

Vue 实现流程的基本步骤 安装 Vue.js 可以通过 CDN 引入或使用 npm/yarn 安装。 CDN 方式: <script src="https://cdn.jsdelivr…