当前位置:首页 > 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 绑定状态控制弹窗显示,可自定义内容插槽。

<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 支持左右侧显示:

    <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 属性和焦点管理:

    vue实现弹出侧边弹窗

    <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实现弹出广告的方法 在Vue中实现弹出广告可以通过多种方式完成,以下是几种常见的方法: 使用v-if/v-show控制显示 通过数据绑定控制广告的显示与隐藏。在Vue组件中定义一个布尔值数据…

vue实现点击弹出框

vue实现点击弹出框

Vue 实现点击弹出框的方法 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if 可以控制弹出框的显示与隐藏。v-show 通过 CSS 的 display…

vue实现底部弹出框

vue实现底部弹出框

实现底部弹出框的方法 在Vue中实现底部弹出框(Bottom Sheet)可以通过多种方式完成,包括使用原生HTML/CSS、第三方UI库或自定义组件。以下是几种常见方法: 使用原生HTML/CSS…

js实现modal弹出

js实现modal弹出

使用原生JavaScript实现Modal弹出框 创建一个基本的Modal弹出框需要HTML、CSS和JavaScript的配合。以下是一个完整的实现方案: HTML结构 <button i…

jquery 侧边栏

jquery 侧边栏

使用 jQuery 创建侧边栏 基本 HTML 结构 创建一个简单的侧边栏结构,包含触发按钮和侧边栏内容。 <button id="sidebar-toggle">Toggle Si…

jquery弹出div窗口

jquery弹出div窗口

jQuery 弹出 Div 窗口的方法 使用 show() 和 hide() 方法 通过 jQuery 的 show() 和 hide() 方法可以控制 div 的显示与隐藏。默认情况下,div 设置…