element plus的dialog组件如何实现不关闭窗口时正常操作其他区域Dom

文章介绍了在使用ElementPlus的Dialog组件时,如何在不关闭对话框的情况下操作背景DOM。通过设置`pointer-events`属性,使得对话框内部可操作,而透明遮罩层变为不可操作,从而实现这一功能。解决方案包括修改Dialog的CSS样式以及在打开对话框时的回调函数中处理遮罩层的鼠标事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在项目中,有时需要实现在不关闭对话框的情况下,正常操作其他区域的Dom;

element plus的dialog组件的modal属性可以关闭灰色遮罩层, 但仍然无法操作其他区域的Dom;

原因

因为dialog除了model以外还存在着透明的遮罩层, 导致我们无法操作其他区域的Dom;

解决

可使用css3属性: pointer-events

pointer-events: none;
元素及其后代元素将不会作为鼠标事件的对象。但是如果后代元素的pointer-events属性为其他值(如:auto)时,鼠标事件作用于这个后代元素;
pointer-events: auto;
可以响应鼠标事件;

代码

<!-- 
  :close-on-click-modal="false":设置当点击对话框以外区域时,对话框不会关闭
  :modal="false":取消灰色遮罩层,但还是会有透明的遮罩层
  @open="handleOverlay":渲染对话框时回调函数,获取对话框Dom,操作穿透遮罩层
-->
<el-dialog
  v-model="dialogVisible"
  title="标题"
  draggable
  :modal="false"
  :close-on-click-modal="false"
  @open="handleOverlay"
  >
  <span>对话框内容</span>
</el-dialog>

在你的点击事件中, 修改dialogVisible值, 显示对话框

dialogVisible=true

对话框渲染出来后,执行回调函数

<script>
  // 穿透遮罩层
function handleOverlay() {
  //获取对话框Dom
  var overlay = document.querySelector('.is-draggable');
  // 设置pointerEvents='auto',使对话框可以正常操作
  overlay.style.pointerEvents = 'auto';
//通过对话框Dom获取遮罩层Dom,修改其pointerEvents = 'none',使其他区域可正常操作
  //第一层遮罩层
  var overlayFa = overlay.parentNode;
  overlayFa.style.pointerEvents = 'none';
  //第二层遮罩层
  var overlayGfa = overlay.parentNode.parentNode;
  overlayGfa.style.pointerEvents = 'none';
}
</script>

如果对你有帮助, 就请点一个赞吧

好的,下面为您提供一份实现el-dialog弹框拖拽的代码,包含详细注释,并且可以作为公共方法供其他组件调用。 首先,我们先创建一个mixin,命名为`dialogDragMixin.ts`,在该文件中实现弹框拖拽的功能。 ```typescript import { DirectiveBinding } from &#39;vue&#39;; import { ElDialog } from &#39;element-plus&#39;; // 定义接口,用于存储弹框的位置信息 interface DialogPosition { top: number; left: number; } // 定义一个变量,用于存储弹框的位置信息 let dialogPosition: DialogPosition = { top: 0, left: 0 }; export default { // 指令钩子函数,当元素插入到 DOM执行 mounted(el: HTMLElement, binding: DirectiveBinding) { // 获取el-dialog组件实例对象 const dialog: ElDialog = binding.instance.$parent as ElDialog; // 获取弹框的标题栏元素 const dialogHeaderEl: HTMLElement = el.querySelector(&#39;.el-dialog__header&#39;)!; // 设置标题栏的样式,使其可以被拖拽 dialogHeaderEl.style.cursor = &#39;move&#39;; dialogHeaderEl.style.userSelect = &#39;none&#39;; // 鼠标按下事件处理函数 const handleMouseDown = (event: MouseEvent) => { // 记录鼠标按下的位置信息 dialogPosition.top = dialog.$el.offsetTop; dialogPosition.left = dialog.$el.offsetLeft; // 记录鼠标按下的坐标信息 const mouseX = event.clientX; const mouseY = event.clientY; // 鼠标移动事件处理函数 const handleMouseMove = (event: MouseEvent) => { // 计算鼠标移动的偏移量 const offsetX = event.clientX - mouseX; const offsetY = event.clientY - mouseY; // 更新弹框的位置信息 dialog.$el.style.top = dialogPosition.top + offsetY + &#39;px&#39;; dialog.$el.style.left = dialogPosition.left + offsetX + &#39;px&#39;; }; // 鼠标抬起事件处理函数 const handleMouseUp = () => { // 移除鼠标移动事件处理函数和鼠标抬起事件处理函数 document.removeEventListener(&#39;mousemove&#39;, handleMouseMove); document.removeEventListener(&#39;mouseup&#39;, handleMouseUp); }; // 添加鼠标移动事件处理函数和鼠标抬起事件处理函数 document.addEventListener(&#39;mousemove&#39;, handleMouseMove); document.addEventListener(&#39;mouseup&#39;, handleMouseUp); }; // 添加鼠标按下事件处理函数 dialogHeaderEl.addEventListener(&#39;mousedown&#39;, handleMouseDown); } } ``` 接下来,我们在需要使用该mixin的组件中引入它,并将其添加到`mixins`属性中即可。 ```vue <template> <el-dialog title="Dialog Title" :visible.sync="dialogVisible" width="30%" :before-close="handleClose" v-dialogDrag > <span>Dialog Content</span> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="dialogVisible = false">Confirm</el-button> </span> </el-dialog> </template> <script lang="ts"> import { defineComponent } from &#39;vue&#39;; import dialogDragMixin from &#39;./dialogDragMixin&#39;; export default defineComponent({ name: &#39;MyComponent&#39;, mixins: [dialogDragMixin], data() { return { dialogVisible: false }; }, methods: { handleClose(done: () => void) { this.$confirm(&#39;Confirm to close this dialog?&#39;) .then(() => { done(); }) .catch(() => {}); } } }); </script> ``` 最后,我们可以将`dialogDragMixin`作为一个公共方法,供其他多个组件调用。在`main.ts`中,全局注册该mixin即可。 ```typescript import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import ElementPlus from &#39;element-plus&#39;; import &#39;element-plus/lib/theme-chalk/index.css&#39;; import dialogDragMixin from &#39;./dialogDragMixin&#39;; const app = createApp(App); // 注册全局mixin app.mixin(dialogDragMixin); app.use(ElementPlus).mount(&#39;#app&#39;); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值