当前位置:首页 > VUE

vue实现弹出侧边弹窗

2026-01-20 04:25:37VUE

使用 Vue 实现侧边弹窗

基础组件结构

创建一个名为 SideDrawer.vue 的组件,包含模板、样式和逻辑部分。弹窗通过 v-model 控制显隐,支持动画过渡。

<template>
  <transition name="slide">
    <div v-if="modelValue" class="side-drawer">
      <slot></slot>
      <button @click="$emit('update:modelValue', false)">关闭</button>
    </div>
  </transition>
</template>

<script>
export default {
  props: {
    modelValue: {
      type: Boolean,
      default: false
    }
  }
}
</script>

<style scoped>
.side-drawer {
  position: fixed;
  top: 0;
  right: 0;
  width: 300px;
  height: 100%;
  background: white;
  box-shadow: -2px 0 5px rgba(0,0,0,0.1);
  z-index: 1000;
}

.slide-enter-active,
.slide-leave-active {
  transition: transform 0.3s ease;
}

.slide-enter-from,
.slide-leave-to {
  transform: translateX(100%);
}
</style>

在父组件中使用

通过 v-model 绑定状态控制弹窗显示,可自定义内容插槽。

vue实现弹出侧边弹窗

<template>
  <button @click="showDrawer = true">打开侧边弹窗</button>
  <SideDrawer v-model="showDrawer">
    <h2>自定义内容</h2>
    <p>这里可以放置表单、列表或其他内容</p>
  </SideDrawer>
</template>

<script>
import SideDrawer from './SideDrawer.vue'

export default {
  components: { SideDrawer },
  data() {
    return {
      showDrawer: false
    }
  }
}
</script>

进阶功能扩展

  1. 动态位置控制
    添加 position prop 支持左右侧显示:

    vue实现弹出侧边弹窗

    <script>
    export default {
      props: {
        position: {
          type: String,
          default: 'right',
          validator: val => ['left', 'right'].includes(val)
        }
      },
      computed: {
        drawerStyle() {
          return {
            transform: this.position === 'right' 
              ? 'translateX(100%)' 
              : 'translateX(-100%)'
          }
        }
      }
    }
    </script>
  2. 点击外部关闭
    添加指令检测点击外部区域:

    directives: {
      clickOutside: {
        mounted(el, { value }) {
          el.clickOutsideEvent = event => {
            if (!(el === event.target || el.contains(event.target))) {
              value()
            }
          }
          document.addEventListener('click', el.clickOutsideEvent)
        },
        unmounted(el) {
          document.removeEventListener('click', el.clickOutsideEvent)
        }
      }
    }
  3. 无障碍支持
    添加 ARIA 属性和焦点管理:

    <div 
      v-if="modelValue"
      class="side-drawer"
      role="dialog"
      aria-modal="true"
      :aria-label="ariaLabel"
      tabindex="-1"
      ref="drawer"
      @keydown.esc="$emit('update:modelValue', false)"
    >

注意事项

  • 动画性能优化:使用 will-change: transform 提升 GPU 加速
  • 层级管理:通过 z-index 确保弹窗位于其他内容之上
  • 移动端适配:添加 @media 查询调整宽度为视口百分比
  • 内存泄漏:组件销毁时移除事件监听器

标签: 侧边弹出
分享给朋友:

相关文章

vue实现弹出卡片

vue实现弹出卡片

Vue 实现弹出卡片的方法 使用 v-if 或 v-show 控制显示 通过 Vue 的指令 v-if 或 v-show 可以控制弹出卡片的显示和隐藏。v-if 会动态添加或移除 DOM 元素,而 v…

uniapp弹出选择

uniapp弹出选择

实现方式一:使用uni.showActionSheet 在UniApp中,可以通过uni.showActionSheet实现底部弹出的选择菜单。该方法支持自定义选项列表和回调处理。 代码示例:…

vue实现弹出页

vue实现弹出页

Vue 实现弹出页的方法 在Vue中实现弹出页(弹窗/模态框)可以通过多种方式完成,以下是常见的几种方法: 使用组件化方式 创建一个独立的弹窗组件(如Modal.vue),通过v-if或v-sho…

vue实现弹出表单

vue实现弹出表单

使用 Vue 实现弹出表单 基础实现(基于 v-if 和 v-show) 通过 v-if 或 v-show 控制表单的显示与隐藏,适合简单场景。 <template> <div…

jquery 弹出框

jquery 弹出框

jQuery 弹出框实现方法 jQuery 弹出框可以通过插件或自定义代码实现,以下是几种常见方法: 使用 jQuery UI Dialog jQuery UI 提供了 Dialog 组件,适合创建…

vue实现右侧弹出

vue实现右侧弹出

Vue 实现右侧弹出面板 使用 Vue 实现右侧弹出面板可以通过动态控制 CSS 类或结合过渡动画完成。以下是两种常见实现方式: 方案一:基于 CSS 过渡动画 模板部分 <templ…