同域 iframe 在 onload 后直接读 body.scrollheight 常不准,因 css 未渲染、body 默认 margin 未清、dom 未完成 layout;须用 settimeout(() => {}, 0) 延迟读 documentelement.scrollheight,并重置 body{margin:0;padding:0}。

同域 iframe 直接读取 scrollHeight 为什么经常不准
直接在 iframe.onload 里执行 iframe.contentDocument.body.scrollHeight,大概率拿到的是 0 或偏小值。原因有三个:子页面 CSS 还没渲染完成、body 默认 margin 没清、JS 执行时机早于 DOM 完全 layout。必须加一层延迟或监听重排触发点。
- 用
setTimeout(() => { ... }, 0)把读取逻辑推到下一轮事件循环,让浏览器先完成 layout - 确保子页面
body无默认边距:body { margin: 0; padding: 0; } - 优先读
document.documentElement.scrollHeight,它比body.scrollHeight更稳定(尤其当内容撑开的是根元素时)
跨域 iframe 只能靠 postMessage 通信
父页面无法访问跨域 iframe 的 DOM,contentDocument 会抛出 SecurityError。唯一合规路径是子页面主动发消息,父页面监听并响应。协议必须约定清楚,否则容易漏收或误收。
- 子页面发送前确认
window.parent存在,避免独立打开时报错:if (window.parent !== window) { window.parent.postMessage(...) } - 父页面必须校验
event.origin,不能用'*'上生产环境,例如:if (event.origin !== 'https://example.com') return - 高度值建议带单位(如
{ height: '624px' }),避免父页面再做字符串拼接
iframe-resizer 插件怎么避免踩坑
这个库封装了 postMessage + ResizeObserver + 多种高度计算策略,但默认配置在某些场景下会失效,比如子页用了 height: 100% 布局或设置了 overflow: hidden。
- 高度计算方法别硬套默认的
bodyOffset,试试documentElementScroll—— 它读的是document.documentElement.scrollHeight,对 flex / grid 布局更友好 - 子页面引入
iframeResizer.contentWindow.min.js必须放在
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











