iframe 是 HTML5 唯一合法内嵌网页机制,替代已废弃的 frameset/frame;本地 file:// 协议下相对路径 src 会因安全策略白屏,须起本地服务或用完整 URL;高度自适应需同源 JS 获取 scrollHeight 或跨域 postMessage;Flex/Grid 中需防塌陷(如 flex-shrink: 0);移动端需外层容器 overflow + -webkit-overflow-scrolling 优化。
iframe 标签不是“框架标签”的现代替代品,它就是 HTML5 中唯一合法、被广泛支持的内嵌网页机制。旧版 frameset 和 frame 已被完全废弃,任何新项目都必须用 iframe。浏览器对 iframe 的 src 做了严格协议校验:本地双击打开 HTML 文件(file:// 协议)时,src="page.html" 或 src="./page.html" 会被拒绝加载,控制台报 Not allowed to load local resource。
python3 -m http.server 8000,然后写 src="http://localhost:8000/page.html"
src="https://example.com/widget.html",不能省略 https://
iframe 加载的是空壳纯 CSS 无法实现自动撑高。浏览器不会读取子页面 document.body.scrollHeight,除非同源且你主动用 JS 获取。
iframe.onload,再读 iframe.contentDocument.body.scrollHeight,然后设 iframe.style.height = height + 'px'
postMessage({ type: 'height', value: document.body.scrollHeight }),父页监听 message 并校验 event.origin 后更新高度onload 立即设高——Vue/React 页面可能异步渲染,建议加 setTimeout 延迟 300ms 或监听子页 DOMContentLoaded
iframe 是替换元素(replaced element),行为类似 img,在弹性或网格容器中容易失控。
style="flex-shrink: 0",否则可能被压缩成 0 高度grid-template-rows: auto,改用 grid-template-rows: minmax(0, 1fr) 或显式设行高(如 600px)iframe 必须配 width: 100%; height: 100%,但前提是其父容器有确定高度(比如 height: 600px 或 min-height: 600px)object-fit 对 iframe 无效,别试iOS Safari 对 iframe 的滚动优化极差,且内部 <meta name="viewport"> 不生效。
立即学习“前端免费学习笔记(深入)”;
iframe 外层容器加 style="overflow: auto; -webkit-overflow-scrolling: touch"
<meta name="viewport"> 里删掉 user-scalable=no,否则 iframe 内容无法双指缩放position: fixed —— iOS 下它会脱离 iframe 视口定位,飘到整个窗口顶部scroll-behavior: smooth,父页不能代劳iframe,而是处理它加载失败、跨域通信、尺寸同步和移动端兼容这些隐藏路径。每个环节漏掉一个判断,用户看到的就是一片空白或错位滚动。