是的,在html5中被彻底移除,因其破坏语义结构、损害可访问性与seo、违背响应式设计原则;应改用css grid/flexbox布局+带aria属性的,或采用服务端包含、spa组件化路由等现代方案。

是的,<frameset></frameset> 在 HTML5 中被彻底移除,不再被任何现代浏览器支持——不是“不推荐”,而是语法无效,解析时会被忽略或触发 quirks mode。
为什么 <frameset></frameset> 被砍掉?
它破坏了基本的文档语义结构、阻碍可访问性(屏幕阅读器难以导航)、干扰 SEO(搜索引擎无法合理判断 frame 内容归属)、且与现代响应式设计完全冲突。HTML5 的设计原则是“内容优先、语义清晰、单页可控”,而 <frameset></frameset> 让页面变成多个独立文档上下文,违背这一前提。
替代方案:用 <iframe></iframe> + CSS 布局模拟 frameset 行为
<iframe></iframe> 本身没被废弃,仍是 HTML5 标准元素,但用法和定位完全不同:它是嵌入式内容容器,必须放在常规流式文档中,由父页面统一控制样式与交互。
-
<frameset cols="20%,80%"></frameset>→ 改用 CSS Grid 或 Flexbox 划分区域,再在每个区域放<iframe></iframe> - 每个
<frame src="nav.html">→ 替换为<iframe src="nav.html" title="导航栏" aria-hidden="false"></iframe>,并手动加title和 ARIA 属性提升可访问性 - 跨 frame 脚本通信(如
parent.frames[1].location.href)→ 改用postMessage(),且必须校验event.origin
<div class="layout">
<aside class="sidebar"><iframe src="menu.html" title="主菜单"></iframe></aside>
<main class="content"><iframe src="dashboard.html" title="仪表盘"></iframe></main>
</div>
<style>
.layout { display: grid; grid-template-columns: 250px 1fr; height: 100vh; }
iframe { width: 100%; height: 100%; border: none; }
</style>
更现代的替代思路:服务端整合 or 单页应用(SPA)
如果原 frameset 是为了“固定导航+动态内容”,现在主流做法是:
立即学习“前端免费学习笔记(深入)”;
- 服务端:用 include / template partial(如 PHP
include 'header.php';、Jinja2{% include 'nav.html' %})生成完整 HTML,避免客户端拆分 -
前端:用 React/Vue 的组件化路由(如
<router></router>+<outlet></outlet>或<router-view></router-view>)复用布局组件,内容按需加载 - 纯静态场景:用
fetch()加载 HTML 片段后注入<div id="content">,比 iframe 更轻量、无<a style="color:#f60; text-decoration:underline;" title="跨域" href="https://www.php.cn/zt/20277.html" target="_blank">跨域</a>/<a style="color:#f60; text-decoration:underline;" title="cookie" href="https://www.php.cn/zt/16004.html" target="_blank">cookie</a> 隔离问题 <p>真正难迁移的不是技术实现,而是旧系统里隐含的 frame 间全局变量共享、document.write 覆盖、以及 onload 顺序依赖——这些在 iframe 或 SPA 下都得重写逻辑,不能只换标签。</p> </div>










