You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动端Safari模态框打开后关闭键盘时冻结无法点击的问题求助

移动端Safari模态框打开后关闭键盘时冻结无法点击的问题求助

各位大佬好!我现在遇到一个头疼的问题:在Mobile Safari上打开模态框后,只要点击输入框唤起键盘,关闭键盘的时候整个模态框就会冻结,完全没法点击任何元素。但在Mobile Chrome和桌面端的所有浏览器里都正常运行,有没有大佬能帮忙看看咋解决呀?万分感激!

相关代码

import React, { HTMLAttributes, useEffect } from "react";
import ReactDOM from "react-dom";
import Overlay from "./Overlay";

export interface ModalProps extends HTMLAttributes<any> {
  isOpen: boolean;
  pixelUp?: number;
  title?: string | any;
  bottomPadding?: string;
  contentCentered?: boolean;
  children?: any;
  modalClassName?: string;
  zIndex?: number;
}

const Modal = ({
  isOpen,
  pixelUp = 0,
  title = "",
  bottomPadding = "pb-0",
  contentCentered = false,
  modalClassName = "",
  zIndex = 50,
  ...props
}: ModalProps) => {
  useEffect(() => {
    if (isOpen) {
      const scrollY = window.scrollY;
      document.body.style.position = "fixed";
      document.body.style.top = `-${scrollY}px`;
      document.body.style.width = "100%";
      document.body.style.overflow = "hidden";

      return () => {
        document.body.style.position = "";
        document.body.style.top = "";
        document.body.style.width = "";
        document.body.style.overflow = "";
        window.scrollTo(0, scrollY);
      };
    }
  }, [isOpen]);

  if (!isOpen) return null;

  const { className, children, ...restProps } = props;

  return ReactDOM.createPortal(
    <Overlay>
      <div
        className={`fixed inset-0 flex items-center justify-center pointer-events-none`}
        style={{ zIndex }} // keep the z-index prop working
      >
        {/* Must be 75vh for roster form height fix */}
        <div
          className={`bg-white rounded-lg shadow-lg w-full max-w-lg max-h-[80vh] overflow-y-auto p-6 ${modalClassName}`}
          style={{ pointerEvents: 'auto' }}
        >
          {title ? (
            <div className={`font-bold mb-2 text-center`}>{title}</div>
          ) : (
            <></>
          )}
          <div
            className={`${bottomPadding} max-h-[calc(80vh-3rem)] ${
              contentCentered ? "text-center" : ""
            }`}
          >
            {children}
          </div>
        </div>
      </div>
    </Overlay>,
    document.body
  );
};

export default Modal;

Overlay.tsx

import React from "react";

const Overlay = ({ children = null }) => {
  return (
    <div
      className="fixed inset-0 bg-black bg-opacity-50 z-50"
      style={{ touchAction: 'none', overscrollBehavior: 'none' }}
    >
      {children}
    </div>
  );
}

export default Overlay;

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:10:03