cols属性用于定义frameset中列的数量和宽度,值按逗号分隔,从左到右依次分配,决定列数与布局流向;html5已废弃该标签。

cols 属性是唯一能按列划分 <frameset></frameset> 窗口的手段,但必须明确:HTML5 已彻底废弃 <frameset></frameset> 和 <frame>,现代项目中不应再使用。
为什么 cols 的值顺序直接决定列数和布局流向
浏览器按 cols 中逗号分隔的值个数生成对应数量的垂直列,从左到右依次分配。比如 cols="30%,200,*" 会强制产生三列:第一列占可用宽度 30%,第二列固定 200 像素,第三列吃掉剩余所有空间。
常见错误是误以为 * 可以写多次并自动均分——其实只有当所有值都是 *(如 "*,*,*")时才等宽;若混用,* 仅表示“余量”,不参与比例计算。
- 值为
"100,2*,*"时,实际是 100px + 剩余空间的 2/3 + 剩余空间的 1/3,不是 1:2:1 - 百分比值总和可以超过 100%,浏览器会按比例缩放全部列(例如
"60%,60%,60%"会被压缩成 1/3:1/3:1/3) - 像素值优先级最高,固定尺寸列不会随窗口缩放,容易导致横向滚动条出现
混合单位时的计算逻辑和兼容性陷阱
cols 允许在同一属性里混用像素、百分比和 *,但不同浏览器对“剩余空间”的初始扣除顺序不一致。Chrome 和 Firefox 通常先扣像素列,再按百分比切分剩余部分;旧版 IE 则可能先算百分比再处理像素,导致第三列异常窄甚至为 0。
实操建议始终避免三者混用。更稳妥的组合只有两种:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
"30%,70%"或"25%,25%,25%,25%":纯百分比,响应式友好,但需确保总和 ≤ 100%(超了会缩放) -
"200,*,*":一个固定列 + 两个均分余量列,适合侧边栏+主内容区场景
绝对不要写 "100px,50%,*" —— 这类写法在 Safari 16+ 中已触发警告,未来版本可能直接忽略 * 段。
嵌套 <frameset></frameset> 时 cols 的作用域限制
cols 只作用于其直接父 <frameset></frameset>,无法跨层级影响子框架集。例如外层 <frameset cols="30%,70%"></frameset> 包含一个子 <frameset rows="200,*"></frameset>,那么右侧 70% 区域内再分上下两行,与左侧 30% 的列宽完全无关。
容易踩的坑是误以为子框架能“继承”父级比例。实际上,子 <frameset></frameset> 的 rows 或 cols 始终基于它所在容器的当前尺寸重新计算,父级只提供画布,不传递比例规则。
如果需要保持多级比例联动(比如左侧导航栏固定 240px,右侧主区再分三等宽面板),必须在外层用 cols="240,*,*,*",而非嵌套三层 <frameset></frameset> —— 嵌套越多,各浏览器渲染偏差越大。
真正难处理的是当页面必须兼容遗留系统且无法替换为 <iframe></iframe> 或 CSS Grid 时:cols 的 * 不是 flex 的 flex: 1,没有最小宽度保护,窄屏下可能塌缩到几像素宽,且无法设置 min-width 或媒体查询干预。










