vue实现抽屉
Vue 实现抽屉效果
在 Vue 中实现抽屉效果可以通过多种方式完成,以下是几种常见的方法:
使用 Vue 过渡动画
通过 Vue 的 <transition> 组件结合 CSS 过渡动画实现抽屉效果。定义一个侧边栏组件,通过 v-if 或 v-show 控制其显示和隐藏。
<template>
<div>
<button @click="showDrawer = !showDrawer">切换抽屉</button>
<transition name="slide">
<div v-if="showDrawer" class="drawer">
<p>抽屉内容</p>
</div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
showDrawer: false
}
}
}
</script>
<style>
.drawer {
position: fixed;
top: 0;
right: 0;
width: 300px;
height: 100%;
background: #fff;
box-shadow: -2px 0 5px rgba(0, 0, 0, 0.1);
}
.slide-enter-active, .slide-leave-active {
transition: transform 0.3s ease;
}
.slide-enter, .slide-leave-to {
transform: translateX(100%);
}
</style>
使用第三方 UI 库
许多流行的 Vue UI 库提供了现成的抽屉组件,例如 Element UI、Ant Design Vue 等。
以 Element UI 为例:
<template>
<el-button @click="drawer = true">打开抽屉</el-button>
<el-drawer
title="标题"
:visible.sync="drawer"
direction="rtl"
size="50%">
<span>抽屉内容</span>
</el-drawer>
</template>
<script>
export default {
data() {
return {
drawer: false
}
}
}
</script>
自定义抽屉组件
可以创建一个可复用的抽屉组件,通过 props 控制其位置、大小和行为。
<!-- Drawer.vue -->
<template>
<transition name="fade">
<div v-if="visible" class="drawer-mask" @click="closeOnMask && close()">
<div class="drawer" :class="position" @click.stop>
<slot></slot>
</div>
</div>
</transition>
</template>
<script>
export default {
props: {
visible: Boolean,
position: {
type: String,
default: 'right'
},
closeOnMask: {
type: Boolean,
default: true
}
},
methods: {
close() {
this.$emit('update:visible', false)
}
}
}
</script>
<style>
.drawer-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
}
.drawer {
position: absolute;
background: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
.drawer.right {
top: 0;
right: 0;
height: 100%;
width: 300px;
}
.drawer.left {
top: 0;
left: 0;
height: 100%;
width: 300px;
}
.drawer.top {
top: 0;
left: 0;
right: 0;
height: 200px;
}
.drawer.bottom {
bottom: 0;
left: 0;
right: 0;
height: 200px;
}
.fade-enter-active, .fade-leave-active {
transition: opacity 0.3s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
</style>
使用 Vue Teleport
Vue 3 的 Teleport 功能可以更好地处理抽屉的 DOM 结构,避免样式冲突。

<template>
<button @click="showDrawer = true">打开抽屉</button>
<Teleport to="body">
<div v-if="showDrawer" class="drawer-mask" @click="showDrawer = false">
<div class="drawer" @click.stop>
<p>抽屉内容</p>
<button @click="showDrawer = false">关闭</button>
</div>
</div>
</Teleport>
</template>
<script setup>
import { ref } from 'vue'
const showDrawer = ref(false)
</script>
以上方法可以根据项目需求选择合适的方式实现抽屉效果。自定义组件方式灵活性最高,而使用 UI 库则更加便捷。






