1. 分栏不是画格子,而是设计阅读路径
“页面设计、分栏”这六个字,听起来像是最基础的排版问题,但实际上大部分页面做不好看、信息堆在一起没人看,根子都出在分栏逻辑上。我见过不少项目,视觉规范、配色方案、组件库都准备得很整齐,一落到真实页面上就乱套,原因是分栏没有从内容本身出发,只是照着某个模板把页面切成了几块。分栏真正要解决的,不是“页面看起来规不规整”,而是“用户打开页面之后,视线按什么顺序走、注意力落在哪里、信息密度是否让人舒服”。
拿最常见的场景举例:一篇技术文章页、一个产品介绍页、一个后台数据看板,它们的分栏策略完全不同。技术文章需要阅读宽度足够克制,主内容栏太宽会导致视线换行疲劳;产品介绍页往往需要左文右图的交错分栏,让用户一边理解卖点一边看效果;后台看板则要处理多卡片网格,信息层级多,分栏要考虑可扩展性而不是死板的两等分。分栏一旦脱离了这些真实使用场景,就会变成“看起来很工整,用起来很别扭”的设计。
这篇文章适合谁看?如果你是前端开发、UI/UX 设计师,或者自己折腾博客、落地页、企业官网的开发者,我后面写的这些经验应该能直接用上。我不会只讲“怎么分栏”的样式代码,更多会拆解分栏背后的设计逻辑:为什么两栏比三栏适合阅读、什么时候用非对称分栏、响应式断点到底该怎么定、间距和分栏间距之间有哪些隐藏规则。这些都是实际操作中容易被忽略、但影响最大的细节。
分栏的另一个容易被低估的作用,是它直接决定了页面信息密度如何被感知。同样一段内容,塞进单栏全宽页面里,用户会觉得内容很长、读起来累;拆成合适的双栏或网格,信息反而显得轻盈、有条理。这里涉及视觉心理层面的“组块化”原理:人脑处理信息时,会先把视觉单元分组,分栏做得清晰,用户就能更快判断哪些内容是同一层级、哪些是辅助信息。分栏做乱了,就算文案写得再好,阅读节奏也会被打断。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分栏类型怎么选:从内容类型反推布局,而不是从模板套内容
2.1 对称分栏与非对称分栏的适用场景
页面设计中常见的分栏方式大体可以归为两类:对称分栏和非对称分栏。对称分栏指的是各栏宽度相等,最常见的如两栏 1:1、三栏 1:1:1、四栏 1:1:1:1。这类布局的优点是整齐、可预测、容易建立视觉秩序,适合信息之间没有明显主次关系的内容,比如功能点平铺、团队成员卡片、数据指标罗列。但 1:1 分栏有一个隐含问题:如果内容等级有差异,比如一栏是核心信息、另一栏只是辅助参考,均等分配宽度就会造成空间浪费,甚至让用户分不清重点。
非对称分栏指的是各栏宽度按比例拉开,比如 2:1、3:1、5:3 等。这是我在实际页面设计中使用频率最高的一类,因为它能同时兼顾“阅读主线”和“辅助信息区”。典型的场景是技术文档页:左侧或中间的主内容栏占 60% 到 70% 的宽度,侧边栏放目录、相关链接或操作按钮。这种分栏方式更贴近内容的真实权重,用户可以顺着主栏一路读下去,不需要频繁被旁栏信息打断。
我在带团队评审页面时,常问一个问题:“这个页面的第一动作是什么?”如果用户在页面上的核心任务是阅读一篇完整文章,那么主内容栏必须占据绝对主导,比如 12 栅格中占 8 到 9 栏,旁栏只占 3 到 4 栏。如果核心任务是快速比较多款产品,那么等宽多列反而更合适,因为用户要在同一视线层面横向扫视。内容决定动作,动作决定分栏,这个逻辑一定要反过来用,不能看到别人官网好看就照搬格子。
2.2 三栏布局什么时候用才不踩坑
三栏布局是另一个容易被误用的类型。经典的门户网站风格是“左中右”三栏,左边导航、中间主要内容、右边辅助信息。现在很多内容型产品依然沿用这种结构,但在响应式时代,三栏的维护成本和视觉负担都成倍增加。三栏放在桌面端宽屏上没问题,但在平板和手机端,三栏直接压缩会让中栏内容窄到无法阅读。
我的建议是,三栏布局只在以下两种情况使用:第一,左右两栏的内容都是真正的“高频辅助信息”,比如左栏是全局导航、右栏是在线客服或当前状态,缺了会让操作效率明显下降;第二,页面属于工具型界面,比如邮箱、项目管理看板,用户长时间停留,需要同时看到列表、详情和属性面板。对普通内容页面来说,两栏布局的可控性远高于三栏,文字阅读宽度更舒适,设计上也更容易做出层次。
如果必须做三栏,请一定给每一栏定义清楚“最小可用宽度”。以常见的 1440px 设计稿为例,中栏内容最小不得低于 600px,左右辅助栏各预留 200 到 260px 后,剩下的才分配给中栏。很多三栏页面出问题,不是布局原理错了,而是实施时没有约束栏目收缩的下限,导致浏览器窗口稍小一点,中栏文字就被挤得支离破碎。
3. 分栏系统的工程化思路:栅格、间距与容器
3.1 12 栅格依然是分栏的最佳起点
聊分栏绕不开栅格系统。栅格系统本质上是给分栏提供一套可复用的数学规则,让页面里所有分栏宽度都能对齐到同一个节奏上。12 栅格目前依然是主流,原因是 12 能被 1、2、3、4、6 整除,可以组合出 1/2 宽栏、1/3 宽栏、1/4 宽栏、2/3 宽栏等绝大多数常见比例,而不需要单独算百分比。相比 8 栅格或 16 栅格,12 栅格在使用上几乎不需要额外心算,团队协作时也更容易沟通:“这个卡片占 8 栏,侧边栏占 4 栏”这句话一说出来,前端就知道列宽关系了。
我在实际项目中很少直接写 grid-template-columns: 1fr 1fr; 这种散装分栏,而是先定义一套栅格变量,再基于栅格去给模块定位。这样做的好处是页面跨模块时,栏与栏之间能保持对齐关系。举个例子,首页第一屏的图文介绍模块用 8+4 布局,下方数据指标模块用 4+4+4 布局,虽然分栏数量和比例不同,因为都落在同一套 12 栅格上,视觉上会自然形成统一的纵向节奏。
栅格设计要回答的另一个关键问题,是页面容器最大宽度定多少。目前主流内容类网站多将容器宽度控制在 1200px 到 1440px 之间。容器太窄,在宽屏显示器上会两侧留白过多;容器太宽,内容栏内的文字行宽会超过 80 到 100 字符,引发阅读疲劳。我的习惯是:内容型页面容器 1200px,主内容栏撑到 8 栏,配合合适字号,行宽大约在 680px 到 760px 之间,这是中文阅读比较舒适的区间;后台管理类页面可以用 1440px 容器,因为这类页面信息密度高、控件多,用户不是逐行阅读,而是快速扫描和操作。
3.2 分栏间距:留白越多,页面越高级
间距是分栏设计中成本最低但收益最高的环节,却常常被忽视。很多页面分栏后仍然显得拥堵,问题不一定是栏宽不对,而是栏与栏之间的间距不够。分栏间距不只是一个数字,它有双重作用:物理上隔开不同内容区块,视觉上建立信息分组的关系。间距太小,用户分不清是两栏还是同一栏里的断裂;间距太大,又容易让内容显得松散、缺少关联。
通常我采用栅格结合间距变量来约束分栏。以 8px 为基准的间距体系为例,模块内间距用 8px 或 16px,分栏之间的间距至少用 24px,跨模块的内容区块间距用 32px 到 48px。栏间距建议不小于 24px,特别是在双栏布局中,如果两栏之间的距离只有 12px,用户视觉上会倾向于把两栏内容当成一大块连续阅读,原本要表达的并行关系就丢失了。
另一个容易被忽略的间距细节是分栏容器与屏幕边距之间的关系。固定容器在宽屏上会两侧留白,分栏内部无论多整齐,如果容器外的留白没有纳入整体考虑,页面还是会出现一侧偏重的问题。我习惯在容器外保留至少与栏间距一致的侧边留白值,并且对容器内第一个元素和最后一个元素单独检查,避免因为 padding 不一致导致栅格视觉错位。
3.3 响应式分段:分栏数量应该随着屏幕宽度变化而重组
分栏设计如果不考虑响应式,项目上线后在手机上一打开,之前精心计算的比例就会全线崩溃。我见过最典型的案例是一个四栏产品特性区域,桌面端整齐好看,到了手机端依然硬撑四列,每个特性卡片里的图标和文字全部缩成一团,用户必须放大才能看清。问题出在没有设置响应式断点,也没有定义分栏在窄屏下的重组规则。
分栏的响应式原则可以概括成一句话:屏幕越窄,分栏数越少。这并不是死板的“栏目全部变单栏”,而是根据内容语义决定如何折叠。以常见的双栏图文模块为例,桌面端是左图右文,平板端可以保持左右结构但压缩两边栏宽,手机端则应该改为上图下文,让阅读顺序从并列变成纵向。这里要注意的是 DOM 顺序:如果桌面端图文并排,手机端换成上图下文,前端代码里的 DOM 就应该保持“先图后文”,否则用纯 CSS 调 order 属性也能解决,但会增加样式维护成本。
断点应该根据内容设计,而不是跟随设备列表。很多人照着 768px、1024px 这些固定宽度来切,但实际分栏能否变更,取决于内容和栏宽临界点。我会先在浏览器里拉窄视口观察:中栏文字何时开始变得难读,侧边栏何时挤压到不满足最小宽度,那个临界值就是真正需要写断点的地方。一般我会设置三个主要断点:大屏桌面端、平板竖屏或小型笔记本、手机横竖屏,分别调整分栏组合。
4. 代码落地:用 CSS Grid 和 Flexbox 搭出真正稳定的分栏
4.1 全局结构与容器定义
这部分聊聊落地实现。分栏设计理论说得再清楚,代码一旦没有结构化的思路,照样会出现边距错乱、断点失效的问题。我最初做页面布局时习惯用浮动和 Flexbox 拼凑,列多了以后代码里全是 margin-right: 2% 之类的修补样式,项目后期根本不敢改动。后来全面切换到 CSS Grid,分栏的实现复杂度明显降下来。
先拿一个有代表性的双栏页面举例,整体结构包括页头、主区、页脚,主区内又有主内容栏和侧边栏,我把容器设置为:
css复制.page-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.main-area {
display: grid;
grid-template-columns: minmax(0, 1fr) 320px;
gap: 32px;
}
@media (max-width: 900px) {
.main-area {
grid-template-columns: 1fr;
gap: 24px;
}
}
这里的 minmax(0, 1fr) 是很多人容易漏掉的关键细节。直接用 1fr 的情况下,如果主内容栏里放了一个宽表格或长 URL,网格项可能会把最小内容宽度撑大,导致真正分配时主栏并不是预期的弹性大小,甚至超出容器。包上 minmax(0, 1fr) 之后,网格项允许被压缩到 0 再分配剩余空间,就不会出现内容溢出容器的问题。
侧边栏我固定为 320px,是因为目录、相关文章、广告位这类信息有一个稳定的合理宽度就够,不需要跟着容器比例伸缩。同时我要求侧边栏内容本身也做窄版设计,避免里面放了一张 600px 宽的运营图导致侧边栏变形。分栏布局的稳定性,往往取决于最窄一栏是否被认真对待。
4.2 复杂内容区域的 12 栅格封装
主内容区内部也可能出现多区块分栏。比如文章详情页的几个相关阅读模块,我想让它在宽屏下显示三列推荐卡片,而不是简单把主栏再切成两半,这时候直接在主内容栏里用栅格子级:
css复制.related-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
}
.related-item {
grid-column: span 4;
}
@media (max-width: 900px) {
.related-item {
grid-column: span 6;
}
}
@media (max-width: 600px) {
.related-item {
grid-column: span 12;
}
}
这套 12 栅格子系统的思路是:不直接写 repeat(3, 1fr),而是保留栅格的灵活性。比如某篇文档中,除了三个推荐卡片,还想插入一条宽一点的引导横幅,横幅占 span 8,剩余一个小卡片占 span 4,依然可以按同一套栅格对齐。前期多写几行代码,后续调整布局时不需要推翻重来。
有些项目已经把这种栅格封装成了组件类,比如 .col-4、.col-8,但我个人不建议在业务代码里到处使用语义不清的栅格类名。分栏类名写进 HTML 后,如果视觉权重调整,就必须改 HTML,而不是只改 CSS,最终很容易出现样式覆盖写和冗余代码。我更喜欢把栅格定义封装在模块内部,每个模块自己声明它的分栏行为,模块之间不共享一个全局的 .row 容器,这样重构时风险更小。
注意:两个常见的布局误区必须提醒一下。一是不要把所有分栏都做成“屏幕上永远可见”,有时候当前模块的作用只是临时引导,侧边栏在页面滚动到中后段后可以通过固定定位保留,也可以收纳成抽屉,需要根据实际使用频率决定。二是如果页面里有多层嵌套的 grid,一定注意给内层网格项设置
min-width: 0,否则浏览器默认的min-width: auto很容易让长内容把弹性布局撑坏。
5. 常见问题与排查技巧实录
5.1 分栏总是被内部内容撑破,怎么办
这是我在代码评审中遇到最多的问题。分栏容器明明写好了宽度,一旦里面放一张大图、一长串链接或者一个 pre 代码块,布局立刻就横向溢出。排查的起点在浏览器开发者工具里检查元素:选中溢出容器,查看它的计算宽度是否超过了父级。如果容器宽度等于父级宽度但内容仍溢出,说明内部元素的最小内容宽度大于容器宽度。
解决方案要从内容本身入手:给图片和代码块加 max-width: 100%,给长单词或长链接加 overflow-wrap: break-word。在 flex 或 grid 布局中,还要给子项加 min-width: 0。做完这三步,90% 的横向溢出问题都能解决。剩下 10% 是绝对定位或表格布局造成的,需要单独处理,比如检查是否有 white-space: nowrap 的文本。
5.2 断点一多,分栏状态混乱,有没有系统排查法
响应式断点数量一多,页面在中间尺寸视口下容易出现“既不是桌面版也不是手机版”的尴尬状态。比如 @media (max-width: 900px) 把双栏改成单栏,但平板横屏宽度是 1024px,依然走双栏布局,主栏却因为容器压缩变得很窄。这时候要检查,断点设置是不是只考虑了设备类型,而不是内容是否真的需要换布局。
一个有效的排查方法:用浏览器设备工具栏从 320px 逐步拉宽到 1440px,每增加 100px 停一次,观察分栏在哪两个宽度之间开始变难用,找到那个临界值后回头调整断点。特别注意 700px 到 1000px 之间的“灰色地带”,这是最容易出现分栏拥挤问题的区间。我的双栏页面在这个区间内会额外加一个断点,让侧边栏缩小宽度并且置底,保证主内容栏始终维持阅读舒适度。
5.3 分栏对不齐,视觉上总觉得乱
有些页面用栅格实现了分栏,但截图发给别人,对方觉得每个模块本身没问题,整体排在一起却“错位感”很强。这个问题的根源通常不在分栏本身,而在于各模块的高度和内部间距不一致。右侧栏某个卡片多了 10px 的内边距,或者某个模块标题行高和别处不同,横向看过去就会感觉到断档。
想要根治,需要建立统一的纵向间距规范。我在项目里会维护一组间距变量,比如间距为 4px、8px、16px、24px、32px、48px、64px 的命名变量,组件内和模块内都用这套变量来设定 margin 和 padding。模块标题的行高、字号、上下间距也要全局统一。分栏能对齐,不只是列宽的问题,还取决于模块内部的“呼吸感”是否遵循同一套规则。很多看起来高端的页面,仔细测量其实是严格遵守横向与纵向网格对齐的。
提示:遇到分栏视觉没对齐时,不要抬手就去调宽度。先在浏览器里拉一条参考线,分别量一下左右栏内容区的起止位置、标题基线、卡片内边距,找出到底是列宽问题、内边距问题还是行高问题。大多数情况下,微调内边距比改列宽更有效。
6. 对分栏设计的一些总结和建议
最后分享一点个人经验。刚开始做页面设计时,我也热衷于给页面堆各种复杂的分栏,以为信息越丰富就越要分得细。后来做了大量用户测试才发现,分栏的真正价值在于帮助用户减少判断成本。分栏越复杂,用户理解页面结构的负担就越大,反而让内容变得不容易接近。
所以我现在做任何页面的分栏,都会先问三个问题:用户来这里要完成的第一个任务是什么?这个任务需要哪些信息同时出现在同一个视野里?剩下那些不需要立即看到的信息能不能收进第二层级?把这三个问题想清楚之后,页面究竟采用单栏、双栏还是三栏,基本上就有答案了。
以最常见的文章页为例,我最后落地时往往会选择“窄主栏 + 轻侧边栏”的非对称结构,主栏容纳连贯阅读,侧边栏承担导航和上下文信息,手机端整个侧边栏收起成按钮和快捷入口。这种方案不惊艳,但在各种屏幕上都稳定、耐看,也更符合阅读习惯。分栏设计做久了会发现,真正成熟的设计不需要靠猎奇去吸引用户,把最常见的场景做顺手,让内容在合适的视觉范围内自然流淌,体验就到位了。
若你现在正为一个页面分栏发愁,我建议别急着打开设计软件画线框,先把你手头的内容按“主线阅读、辅助决策、附加信息”分成三类,再为每一类定权重,最后让分栏结构去迁就这些权重。等这套逻辑理顺了,你心里会很清楚每一栏为什么存在、为什么是这个宽度,而不是随手拖动参考线做出来的“看起来还可以”。这是分栏设计从新手走向熟练的关键一步。
