看起来您正在使用组件中的模态组件内联。这会将它嵌套在布局中。虽然这没有什么问题,但 Safari 可能会在某处继承某些样式,导致模态呈现不可见(溢出、可见性等)。您可以尝试使用 React 门户,而不是尝试追踪导致继承问题的父元素。
门户允许您在根文档的不同部分呈现组件。无论如何,我通常喜欢这种方法用于模态窗口,因为您可以将模态 HTML 放置在布局容器之外。我倾向于更好地控制文档根目录中的模态窗口,而不必弄乱布局的边距、填充、弹性、浮动等。
以这个 index.html 代码为例(为了便于阅读,稍微删减了一些):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="overlays"></div>
<div id="root"></div>
</body>
</html>
你会注意到<div id="overlays"></div>。您可以使用门户在该 div 中而不是 id="root" div 中加载组件。
在您的 Modal 组件代码中,您可以渲染到门户元素:
import { createPortal } from 'react-dom';
const portalElement = document.getElementById('overlays');
const Modal = (props) => {
return (
<>
{createPortal(
<div className="modal">
<div className="modal__content">{props.children}</div>
</div>,
portalElement
)}
</>
);
};
export default Modal;
这将在渲染 Modal 时将布局排除在外,并有望解决 Safari 中的问题。
让我们知道这对您有什么作用!