Ant Design中的Modal框单独悬浮,并可以点击后面元素,使其遮罩蒙版透明

本文讲述了作者在开发过程中如何通过尝试不同的方法,最终利用AntDesignModal的wrapClassName属性和自定义事件处理,实现在弹框打开期间背景可操作且仅可通过点击关闭的弹框拖动功能。

需求:需要一个Modal弹框,在弹框弹出期间,弹窗后面背景板可以自由操作,只有在点击Modal的x关闭才会关闭弹框,并且Modal弹框可以按住顶部实现屏幕内随意拖动效果。

过程计划方法尝试:
计划:一开始确定的方法就是通过CSS的pointerEvents:'none',把背景遮罩的指针事件给关掉
方法①:我一开始尝试用css定位到内部的ant-modal-root或者ant-modal-wrap然使用global去改变css样式,后面一直定位不到。over。
方法②:后面尝试使用DOM,在弹框出现后去通过className去定位元素,然后在去改变style的元素,去添加样式,这方法是定位到了,但是改了不实现。over。

最终实现:重新拉了一遍文档,发现有现成的api,直接加wrapClassName,好事!!.....

最终实现代码

弹框:

<Modal
  wrapClassName={styles.zrjCSS} //对话框外层容器的类名!!!不同于className是容器类名
  title={<div style={{ width: '100%', cursor: 'move' }} onMouseDown={this.onMouseDown}>孜然卷弹框</div>}
  style={style} //配合拖动时改变弹框位置
  destroyOnClose={true}  //关闭时销毁 Modal 里的子元素
  mask={false}  //关闭遮罩
  maskClosable={false}  //点击蒙层是否允许关闭
  visible={this.state.RGZJvis}
  onOk={this.RGZJOK}
  okText={'保存'}
  width={650}
  onCancel={this.RGZJhandleCancel}
>
  孜然卷内容
</Modal>

其种title中的拖动事件

onMouseDown = (e: any) => {
  e.preventDefault();
  //记录初始移动的鼠标位置
  let startPosX = e.clientX;
  let startPosY = e.clientY;
  const { styleLeft, styleTop } = this.state;
  //添加鼠标移动事件
  document.body.onmousemove = e => {
    let left = e.clientX - startPosX + styleLeft;
    let top = e.clientY - startPosY + styleTop;
    if (this.inWindow(e.clientX, e.clientY, startPosX, startPosY)) {
      this.setState({
        styleLeft: left,
        styleTop: top,
      })
    }
  };
  //鼠标放开时去掉移动事件
  document.body.onmouseup = function () {
    document.body.onmousemove = null;
  };
}
const { styleLeft, styleTop } = this.state;
const style = { left: styleLeft, top: styleTop }

其种的className 

.zrjCSS{
  pointer-events: none;
}

其种需求最后一步,拖动可见往期文章   Modal拖动实现

