当前位置:首页 > 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 实现多级表头的方法 使用 el-table 组件 Element UI 的 el-table 组件支持多级表头的实现,通过嵌套 el-table-column 即可完成。 <el-t…

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="mod…

vue的艾特功能实现

vue的艾特功能实现

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

vue实现iframe

vue实现iframe

Vue 中实现 iframe 的方法 在 Vue 项目中,可以通过多种方式实现 iframe 的嵌入。以下是几种常见的方法: 使用原生 HTML iframe 标签 直接在 Vue 组件的模板中使…

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app…

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…