当前位置:首页 > VUE

js实现vue弹窗窗口

2026-01-23 10:26:28VUE

使用 Vue.js 实现弹窗窗口

基础弹窗组件

创建一个基础的 Vue 弹窗组件,包含显示/隐藏功能:

<template>
  <div class="modal" v-if="isVisible">
    <div class="modal-content">
      <span class="close" @click="close">&times;</span>
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Modal',
  props: {
    isVisible: {
      type: Boolean,
      default: false
    }
  },
  methods: {
    close() {
      this.$emit('update:isVisible', false)
    }
  }
}
</script>

<style>
.modal {
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.4);
}

.modal-content {
  background-color: #fefefe;
  margin: 15% auto;
  padding: 20px;
  border: 1px solid #888;
  width: 80%;
}

.close {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
  cursor: pointer;
}
</style>

在父组件中使用弹窗

在父组件中控制弹窗的显示/隐藏:

<template>
  <div>
    <button @click="showModal = true">打开弹窗</button>
    <Modal :isVisible="showModal" @update:isVisible="showModal = $event">
      <h3>弹窗标题</h3>
      <p>弹窗内容...</p>
    </Modal>
  </div>
</template>

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

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

动态内容弹窗

实现可传入动态内容的弹窗:

// Modal组件中添加props接收内容
props: {
  title: String,
  content: String
}

// 使用方式
<Modal 
  :isVisible="showModal" 
  title="动态标题" 
  content="动态内容..."
  @update:isVisible="showModal = $event"
/>

全局弹窗服务

创建可在任何组件中调用的全局弹窗服务:

// 创建eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()

// 修改Modal组件为全局组件
Vue.component('Modal', {
  // ...之前的Modal组件代码
  data() {
    return {
      isVisible: false,
      title: '',
      content: ''
    }
  },
  created() {
    EventBus.$on('showModal', (payload) => {
      this.isVisible = true
      this.title = payload.title || ''
      this.content = payload.content || ''
    })
  }
})

// 在任何组件中触发弹窗
EventBus.$emit('showModal', {
  title: '全局弹窗',
  content: '通过事件总线触发的弹窗'
})

动画效果

为弹窗添加过渡动画:

<template>
  <transition name="modal">
    <div class="modal" v-if="isVisible">
      <!-- 弹窗内容 -->
    </div>
  </transition>
</template>

<style>
.modal-enter-active, .modal-leave-active {
  transition: opacity 0.3s;
}
.modal-enter, .modal-leave-to {
  opacity: 0;
}
</style>

高级功能实现

实现可拖拽的弹窗窗口:

// 在Modal组件中添加
data() {
  return {
    isDragging: false,
    startX: 0,
    startY: 0,
    startLeft: 0,
    startTop: 0
  }
},
methods: {
  startDrag(e) {
    this.isDragging = true
    this.startX = e.clientX
    this.startY = e.clientY
    const modal = this.$el.querySelector('.modal-content')
    this.startLeft = modal.offsetLeft
    this.startTop = modal.offsetTop
    document.addEventListener('mousemove', this.onDrag)
    document.addEventListener('mouseup', this.stopDrag)
  },
  onDrag(e) {
    if (!this.isDragging) return
    const modal = this.$el.querySelector('.modal-content')
    modal.style.left = `${this.startLeft + e.clientX - this.startX}px`
    modal.style.top = `${this.startTop + e.clientY - this.startY}px`
  },
  stopDrag() {
    this.isDragging = false
    document.removeEventListener('mousemove', this.onDrag)
    document.removeEventListener('mouseup', this.stopDrag)
  }
}

// 在modal-content元素上添加
<div class="modal-content" @mousedown="startDrag">

这些方法提供了从基础到高级的 Vue 弹窗实现方案,可以根据项目需求选择合适的实现方式。

js实现vue弹窗窗口

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

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 实现继承

js 实现继承

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

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-contain…