当前位置:首页 > VUE

vue实现全局遮罩层

2026-03-27 02:09:38VUE

vue实现全局遮罩层的方法

使用Vue指令实现

创建自定义指令v-mask,在指令中动态生成遮罩层DOM元素并控制显示隐藏。这种方法适合局部或全局复用。

vue实现全局遮罩层

// 全局注册指令
Vue.directive('mask', {
  inserted: function(el, binding) {
    const mask = document.createElement('div')
    mask.className = 'global-mask'
    mask.style.cssText = `
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: rgba(0,0,0,0.5);
      z-index: 9999;
      display: ${binding.value ? 'block' : 'none'};
    `
    el.dataset.maskId = 'mask_' + Date.now()
    document.body.appendChild(mask)
  },
  update: function(el, binding) {
    const mask = document.querySelector('.global-mask')
    if (mask) mask.style.display = binding.value ? 'block' : 'none'
  }
})

// 使用方式
<div v-mask="isShowMask"></div>

通过Vue插件封装

将遮罩层封装为Vue插件,通过this.$mask.show()this.$mask.hide()全局调用。

vue实现全局遮罩层

const MaskPlugin = {
  install(Vue) {
    const mask = {
      show() {
        let mask = document.querySelector('.global-mask')
        if (!mask) {
          mask = document.createElement('div')
          mask.className = 'global-mask'
          mask.style.cssText = `
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0,0,0,0.5);
            z-index: 9999;
          `
          document.body.appendChild(mask)
        }
      },
      hide() {
        const mask = document.querySelector('.global-mask')
        if (mask) document.body.removeChild(mask)
      }
    }
    Vue.prototype.$mask = mask
  }
}

Vue.use(MaskPlugin)

使用组件+状态管理

结合Vuex创建全局状态控制的遮罩组件,适合中大型项目。

// store.js
state: {
  showMask: false
},
mutations: {
  SET_MASK(state, payload) {
    state.showMask = payload
  }
}

// GlobalMask.vue
<template>
  <div v-if="$store.state.showMask" class="global-mask"></div>
</template>

<style>
.global-mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,0.5);
  z-index: 9999;
}
</style>

// 调用方式
this.$store.commit('SET_MASK', true)

动态组件实现

创建可编程式调用的动态组件,通过服务方式控制显示。

// maskService.js
let maskInstance

export default {
  show() {
    if (!maskInstance) {
      const MaskComponent = Vue.extend({
        template: '<div class="global-mask"></div>'
      })
      maskInstance = new MaskComponent().$mount()
      document.body.appendChild(maskInstance.$el)
    }
  },
  hide() {
    if (maskInstance) {
      document.body.removeChild(maskInstance.$el)
      maskInstance = null
    }
  }
}

// 使用方式
import maskService from './maskService'
maskService.show()

每种实现方式各有优劣,可根据项目规模选择合适方案。指令方式适合简单需求,插件和组件方式更适合复杂场景,动态组件服务方式则提供了最大灵活性。

标签: 全局vue
分享给朋友:

相关文章

vue实现管道

vue实现管道

Vue 中实现管道(Pipe)功能 在 Vue 中可以通过过滤器(Filters)或计算属性(Computed Properties)实现类似管道的功能,将数据经过多个处理步骤后输出。 使用过滤器(…

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…

vue 实现 confirm

vue 实现 confirm

实现确认对话框的方法 在Vue中实现确认对话框可以通过多种方式完成,包括使用内置组件、第三方库或自定义组件。 使用浏览器原生confirm 最简单的实现方式是直接调用浏览器原生的confirm方法。…

vue实现keepalive

vue实现keepalive

Vue 中实现 keep-alive 在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染和销毁。以下是实现 keep-alive 的几种方法: 基本用法…

vue实现幻灯

vue实现幻灯

Vue实现幻灯片的基础方法 使用Vue实现幻灯片功能可以通过多种方式完成,以下是几种常见方案: 方案一:基于Vue的过渡动画 通过Vue的<transition>或<transit…

vue实现回复

vue实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及前端表单交互、数据绑定和后端通信。以下是实现回复功能的详细步骤: 数据绑定与表单设计 使用 Vue 的 v-model 绑定回复框的输入内容,…