当前位置:首页 > 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>

在父组件中使用弹窗

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

js实现vue弹窗窗口

<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"
/>

全局弹窗服务

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

js实现vue弹窗窗口

// 创建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
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback)…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…