cols和rows不能混用在同一中,因规范未定义该行为且旧浏览器解析不一致;正确方式是嵌套使用,如外层rows、内层cols。

HTML <frameset></frameset> 的 cols 属性已废弃,现代项目中不应使用;但若需维护旧系统,必须理解其行为逻辑和兼容性陷阱。
为什么 cols 不能和 rows 混用在同一个 <frameset></frameset>
浏览器(尤其是旧版 Netscape 和 IE)对同时指定 cols 和 rows 的 <frameset></frameset> 解析不一致,会导致布局错乱或完全不渲染。规范本身也未定义这种混合行为。
- 正确做法是嵌套:外层用
rows分上下,内层再用cols分左右 - 错误写法:
<frameset cols="200,*" rows="100,*"></frameset>—— 多数浏览器会忽略其中一个属性 - 嵌套示例中,
<frameset rows="15%,85%"></frameset>包裹一个<frameset cols="200,*"></frameset>才可靠
cols 值的三种写法及计算优先级
浏览器按“像素 → 百分比 → *”顺序分配空间,固定值先占位,剩余空间再按比例或星号规则分。
-
"100,200,*":前两列固定为 100px 和 200px,第三列占满余下宽度 -
"25%,*,*":第一列占窗口宽 25%,剩下 75% 平均分给后两列(各 37.5%) -
"1*,2*,3*"不合法 ——*前不能带数字;想实现权重分配得用"*,2*,3*"(即 1:2:3 占比) - 百分比总和 ≠ 100% 时,浏览器会自动归一化:如
"30%,40%,50%"实际按 25%:33%:42% 分配
动态修改 cols 时常见错误
通过 JS 修改 document.getElementById("main").cols 看似简单,但容易因 DOM 加载时机、框架命名或跨域限制失败。
- 确保 JS 在父窗口执行,且目标
<frameset></frameset>已存在并有id(如id="main") - 不能在子 frame 内直接访问
parent.document修改父级cols,除非同源;否则抛出SecurityError - 修改后不会触发重排动画,视觉上是瞬切;如需过渡效果,得用 CSS + iframe 替代方案
- IE8 及更早版本不支持通过 JS 动态设置
cols,只能刷新整个 frameset
替代 <frameset></frameset> 的现代方案
HTML5 明确废弃 <frameset></frameset>,所有新项目应改用 CSS Grid 或 Flexbox 实现类似分栏布局。
-
display: grid; grid-template-columns: 200px 1fr;可精确替代cols="200,*" - iframe 仍可用,但应作为内容容器嵌入普通页面,而非靠
<frameset></frameset>控制结构 - 若需保持 URL 独立性(类似传统 frame 导航),可结合
history.pushState+ 动态加载内容 - 遗留系统迁移时,注意
frame的name和target属性在现代 iframe 中仍有效,但不再依赖<frameset></frameset>
真正棘手的不是语法怎么写,而是当多个老框架嵌套、又混用 cols 和 rows 时,不同浏览器对“剩余空间”的解释差异会放大布局偏差——这种问题往往只在特定窗口尺寸下暴露,调试成本远高于重写为 Grid。











