当前位置:首页 > 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 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model 指…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdown…

tabbar 实现 vue

tabbar 实现 vue

在 Vue 中实现 TabBar 功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue Router 结合自定义组件 创建一个自定义的 TabBar 组件,结合 Vue Router 实现…

vue 实现modal

vue 实现modal

Vue 实现 Modal 的方法 使用 Vue 原生组件 通过 Vue 的组件系统可以轻松实现 Modal。创建一个可复用的 Modal 组件,通过 props 控制显示与隐藏。 <templ…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…