解析期,此时 body 还不存在,需要判空 if (document.body) { document.body.style.setProperty('height', hStr, 'important'); document.body.style.setProperty('min-height', hStr, 'important'); } if (rootH) { rootH.style.setProperty('height', hStr, 'important'); rootH.style.setProperty('min-height', hStr, 'important'); } } } // 只有最外层 html 跟随视觉视口平移,body / #root 一律 top:0,避免叠加成双倍位移 if (lastShift !== shift) { lastShift = shift; document.documentElement.style.setProperty('top', shift + 'px', 'important'); if (document.body) document.body.style.setProperty('top', '0', 'important'); var rootEl = document.getElementById('root'); if (rootEl) rootEl.style.setProperty('top', '0', 'important'); } try { window.scrollTo(0, 0); } catch (e) {} }; // 暴露给 App.tsx 调用:全站只有这一份高度逻辑,避免两处写入互相覆盖。 window.__aiOsFixViewport = fix; window.addEventListener("resize", fix); window.addEventListener("orientationchange", fix); if (window.visualViewport && typeof window.visualViewport.addEventListener === 'function') { window.visualViewport.addEventListener("resize", fix); window.visualViewport.addEventListener("scroll", fix); } fix(); // 只保留一次适度延迟,避免频繁重绘 setTimeout(fix, 200); })();