frameset 标签已被 html5 废弃,仅用于兼容旧代码;rows 和 cols 不可混用,需嵌套实现复合布局;空间分配优先处理固定值,再分配星号项;现代开发应使用 css grid、flexbox 或 iframe。

frameset 标签早已被 HTML5 废弃,现代浏览器虽仍能解析,但不保证行为一致,且无法通过 W3C 验证。如果你正在维护老项目或调试遗留代码,必须清楚:这不是布局方案,而是兼容性包袱。
rows 和 cols 属性不能混用在同一个 frameset 中
同一个 frameset 元素只能指定 rows(横向切分,即分“行”)或 cols(纵向切分,即分“列”),不能同时写两者。浏览器会忽略其中一个,行为不可控。
-
rows="200,*,300":合法,定义三行,高度分别为 200px、剩余空间、300px -
cols="25%,*,200":合法,定义三列,宽度分别为 25%、剩余空间、200px -
<frameset rows="100" cols="200"></frameset>:非法,cols将被忽略或引发解析异常
要实现“上 + 下左 + 下右”这类复合结构,必须嵌套:frameset 套 frameset,外层用 rows,内层用 cols(或反之)。
百分比、像素、星号(*)的计算逻辑容易误判
rows 和 cols 的值列表中,各数值是按顺序分配空间的,但不是简单相加后等比缩放——浏览器会先处理固定值(如 200 或 200px),再把剩余空间按比例或星号数量分配给 * 项。
-
cols="30%,200,*":先扣掉 200px 宽度,再把剩余宽度的 30% 分给第一列,余下部分全给*列(注意:这里30%是相对于整个窗口宽度,不是剩余宽度) -
cols="*,*,*":三列均分剩余宽度(不是整个窗口,因可能有固定像素列) -
cols="100,200,*":前两列固定为 100px 和 200px,第三列占满剩下所有宽度
实际渲染时,若总和超过 100% 或含多个 *,浏览器会动态压缩/拉伸,结果常与直觉不符,尤其在小屏或 resize 时。
嵌套 frameset 时,frame 的 src 加载时机与命名依赖易出错
嵌套结构中,每个 frame 的 src 是独立加载的,但它们共享父 frameset 的上下文。常见问题包括:
- 未设置
name属性的frame,无法被<a target="xxx"></a>正确指向 -
target="_top"或target="_parent"在多层嵌套中行为混乱,不同浏览器处理不一致 - 父 frameset 未设
border="0"或frameborder="0",会导致多余边框线叠加,视觉错乱 -
noresize="noresize"必须写完整字符串,写成noresize="true"或noresize(无值)在部分旧浏览器中无效
更隐蔽的问题是:若某 frame 的 src 返回 404 或跨域拒绝,整个 frameset 渲染可能中断,且错误不会抛到控制台,只静默失败。
真正需要分割视图的场景,请直接用 CSS Grid 或 Flexbox;若必须嵌入外部页面,iframe 是唯一现代可行路径。frameset 的所有“灵活”都建立在牺牲可访问性、SEO、移动端适配和调试能力之上——它不是被替代的方案,而是该被遗忘的语法。











