element的Loading 加载设置“加载“的位置始终居中

问题描述:给页面设置加载中的样式,但是由于数据量很大,数据在逐步渲染的同时,页面高度也随之变化,出现竖向滚动条,这时候的加载中的那个“圈圈”也跟着页面滚走了,显示如下

解决办法:我是投机取巧的方法,如果有更好的方法,欢迎留言告诉我~

首先,我设置一个没什么用的div,接着让它的高度和宽度正好盖住页面;

最后,将v-loading的事件放在这个div上,将div的设为position: absolute,这样不占用空间,不影响页面其他布局,设置绝对布局又会影响到自身高度,所以我又多加个了v-show,当加载好后直接隐藏这个无用的div,避免它把我的操作按钮给挡住点击不了,你们也可试试设置z-index能不能解决。

<template>
  <div class="add-base">
    <div 
       v-show="loading"
       class="loading-div" 
       v-loading="loading" 
       :style="{height:windowHeight + 'px'}>        
    </div>
    <div>我才是页面显示的内容</div>
  </div>
</template>

export default {
  data () {
    return {
        windowHeight: document.documentElement.clientHeight, // 实时屏幕高度
    }
  }
}


.loading-div {
  width: 100%;
  position: absolute;
}

### 实现 Vue 中 `v-loading` 指令的全屏加载效果 为了创建一个类似于 Element UI 的 `v-loading` 全屏加载效果,在 Vue 项目中可以通过自定义指令来实现这一功能。下面是一个详细的解决方案。 #### 创建自定义指令 首先,注册一个新的全局指令用于处理 loading 功能: ```javascript // main.js 或 setup 部分 import { createApp } from 'vue'; import App from './App.vue'; const app = createApp(App); app.directive('fullLoading', { mounted(el, binding) { const loadingInstance = document.createElement('div'); loadingInstance.style.position = 'fixed'; loadingInstance.style.top = '0'; loadingInstance.style.left = '0'; loadingInstance.style.width = '100%'; loadingInstance.style.height = '100%'; loadingInstance.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; loadingInstance.style.display = 'flex'; loadingInstance.style.alignItems = 'center'; loadingInstance.style.justifyContent = 'center'; loadingInstance.style.zIndex = '9999'; const spinner = document.createElement('span'); spinner.textContent = "加载中..."; spinner.style.color = '#fff'; spinner.style.fontSize = '24px'; loadingInstance.appendChild(spinner); el.loadingInstance = loadingInstance; if (binding.value === true || typeof binding.value !== 'boolean') { document.body.appendChild(loadingInstance); } }, updated(el, binding) { if (binding.value && !el.loadingInstance.parentNode) { document.body.appendChild(el.loadingInstance); } else if (!binding.value && el.loadingInstance.parentNode) { document.body.removeChild(el.loadingInstance); } }, }); ``` 这段代码实现了当绑定值为真时显示遮罩层并居中文本“加载中...”,反之则隐藏它[^2]。 #### 使用自定义指令 接着可以在模板里像这样应用这个新指令: ```html <template> <button @click="toggleLoading">Toggle Loading</button> <!-- 应用了 v-full-loading --> <section v-full-loading="isLoading"> 这里的内容会被覆盖直到加载结束... </section> </template> <script> export default { data() { return { isLoading: false, }; }, methods: { toggleLoading() { this.isLoading = !this.isLoading; }, }, }; </script> ``` 此部分展示了如何通过点击按钮切换加载状态,并利用刚刚创建好的 `v-full-loading` 来控制页面上的某个区域是否处于加载状态下[^3]。 #### 定制样式与行为 如果希望进一步定制该指令的行为或外观,则可以考虑向指令传递更多的参数,比如背景颜色、文字描述等属性。这可以根据实际需求调整上述 JavaScript 和 CSS 样式的设置方式[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值