当前位置:首页 > VUE

js实现vue弹窗窗口

2026-02-24 01:04:26VUE

Vue 弹窗实现方法

组件基础结构

创建一个名为Modal.vue的组件文件,包含模板、脚本和样式部分。弹窗通常需要v-model控制显示隐藏,并具备标题、内容区和操作按钮。

<template>
  <div class="modal-mask" v-show="visible" @click.self="close">
    <div class="modal-container">
      <div class="modal-header">
        <h3>{{ title }}</h3>
        <button @click="close">×</button>
      </div>
      <div class="modal-body">
        <slot></slot>
      </div>
      <div class="modal-footer">
        <button @click="confirm">确认</button>
        <button @click="close">取消</button>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    visible: Boolean,
    title: String
  },
  methods: {
    close() {
      this.$emit('update:visible', false)
    },
    confirm() {
      this.$emit('confirm')
      this.close()
    }
  }
}
</script>

<style scoped>
.modal-mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 1000;
}
.modal-container {
  background: white;
  border-radius: 4px;
  width: 400px;
  padding: 20px;
}
.modal-header {
  display: flex;
  justify-content: space-between;
  margin-bottom: 15px;
}
</style>

动态挂载方式

对于全局弹窗,可以通过Vue.extend动态创建组件实例并挂载到DOM。这种方式适合不需要与父组件深度交互的场景。

// 在工具文件中创建showModal方法
import Vue from 'vue'
import Modal from './Modal.vue'

const ModalConstructor = Vue.extend(Modal)

function showModal(options) {
  const instance = new ModalConstructor({
    propsData: options.props
  })

  instance.$slots.default = [options.content]
  instance.$mount()
  document.body.appendChild(instance.$el)

  return new Promise(resolve => {
    instance.$on('confirm', () => resolve(true))
    instance.$on('update:visible', val => !val && resolve(false))
  })
}

// 使用示例
showModal({
  props: { title: '提示' },
  content: '确定要删除吗?'
}).then(confirmed => {
  console.log(confirmed ? '用户确认' : '用户取消')
})

过渡动画效果

为弹窗添加CSS过渡动画可以提升用户体验,在组件中添加transition包裹和对应的CSS规则。

<template>
  <transition name="modal">
    <div class="modal-mask" v-show="visible" @click.self="close">
      <!-- 原有内容 -->
    </div>
  </transition>
</template>

<style scoped>
.modal-enter-active, .modal-leave-active {
  transition: opacity 0.3s;
}
.modal-enter, .modal-leave-to {
  opacity: 0;
}
.modal-container {
  transition: transform 0.3s;
}
.modal-enter .modal-container,
.modal-leave-to .modal-container {
  transform: scale(0.9);
}
</style>

全局注册插件

将弹窗封装为Vue插件,方便在任何组件中通过this.$modal调用。

js实现vue弹窗窗口

// modal-plugin.js
export default {
  install(Vue) {
    Vue.prototype.$modal = {
      show(options) {
        return showModal(options)
      }
    }
  }
}

// main.js
import ModalPlugin from './modal-plugin'
Vue.use(ModalPlugin)

// 组件中使用
this.$modal.show({
  props: { title: '系统提示' },
  content: '操作已成功'
})

注意事项

  • 弹窗组件应该使用position: fixed定位,避免受父元素布局影响
  • 多个弹窗同时出现时需管理z-index层级
  • 移动端需要考虑响应式设计和手势操作
  • 通过document.activeElement记录焦点位置,提升可访问性
  • 使用<teleport>(Vue3)或portal-vue库处理DOM挂载位置问题

标签: 窗口js
分享给朋友:

相关文章

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…