<think>首先,用户的问题是关于AntDesignModal组件:他们想实现点击遮罩层时不关闭Modal且能够操作背景内容。意思是当点击Modal的背景(遮罩层)时,Modal不关闭,同时允许用户与背景内容交互。回顾系统级指令:-所有行内数学表达式用$...$,但这里没有数学内容。-独立公式用$$...$$,但不需要。-LaTeX语法正确,但问题不涉及数学。-使用中文回答。-生成相关问题。-在引用的段落末尾添加引用标识。-回答结构清晰,逐步解决问题。-参考站内引用:引用[1]是关于AntDesignVue的Modal样式覆盖,使用getContainer方法;引用[2]是关于ArcoDesignModal设置点击遮罩层不关闭。用户的问题是针对AntDesign(可能是React本),但引用[1]是Vue本。我需要确保回答针对正确的架。用户说“AntDesign”,通常指React本,但引用[1]是Vue的。用户最后提到“AntDesignModal”,所以我假设是React本。关键点:-点击遮罩层不关闭Modal:这可以通过设置属性来实现。-操作背景内容:这可能意味着在Modal打开时,允许用户与背景页面交互。在AntDesign的Modal组件中:-有一个属性`maskClosable`,控制点击遮罩层是否关闭Modal。默认是true,设置为false可以防止关闭。-关于操作背景内容Modal通常有一个遮罩层(mask),它会覆盖背景,阻止事件。要允许操作背景内容,可能需要移除遮罩层或使其透明且不阻止事件。用户说“点击遮罩层不关闭操作背景内容”。所以,设置`maskClosable={false}`可以防止关闭,但要操作背景内容,可能需要自定义遮罩层样式或行为。参考引用[1]:在Vue本中,他们使用getContainer将Modal挂载到特定节点,然后通过CSS覆盖样式,如设置height等。但用户想操作背景内容,这可能涉及事件处理。在AntDesignReact中:-属性:`maskClosable`设置为false可以防止点击遮罩层关闭。-遮罩层默认阻止事件(pointer-events:none?不,通常是pointer-events:autoformasktoblockevents)。在Modal中,遮罩层通常有一个样式阻止背景交互。-要允许背景交互,可能需要设置`mask={false}`来移除遮罩层,但这样就没有遮罩层了,用户可能还是想有遮罩层但不阻止事件。用户说“点击遮罩层不关闭操作背景内容”,意思可能是:点击遮罩层时,不关闭Modal,但允许事件穿透到背景内容。所以,实现步骤:1.设置`maskClosable={false}`以防止点击遮罩层关闭Modal。2.修改遮罩层的样式,使其不阻止事件,例如设置`pointer-events:none`,但这样点击遮罩层也会触发背景事件。用户可能想点击遮罩层时触发背景交互。在CSS中,遮罩层通常是绝对定位覆盖整个屏幕,背景半透明。默认情况下,它会阻止点击事件到达背景。在AntDesign中,Modal有一个`mask`属性,设置为false可以移除遮罩层。但用户提到“点击遮罩层”,所以可能还是需要遮罩层。或许通过CSS覆盖:-设置遮罩层的`pointer-events:none`,这样事件会穿透到背景。-但点击遮罩层本身不会做任何事,包括关闭Modal。用户想点击遮罩层时不关闭但操作背景。所以,结合:-`maskClosable={false}`-自定义遮罩层样式,设置`pointer-events:none`这样,点击遮罩层时,事件会穿透到背景元素,触发背景交互,而Modal不会关闭。引用[1]展示了如何覆盖样式使用/deep/或scopedCSS。在React中,可能需要全局CSS或使用style属性。回答结构:-逐步解释实现方法。-提供代码示例。-添加引用标识。-生成相关问题。引用站内内容:-引用[1]:关于getContainer和样式覆盖,但用户没提getContainer,只提操作背景内容。-引用[2]:关于设置点击遮罩层不关闭,但它是Arco的。我应该基于用户问题回答,引用仅供参考。最终方法:1.设置`maskClosable={false}`。2.自定义遮罩层样式,设置`pointer-events:none`来允许事件穿透。在AntDesignReact中,Modal有`maskStyle`属性可以设置遮罩层样式。代码示例:```jsx<Modalvisible={visible}onCancel={handleCancel}maskClosable={false}maskStyle={{pointerEvents:&#39;none&#39;}}>{/*Modal内容*/}</Modal>```设置`maskStyle={{pointerEvents:&#39;none&#39;}}`应该使遮罩层不捕获事件,允许背景交互。但测试:在AntDesign中,maskStyle可以设置样式对象。此外,确保背景内容是可交互的,可能需要调整z-index或其他,但Modal默认有高z-index。用户说“操作背景内容”,可能背景有按钮等,需要能被点击。所以,这个设置应该工作。生成相关问题:1.如何在AntDesignModal中自定义遮罩层样式?2.AntDesignModal的其他常用属性有哪些?3.如何实现Modal打开时背景滚动?类似示例。回答用中文。</think>### Ant Design Modal 点击遮罩层不关闭操作背景内容的实现方法 在 Ant DesignReact 本)中,实现点击遮罩层时不关闭 Modal 允许操作背景内容,主要通过两个关键步骤: 1. **设置 `maskClosable={false}`**:防止点击遮罩层触发 Modal 关闭。 2. **自定义遮罩层样式**:通过 CSS 覆盖遮罩层的 `pointer-events` 属性,允许事件穿透到背景内容。 以下是详细实现步骤和代码示例: #### 步骤 1: 设置 Modal 属性防止关闭 - 在 Modal 组件中添加 `maskClosable={false}` 属性,确保点击遮罩层不会关闭 Modal。 - 同时,通过 `onCancel` 回调控制关闭逻辑(例如通过按钮关闭)。 ```jsx import React, { useState } from &#39;react&#39;; import { Modal, Button } from &#39;antd&#39;; const MyModal = () => { const [visible, setVisible] = useState(false); const showModal = () => { setVisible(true); }; const handleCancel = () => { setVisible(false); // 通过其他方式(如取消按钮)关闭 Modal }; return ( <div> <Button onClick={showModal}>打开 Modal</Button> <Modal title="示例 Modal" visible={visible} onCancel={handleCancel} maskClosable={false} // 关键:禁止点击遮罩层关闭 footer={[ <Button key="cancel" onClick={handleCancel}> 关闭 </Button> ]} > <p>Modal 内容区域</p> </Modal> </div> ); }; export default MyModal; ``` #### 步骤 2: 覆盖遮罩层样式允许操作背景 - 使用 CSS 设置遮罩层的 `pointer-events: none`,使点击事件穿透到背景元素。 - 在 Ant Design 中,可通过全局 CSS 或组件样式覆盖实现。推荐使用 `:global` 或外层容器选择器(注意:在 React 中避免使用 `/deep/`,改用 CSS Modules 或全局样式文件)。 ```css /* 全局样式文件(如 styles.css) */ .ant-modal-mask { pointer-events: none !important; /* 允许事件穿透 */ background-color: rgba(0, 0, 0, 0.3); /* 可选:调整遮罩透明度 */ } ``` - **如果使用 CSS Modules 或 scoped 样式**,在组件内添加: ```jsx // 在组件文件中导入样式 import styles from &#39;./MyModal.module.css&#39;; // JSX 部分同上 ``` ```css /* MyModal.module.css */ .customModal :global(.ant-modal-mask) { pointer-events: none; } ``` #### 完整示例 ```jsx import React, { useState } from &#39;react&#39;; import { Modal, Button } from &#39;antd&#39;; import &#39;./styles.css&#39;; // 导入全局样式 const App = () => { const [visible, setVisible] = useState(false); return ( <div> <Button onClick={() => setVisible(true)}>打开 Modal</Button> <div id="background-content"> <p>背景内容(可点击测试)</p> <Button>背景按钮</Button> </div> <Modal title="操作背景示例" visible={visible} onCancel={() => setVisible(false)} maskClosable={false} maskStyle={{ pointerEvents: &#39;none&#39; }} // 内联样式备选方案 > <p>点击遮罩层不会关闭,但可操作背景元素。</p> </Modal> </div> ); }; export default App; ``` #### 注意事项 - **事件穿透原理**:`pointer-events: none` 使遮罩层不拦截点击事件,事件会直接传递到背景元素。 - **兼容性**:确保 Modal 的 `z-index` 高于背景内容Ant Design 默认处理),避免背景元素被遮挡。 - **备选方案**:如果全局样式覆盖困难,可直接在 Modal 上使用 `maskStyle` 属性: ```jsx <Modal maskStyle={{ pointerEvents: &#39;none&#39;, backgroundColor: &#39;rgba(0,0,0,0.3)&#39; }} // 其他属性... /> ``` - 参考引用[1]中通过 `getContainer` 和样式覆盖的思路,但本方案更简化,无需挂载到特定节点[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值