frameset 和 frame 标签在 HTML5 中已被彻底移除,非过时而是语法无效;frameset 与 body 互斥,共存会导致解析失败或内容静默丢弃,W3C 验证器直接报错。

frameset 和 frame 标签在现代 HTML 开发中已完全失效,它们不是“过时但还能用”的功能,而是被 HTML5 标准明确移除的结构标签——浏览器渲染时会忽略其语义,且 W3C 验证器直接报错。
为什么 frameset 不能和 body 共存
这是由 HTML DTD(文档类型定义)强制规定的互斥关系:frameset 是顶层容器,替代了 body 的作用。一旦用了 frameset,整个文档结构就切换到“框架模式”,此时 body 不仅无效,还会导致解析失败或静默丢弃。
- 浏览器遇到
<frameset></frameset>后,会跳过后续所有body内容(包括 script、div、img 等) - 即使你写了
<body><frameset>...</frameset></body>,实际 DOM 中也不会出现body节点 - 验证工具(如 W3C Markup Validation Service)会报错:“
bodyelement not allowed as child ofhtmlin this context”
cols 和 rows 的数值组合怎么算实际尺寸
它们不是 CSS 中的 flex 或 grid,而是基于顺序分配的静态比例系统,计算逻辑简单但容易误判:
-
cols="200,*,30%"这种混写是合法的,但浏览器按顺序处理:先分配 200px,再把剩余空间给*,最后从原始宽度中截取 30% —— 实际结果可能重叠或溢出 -
*不代表“均分”,只代表“剩余空间”,多个*会被等分(如*,*,*≈ 33.33% each) - 百分比值必须加
%符号,写成cols="50,50"是像素值,不是百分比 - 嵌套
frameset时,子frameset的cols/rows基于父级框架的可用尺寸,不是整个视口
frame 的 src 加载失败时没有 fallback 机制
frame 标签不支持 onerror、fallback 或内容内联,加载失败只会留白或显示浏览器默认错误页(取决于 UA),且无法通过 JS 捕获或替换。
立即学习“前端免费学习笔记(深入)”;
- 即使加了
<noframes><body>备用内容</body></noframes>,它只对完全不支持框架的旧浏览器生效,现代浏览器无视该标签 -
frame中的页面若 404,控制台通常不报错,也无 network 面板记录(部分浏览器会记录,但不触发 JS 事件) - 无法用 CSS 控制
frame内容的样式,也无法用 JS 跨域访问其document(同源策略严格限制) -
name属性虽可用于target导航,但现代单页应用中基本无对应使用场景
真正棘手的不是语法怎么写,而是当你在遗留系统里看到 frameset,得立刻意识到:它不是“能跑就行”的兼容性问题,而是整个页面生命周期、SEO、可访问性、JavaScript 交互都被锁死在 1998 年的技术范式里——连最基本的 focus 管理、屏幕阅读器支持、打印样式都不可靠。



















