vue实现抽屉效果
使用 Vue 实现抽屉效果
基础实现(基于 Vue 原生功能)
模板部分
通过 v-if 或 v-show 控制抽屉的显示与隐藏,结合 CSS 过渡动画实现平滑效果。
<template>
<div>
<button @click="isOpen = !isOpen">切换抽屉</button>
<transition name="slide">
<div class="drawer" v-if="isOpen">
<div class="drawer-content">抽屉内容</div>
</div>
</transition>
</div>
</template>
脚本部分
使用 data 管理抽屉状态。
<script>
export default {
data() {
return {
isOpen: false
}
}
}
</script>
样式部分
定义抽屉的定位和过渡动画。
<style>
.drawer {
position: fixed;
top: 0;
right: 0;
width: 300px;
height: 100%;
background: white;
box-shadow: -2px 0 5px rgba(0, 0, 0, 0.1);
}
.slide-enter-active, .slide-leave-active {
transition: transform 0.3s ease;
}
.slide-enter-from, .slide-leave-to {
transform: translateX(100%);
}
</style>
使用第三方库(如 Element UI)
安装 Element UI
通过 npm 或 yarn 安装依赖。
npm install element-ui
代码示例
直接使用 el-drawer 组件。
<template>
<div>
<button @click="drawer = true">打开抽屉</button>
<el-drawer
title="标题"
:visible.sync="drawer"
direction="rtl"
size="50%">
<span>抽屉内容</span>
</el-drawer>
</div>
</template>
<script>
export default {
data() {
return {
drawer: false
}
}
}
</script>
自定义可复用的抽屉组件
创建组件文件
封装抽屉逻辑,支持动态插槽内容。
<!-- Drawer.vue -->
<template>
<transition name="fade">
<div class="overlay" v-if="isOpen" @click="close">
<div class="drawer" @click.stop>
<slot></slot>
</div>
</div>
</transition>
</template>
<script>
export default {
props: {
isOpen: {
type: Boolean,
required: true
}
},
methods: {
close() {
this.$emit('close')
}
}
}
</script>
<style scoped>
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
}
.drawer {
position: absolute;
right: 0;
width: 300px;
height: 100%;
background: white;
}
.fade-enter-active, .fade-leave-active {
transition: opacity 0.3s;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
</style>
父组件调用
通过 props 控制显示状态。

<template>
<button @click="showDrawer = true">打开抽屉</button>
<Drawer :isOpen="showDrawer" @close="showDrawer = false">
<h2>自定义内容</h2>
</Drawer>
</template>
<script>
import Drawer from './Drawer.vue'
export default {
components: { Drawer },
data() {
return {
showDrawer: false
}
}
}
</script>
关键注意事项
- 定位方式:抽屉通常使用
fixed或absolute定位,确保脱离文档流。 - 动画性能:优先使用 CSS 的
transform和opacity属性实现动画,避免重排。 - 无障碍访问:为抽屉添加
aria-modal和role="dialog"属性,并管理焦点。 - 移动端适配:增加触摸手势支持(如右滑关闭)。






