是的,<frameset> 已被HTML5彻底移除,现代浏览器不支持且语法无效;因其破坏语义结构、损害可访问性与SEO、违背响应式设计,应改用CSS Grid/Flexbox布局+语义化标签(如<nav>、<main>)或<iframe>配合postMessage等现代方案。

HTML <frameset> 已被现代浏览器弃用,且无法通过 HTML5 验证 —— 如果你正在新项目中考虑用它做布局,直接放弃。
为什么 <frameset> 会触发“document.write is not defined”或空白页
主流浏览器(Chrome、Firefox、Edge)在 <frameset> 页面中禁用 document.write(),且不支持 <body> 与 <frameset> 共存。一旦页面同时包含两者,解析器会静默丢弃 <body> 内容,或报错 DOMException: Failed to execute 'write' on 'Document'。
- 浏览器认为
<frameset>是独立的文档结构替代方案,强制要求页面以<frameset>为根,不能混用<body> - 任何 JS 脚本里调用
document.write()(比如旧版统计代码、广告 SDK)都会立即失败 - 即使页面能加载,
<frame>加载的子页面若含<script>且依赖父级window.parent,也常因跨域或上下文隔离而中断
rows 和 cols 的数值行为差异很实际
它们看似只是“分块”,但单位类型直接影响布局稳定性:
-
rows="100,*,200":第一行固定 100px,第三行固定 200px,中间*吃掉所有剩余高度 —— 这是唯一能自适应窗口缩放的方式 -
rows="30%,40%,30%":三行严格按比例分配,但若内容溢出,不会自动滚动,而是截断或撑破框架(取决于scrolling属性) -
rows="100px,200px":只定义两行,总高仅 300px,剩余空间默认留白,且无法响应窗口变小 —— 常见于老后台顶部菜单 + 主内容区,但移动端完全失效
注意:cols 行为一致,但列宽对文本流影响更敏感;混合使用 rows 和嵌套 <frameset> 时,内层 cols 会相对于外层某一行的宽度计算,极易失控。
立即学习“前端免费学习笔记(深入)”;
替代方案不是“选一个”,而是按场景切分
别试图用 Flexbox 或 Grid “模拟 frameset 的切换效果”。真实需求其实就三类:
- 需要左侧菜单 + 右侧内容动态加载?用
<aside>+<main>+fetch()替换<frame src="...">,配合history.pushState()管理 URL - 需保持顶部导航/底部版权始终可见,中间区域滚动?CSS
position: sticky或 Grid 的grid-template-rows: auto 1fr auto更可靠 - 必须嵌入第三方页面(如报表系统、监控看板),且无法改源码?用
<iframe src="..." sandbox="allow-scripts">,它比<frame>更安全、可样式控制、支持 postMessage 通信
真正麻烦的不是语法,而是旧系统里那些隐式依赖 window.frames[0] 或 parent.location.href 的 JS 逻辑 —— 它们藏在几十个 .js 文件里,不运行到那一步根本不会暴露问题。



















