当前位置:首页 > VUE

vue实现侧边抽屉

2026-01-14 05:54:50VUE

使用Vue实现侧边抽屉

Vue可以通过多种方式实现侧边抽屉效果,以下是几种常见方法:

基于Vue原生实现

<template>
  <div>
    <button @click="drawerOpen = !drawerOpen">切换抽屉</button>
    <div class="drawer" :class="{ 'drawer-open': drawerOpen }">
      <div class="drawer-content">
        <!-- 抽屉内容 -->
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      drawerOpen: false
    }
  }
}
</script>

<style>
.drawer {
  position: fixed;
  top: 0;
  left: -300px;
  width: 300px;
  height: 100%;
  background: #fff;
  transition: left 0.3s ease;
  z-index: 1000;
}

.drawer-open {
  left: 0;
}
</style>

使用Vuetify组件库

Vuetify提供了现成的v-navigation-drawer组件:

<template>
  <v-app>
    <v-navigation-drawer v-model="drawer" temporary>
      <!-- 抽屉内容 -->
    </v-navigation-drawer>
    <v-app-bar>
      <v-app-bar-nav-icon @click="drawer = !drawer"></v-app-bar-nav-icon>
    </v-app-bar>
  </v-app>
</template>

<script>
export default {
  data() {
    return {
      drawer: false
    }
  }
}
</script>

使用Element UI组件库

Element UI提供了el-drawer组件:

<template>
  <div>
    <el-button @click="drawer = true" type="primary">
      打开抽屉
    </el-button>
    <el-drawer
      title="标题"
      :visible.sync="drawer"
      direction="ltr"
      :before-close="handleClose">
      <span>抽屉内容</span>
    </el-drawer>
  </div>
</template>

<script>
export default {
  data() {
    return {
      drawer: false
    }
  },
  methods: {
    handleClose(done) {
      done()
    }
  }
}
</script>

使用第三方插件vue-drawer

安装vue-drawer插件:

npm install vue-drawer --save

使用示例:

<template>
  <div>
    <button @click="toggleDrawer">Toggle Drawer</button>
    <vue-drawer
      :show.sync="showDrawer"
      :width="300"
      @close="showDrawer = false">
      <div slot="drawer">抽屉内容</div>
    </vue-drawer>
  </div>
</template>

<script>
import VueDrawer from 'vue-drawer'

export default {
  components: {
    VueDrawer
  },
  data() {
    return {
      showDrawer: false
    }
  },
  methods: {
    toggleDrawer() {
      this.showDrawer = !this.showDrawer
    }
  }
}
</script>

响应式抽屉实现

可以根据屏幕宽度自动调整抽屉行为:

vue实现侧边抽屉

<template>
  <div>
    <button @click="toggleDrawer">菜单</button>
    <div class="drawer" :class="{ 'drawer-open': isOpen, 'drawer-mobile': isMobile }">
      <!-- 抽屉内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false,
      isMobile: false
    }
  },
  mounted() {
    this.checkMobile()
    window.addEventListener('resize', this.checkMobile)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.checkMobile)
  },
  methods: {
    toggleDrawer() {
      this.isOpen = !this.isOpen
    },
    checkMobile() {
      this.isMobile = window.innerWidth < 768
      if (!this.isMobile) {
        this.isOpen = true
      }
    }
  }
}
</script>

<style>
.drawer {
  width: 250px;
  transition: transform 0.3s ease;
}

.drawer-mobile {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  transform: translateX(-100%);
  z-index: 1000;
}

.drawer-open.drawer-mobile {
  transform: translateX(0);
}
</style>

带遮罩的抽屉实现

<template>
  <div>
    <button @click="openDrawer">打开抽屉</button>
    <div class="drawer-mask" v-if="isOpen" @click="closeDrawer"></div>
    <div class="drawer" :class="{ 'drawer-open': isOpen }">
      <button class="drawer-close" @click="closeDrawer">×</button>
      <!-- 抽屉内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    }
  },
  methods: {
    openDrawer() {
      this.isOpen = true
      document.body.style.overflow = 'hidden'
    },
    closeDrawer() {
      this.isOpen = false
      document.body.style.overflow = ''
    }
  }
}
</script>

<style>
.drawer-mask {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.5);
  z-index: 999;
}

.drawer {
  position: fixed;
  top: 0;
  left: -300px;
  width: 300px;
  height: 100%;
  background: #fff;
  transition: left 0.3s ease;
  z-index: 1000;
}

.drawer-open {
  left: 0;
}

.drawer-close {
  position: absolute;
  right: 10px;
  top: 10px;
  background: none;
  border: none;
  font-size: 20px;
  cursor: pointer;
}
</style>

以上方法可以根据项目需求选择适合的实现方式,组件库提供的方法通常更简单快捷,而原生实现则更灵活可控。

标签: 侧边抽屉
分享给朋友:

相关文章

vue实现弹出侧边弹窗

vue实现弹出侧边弹窗

使用 Vue 实现侧边弹窗 基础组件结构 创建一个名为 SideDrawer.vue 的组件,包含模板、样式和逻辑部分。弹窗通过 v-model 控制显隐,支持动画过渡。 <template&…

vue实现侧边导航

vue实现侧边导航

Vue 侧边导航实现方法 使用 Vue 实现侧边导航可以通过多种方式完成,以下提供几种常见方案: 基于 Element UI 的侧边导航 Element UI 提供了现成的导航组件,适合快速开发:…

vue实现抽屉效果

vue实现抽屉效果

使用 Vue 实现抽屉效果 基础实现(基于 Vue 原生功能) 通过 v-show 或 v-if 控制抽屉的显示与隐藏,结合 CSS 过渡动画实现平滑效果。 <template> &…

vue实现抽屉菜单

vue实现抽屉菜单

Vue 实现抽屉菜单的方法 使用 Vue 原生实现 通过 Vue 的 v-if 或 v-show 控制抽屉的显示与隐藏,结合 CSS 过渡动画实现平滑效果。 <template> &…

vue实现侧边栏切换

vue实现侧边栏切换

Vue 实现侧边栏切换 使用 v-show 或 v-if 控制显示 在 Vue 中可以通过 v-show 或 v-if 指令动态控制侧边栏的显示与隐藏。v-show 通过 CSS 的 display…

vue实现侧边栏拖动

vue实现侧边栏拖动

实现侧边栏拖动的核心思路 通过监听鼠标事件(mousedown、mousemove、mouseup)计算拖动距离,动态调整侧边栏宽度。需结合 Vue 的响应式数据管理和样式绑定。 基础代码结构 &l…