当前位置:首页 > 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 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncComp…

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <templ…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

vue实现div

vue实现div

Vue 实现 DIV 元素的方法 在 Vue 中实现 DIV 元素可以通过多种方式,以下是几种常见的实现方法: 使用模板语法 在 Vue 的模板中直接使用 HTML 的 <div> 标签…

vue实现选区

vue实现选区

Vue 实现选区的基本方法 在Vue中实现选区功能通常涉及DOM操作和事件处理。以下是几种常见的方法: 使用原生JavaScript的Selection API 通过window.getSelec…

vue 实现href

vue 实现href

Vue 实现 href 的方法 在 Vue 中实现 href 功能可以通过多种方式,具体取决于需求场景。以下是几种常见的方法: 使用 <a> 标签 直接使用 HTML 的 <a&g…