React 弹出框背景蒙版
- 环境:react + typescript
- 使用module css
- 创建类型文件
![](https://i-blog.csdnimg.cn/blog_migrate/f4f6b25742602ac1573ccd298f829c2f.png)
declare module '*.module.css' {
const classes: {
readonly [key: string]: string
}
export default classes
declare module '*.css'
}
declare module '*.module.less' {
const classes: {
readonly [key: string]: string
}
export default classes
declare module '*.less'
}
![](https://i-blog.csdnimg.cn/blog_migrate/020b79d5d47377dcfe339bfcf46a0262.png)
.modal_wraper_show {
display: block;
}
.modal_wraper_hide {
display: none;
}
import React,{ memo, ReactNode} from 'react'
import ReactDOM from 'react-dom';
interface propstype{
visible: boolean,
children:ReactNode
}
export default memo(function Modal(props:propstype) {
let isVisible = props.visible ? 'block' : 'none'
return (
<div style={{display: isVisible}}>
{
ReactDOM.createPortal(
props.children,
document.getElementById("modal") as Element
)
}
<div className='u-mask'></div>
</div>
)
})
- 其中modal u-mask 在全局中定义,modal元素在 index.html中定义
![](https://i-blog.csdnimg.cn/blog_migrate/5bab857663fd2b538af20052651bc9c4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0f7c67327c956a15f2ed46aed6399be0.png)
#modal {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 10;
}
.u-mask {
display: block;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.3);
position: fixed;
left: 0;
top: 0;
z-index: 5;
}
![](https://i-blog.csdnimg.cn/blog_migrate/14de3cafbe6736b164c5501b3952c4a2.png)
.content {
z-index: 12;
width: 600px;
height: 400px;
display: block;
background-color: #fff;
font-size: 30px;
box-shadow: 5px 5px 5px 5px rgba(0, 0, 0, 0.1);
box-sizing: border-box;
}
.hide {
display: none;
}
.content {
:global {
.ant-btn {
background: #0f0;
border-radius: 3px;
color: #000;
}
.ant-btn-primary {
background: #0f0;
}
}
}
import React, { memo } from 'react';
import { Button } from 'antd'
import Modal from '../../components/Modal'
import style from './style.module.less'
interface proptypes{
showDilog:boolean,
onChangeState: ()=>void
}
export default memo(function TestDilog(props:proptypes) {
let {showDilog, onChangeState}= props;
function onCloseBtn(){
onChangeState()
}
return (
<Modal visible={showDilog}>
<div className={showDilog ? style.content: style.hide}>
<Button type="primary" onClick={onCloseBtn}>关闭</Button>
</div>
</Modal>
);
});
![](https://i-blog.csdnimg.cn/blog_migrate/0cea9ef465c32f67869e4018afbe17ec.png)
import React, { memo ,useState} from 'react'
import { Button, Space } from 'antd'
import { PoweroffOutlined } from '@ant-design/icons'
import Testdialog from '../testdialog'
import {HelloWrapper} from './style'
export default memo(function HelloWord() {
const [showdialog, setshowdialog] = useState(false);
function showDialog(){
setshowdialog(!showdialog);
}
return (
<HelloWrapper>
<Space style={{ width: '100%' }}>
<Button type="primary" onClick={showDialog}>Click me!</Button>
<Button type="primary" icon={<PoweroffOutlined />}>
Click me!
</Button>
<Button type="primary" icon={<PoweroffOutlined />} />
</Space>
<Testdialog showDilog={showdialog} onChangeState = {showDialog}/>
</HelloWrapper>
)
})
import styled from 'styled-components'
export const HelloWrapper = styled.div`
background-color: #00f;
font-size: 20px;
`
![](https://i-blog.csdnimg.cn/blog_migrate/10ee8d55fdc3768d028e77d1ae4e3f16.png)