frameset标签在HTML5中已被完全废弃,新项目禁用;必须移除body标签,rows/cols值禁用px单位,frame加载受跨域和路径严格限制,推荐用iframe、CSS布局或SPA替代。

frameset 标签在现代网页开发中**已不被推荐使用,且 HTML5 中已被完全废弃**。如果你看到老项目里还在用它,那基本是 2010 年前的遗留结构;新项目强行套用,会在 Chrome、Firefox、Edge 等主流浏览器中触发兼容警告,甚至部分功能失效。
下面直接说清楚:怎么写、为什么不能乱写、哪些坑一踩就断联。
用 frameset 必须彻底移除 body
这是最常翻车的第一步:frameset 和 body 是互斥的顶层容器,不能共存。
- 删掉所有
<body>、</body>标签(连同里面的内容) -
<head>后面直接跟<frameset rows="20%,60%,20%">,不是嵌在body里 - 如果保留
body,浏览器会静默忽略frameset,只渲染body内容——你啥都看不到
rows 和 cols 的值怎么写才不会错
这两个属性决定框架是横向切(行)还是纵向切(列),但单位混用或语法错误会导致整个框架集不渲染。
-
rows="150,*,20%"是合法的:像素 + 星号(剩余空间) + 百分比可混合,但顺序会影响实际分配 -
rows="100px,200px"错误:px单位在rows/cols中不被识别,必须写成"100,200" -
cols="30%,*,40%"会出问题:三列加起来超 100%,第二列的*实际为负空间,浏览器行为不可控 - 建议统一用百分比(如
"25%,50%,25%")或纯数值(如"100,200,100"),避免歧义
frame 标签加载页面时的路径和跨域限制
每个 frame 通过 src 加载独立 HTML 文件,但路径解析和安全策略比 iframe 更敏感。
-
src必须是完整相对路径或绝对 URL,比如src="nav.html"或src="/static/header.html";写成src="header"会 404 - 若子页面与主框架页跨协议(http ←→ https)、跨域(a.com ←→ b.com),浏览器会直接拒绝加载,并在控制台报
Refused to display 'xxx' in a frame because it set 'X-Frame-Options' to 'deny' -
frame不支持sandbox、loading="lazy"等现代属性,也无法用 JS 安全访问其他 frame 的 DOM(除非同源且显式开放document.domain)
替代方案比硬扛 frameset 更实际
除非你正在维护一个无法重构的老系统,否则真没必要碰 frameset。它的核心诉求——分区域独立加载、保持导航栏固定——早有更稳定、更可控的方式实现。
- 用
iframe替代:支持嵌入任意页面,能设宽高、边框、滚动条,还能通过postMessage跨域通信 - 用 CSS Grid / Flexbox 布局 + AJAX 动态加载内容:导航栏用固定定位或 sticky,主体区域用
<div id="content">,JS 控制内容替换,无跨域限制 - 单页应用(SPA)框架如 Vue Router、React Router:路由驱动视图切换,体验更顺滑,SEO 可配合 SSR 解决
真正难的不是写出 <frameset cols="200,*"><frame src="menu.html"><frame src="main.html"></frameset>,而是当某天 menu.html 改了路径、main.html 加了 CSP 头、或者用户用的是新版 Safari——你得花半小时查控制台里那一堆静默失败的 frame 加载日志。


















