首页

栅格与布局

布局处理内容在页面里的位置关系。它决定导航放在哪里,正文多宽,按钮离表单多远,屏幕变窄后哪些内容先换行或收起。

栅格是布局的参考线,响应式是布局对不同屏幕的调整方式,前端布局工程则把这些规则落到浏览器里。三者放在一起看,才能解释一个页面为什么稳定,或者为什么一缩小就乱。

1. 布局基础与空间关系 (Layout Basics & Spatial Relationships)

Layout (布局)

Layout 处理界面元素放在哪里。导航、正文、侧边栏、按钮和底部信息区,都需要在屏幕上找到稳定的位置。

Composition (构图)

Composition 处理这些元素放在一起后的画面关系。它关心视线先落在哪里,哪个区域更重,哪些内容应该退到后面。布局更像搭结构,构图更像调画面的重心。

╭──────────────────────────────────────────╮
│ 󰛼 Header 顶部导航                        │
├──────────┬────────────────────┬──────────┤
│   NavMain Content  Aside │
│          │                    │          │
│ 次级入口 │ 标题 / 数据 / 操作 │ 补充信息 │
│          │                    │          │
├──────────┴────────────────────┴──────────┤
│ 󰛻 Footer 底部信息                        │
╰──────────────────────────────────────────╯

Visual Hierarchy (视觉层级)

视觉层级用尺寸、字重、颜色对比和留白拉开信息优先级。标题、价格、按钮、说明文字不能都一样重。

Reading Flow (阅读路径)

阅读路径是用户视线在页面上移动的顺序。Z 型或 F 型扫描可以参考,但真实页面还要看内容和任务。

 没有层级 Flat Hierarchy
╭────────────────────────╮
│ Apple iPhone 15 Pro    │
│ 钛金属机身,A17 Pro    │
│ 价格:$999 起          │
│ 了解更多信息请点击     │
│ [ 立即购买 ]           │
╰────────────────────────╯
 同等重量,重点被淹没

 良好层级 Clear Hierarchy
╭────────────────────────╮
│       _            _   │
│   /_  _/_  _   /_  _/  │
│  / /._// ///_// /._/   │
│            _/          │
│ Apple iPhone 15 Pro    │
│ 钛金属机身,A17 Pro    │
│ 价格:$999 起          │
│ 少量说明退到后面       │
│   立即购买             │
╰────────────────────────╯
 尺寸、色彩、留白拉开顺序

Alignment (对齐)

对齐让分散的元素沿同一条参考线排列。即使没有画出边框,文本、按钮和卡片边缘也会形成隐形轴线。轴线稳定,页面就不会显得东倒西歪。见 文本对齐

Proximity (邻近)

邻近关系用距离表达内容之间的关系。靠得近的元素会被看成一组,距离拉开以后,用户会自然把它们当成不同模块。

Grouping (分组)

分组不一定要靠分割线完成。表单字段、设置项和列表信息,很多时候只要调整间距就能变清楚。

邻近分组

Whitespace (留白)

留白是内容之间没有被占用的空间,包括内边距、外边距和区块之间的空隙。留白不足时,页面会堵,用户很难判断哪些内容属于一组;留白过多时,相关信息又会被拉散。

留白


2. 栅格系统 (Grid Systems)

Grid (栅格)

Grid 是由行、栏、槽距和页面边距组成的参考线系统。这些线通常不直接显示在页面上,却会支撑内容对齐。12 栏栅格在 Web 中很常见,因为它容易拆成 2、3、4、6 等不同分栏。

Container (页面容器)

Container 是承载页面主要内容的外层区域。它通常会设置 max-width,再在视口中居中。没有容器限制时,正文在宽屏上会被拉得太长,读一行要扫很远。

Margin (页面外边距)

Margin 是容器边缘到浏览器边缘之间的空白。它给内容和屏幕边缘留出缓冲。手机上如果没有这层空白,文字和按钮会贴着屏幕边缘,看起来很紧。

Row (行)

Row 是水平方向上的布局带。它把多个内容块放在同一层,方便控制垂直节奏。比如一行里放三张指标卡,下一行再放图表。

Column (栏)

Column 是垂直方向的分栏基准,也常缩写成 Col。内容可以占一栏,也可以跨多栏。栏太窄,卡片内容会挤;栏太宽,列表和正文又会变得松散。

Gutter (槽距)

Gutter 是相邻栏或行之间的空白。它把内容隔开,避免相邻信息粘在一起。槽距太小,卡片会像挤在一起;槽距太大,页面会显得散。

Module (模块)

Module 是落在栅格里的实际内容块。一个模块可以占一栏,也可以跨多栏。商品卡片、统计卡片、图表区都可以看成模块。

┌─ Viewport (浏览器视口) ────────────────────────┐
│                                                │
│ Margin ╭─ Container (页面容器) ───────╮ Margin │
│ <────>   <────> │
│  外边   Row 1 (行)               外边  │
│  █████░░█████░░█████░░█████  │
│         █████░░█████░░█████░░█████  │        │
│          Col  Col    Col    Col   │        │
│        Gutter (槽距)        │
│        ├──────────────────────────────┤        │
│         Row 2                              │
│         ████████████░░████████████        │
│         ████████████░░████████████        │
│         Module(模块)  Module(模块)        │
│        ╰──────────────────────────────╯        │
└────────────────────────────────────────────────┘

Baseline Grid (基线网格)

Baseline Grid 是纵向排版的参考线,类似书写本里的横格。它让文本行高、段落间距和组件高度更容易落在同一套节奏上。多列内容并排时,基线网格能减少“这一列高一点、那一列低一点”的错位感。

参见 基线基线节奏

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈Baseline
 大标题      ╭─ 󰏘 Image Card ───────╮
┈┈┈┈┈┈┈┈┈┈┈┈┈│   /  .\              │┈┈
 副标题      │  /  =__|     __v_    │
┈┈┈┈┈┈┈┈┈┈┈┈┈│ /    ||     (____\/{ │┈┈
 正文文本    ╰──────────────────────╯
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
 [ 了解更多 ]
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
文本和组件更容易落在同一套垂直节奏上

Modular Grid (模块化栅格)

Modular Grid 在栏的基础上加入行,形成横纵都有约束的网格矩阵。控制台、商品卡片矩阵和杂志式页面常用它,因为这些页面需要反复比较同一类信息。

         第1栏     第2栏     第3栏     第4栏
       ╭─────────┬─────────┬─────────┬─────────╮
第1行  │ 指标订单图表图表    │
       ├─────────┼─────────┼─────────┼─────────┤
第2行  │ 指标订单图表图表    │
       ├─────────┼─────────┴─────────┼─────────┤
第3行  │ 筛选横跨模块列表    │
       ╰─────────┴───────────────────┴─────────╯
同类内容反复落在固定行列里,模块也可以跨栏或跨行

3. 页面布局模式 (Layout Patterns)

Single-column (单栏)

把内容收在一个居中的窄列里。文章、说明页和文档正文通常用单栏,因为读者需要从上到下连续阅读。

一侧放导航或筛选项,另一侧放主要内容。后台、文档和设置页常用这种结构,因为用户需要一边切换项目,一边查看内容。

Split (分栏)

把屏幕分成两个主要区域。登录页可以一边放品牌图,一边放表单;对比页可以左右放两个对象。

Multi-column (多栏)

在水平方向划出多列,并排展示同级内容。索引页、资源列表和分类入口可以用多栏,让用户快速扫过更多项目。

1. 单栏布局 (Single-column)  2. 侧边栏布局 (Sidebar)
╭─────────────────────────╮  ╭───────┬─────────────────╮
│                         │  │       │                 │
│   主体内容              │  │侧边栏 │  主体内容       │
│   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈   │  │sidebar│  ┈┈┈┈┈┈┈┈┈┈┈┈   │
│   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈   │  │       │  ┈┈┈┈┈┈┈┈┈┈┈┈   │
│                         │  │       │                 │
╰─────────────────────────╯  ╰───────┴─────────────────╯

3. 分栏/对半 (Split Layout)  4. 多栏/平铺 (Multi-column)
╭────────────┬────────────╮  ╭─────┬──────┬──────┬─────╮
│            │            │  │     │      │      │     │
│  左侧内容  │  右侧内容  │  │ 列1 │  列2 │ 列3  │ 列4 │
│  ┈┈┈┈┈┈┈┈  │  ┈┈┈┈┈┈┈┈  │  │ ┈┈┈ │  ┈┈┈ │ ┈┈┈  │ ┈┈┈ │
│  ┈┈┈┈┈┈┈┈  │  ┈┈┈┈┈┈┈┈  │  │ ┈┈┈ │  ┈┈┈ │ ┈┈┈  │ ┈┈┈ │
│            │            │  │     │      │      │     │
╰────────────┴────────────╯  ╰─────┴──────┴──────┴─────╯

Card Grid (卡片网格)

Card Grid 把信息封装在独立卡片里,再按矩阵排列。商品、视频缩略图和模板列表常用这种方式。卡片边界清楚,用户更容易扫视和比较。

Masonry (瀑布流)

Masonry 的列宽固定,卡片高度不同,内容会交错向下排列。图片流和 UGC 内容可以这样排,因为每个项目高度不一样。需要严格比较价格、状态或指标的列表,不适合瀑布流。

Dashboard (仪表盘)

Dashboard 由图表、指标卡片、列表和筛选器组成。它把多个维度放在同一屏里,方便用户监控和比较。仪表盘的难点在于取舍:屏幕可以很满,但最重要的指标必须先被看到。

Master-detail (主从布局)

Master-detail 把列表和详情放在同一屏。用户在左侧选择项目,右侧显示详情。邮件客户端、设置页和管理后台都常见,适合频繁切换项目的任务。

 1. 卡片网格 (Card Grid)    2. 瀑布流 (Masonry)
╭────────────────────────╮ ╭────────────────────────╮
│╭──────╮╭──────╮╭──────╮│ │╭──────╮╭──────╮╭──────╮│
││ ┈┈┈┈ ││ ┈┈┈┈ ││ ┈┈┈┈ ││ ││ ┈┈┈┈ ││ ┈┈┈┈ ││ ┈┈┈┈ ││
││ ┈┈┈┈ ││ ┈┈┈┈ ││ ┈┈┈┈ ││ │╰──────╯│ ┈┈┈┈ ││ ┈┈┈┈ ││
│╰──────╯╰──────╯╰──────╯│ │╭──────╮╰──────╯│ ┈┈┈┈ ││
│╭──────╮╭──────╮╭──────╮│ ││ ┈┈┈┈ │╭──────╮│ ┈┈┈┈ ││
││ ┈┈┈┈ ││ ┈┈┈┈ ││ ┈┈┈┈ ││ ││ ┈┈┈┈ ││ ┈┈┈┈ │╰──────╯│
││ ┈┈┈┈ ││ ┈┈┈┈ ││ ┈┈┈┈ ││ │╰──────╯│ ┈┈┈┈ │╭──────╮│
│╰──────╯╰──────╯╰──────╯│ │╭──────╮│ ┈┈┈┈ ││ ┈┈┈┈ ││
╰────────────────────────╯ ╰────────────────────────╯

 3. 仪表盘 (Dashboard)      4. 主从布局 (Master-detail)
╭────────────────────────╮ ╭────────────────────────╮
│╭────╮╭────╮ ╭─────────╮│ │󰇯 ┈┈┈ │ 󰇯 ┈┈ 详情       │
││ 89 ││ 12 │ │ ┈┈┈┈┈┈┈ ││ │      │                 │
│╰────╯╰────╯ ╰─────────╯│ │󰇮 ┈┈┈ │                 │
│╭───────────╮╭─────────╮│ │      │ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ │
││   ╭─╮     ││ 󰄬 ┈┈┈   ││ │󰇮 ┈┈┈ │ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ │
││ ╭─╯ ╰──╮  ││ 󰄬 ┈┈┈   ││ │      │ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ │
││─╯      ╰──││ 󰄱 ┈┈┈   ││ │󰇮 ┈┈┈ │ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ │
│╰───────────╯╰─────────╯│ │      │                 │
╰────────────────────────╯ ╰────────────────────────╯

4. 响应式布局策略 (Responsive Layout Strategy)

Breakpoint (断点)

Breakpoint 是布局规则发生变化的宽度位置,通常基于视口宽度。到达某个断点后,页面可能从单栏变成多栏,也可能显示侧边栏或增加页面留白。断点应该跟内容什么时候撑不住有关,不能只照搬设备尺寸。

       < 640px ≥ 640px  ≥ 768px  ≥ 1024px ≥ 1280px
设备:   手机   大屏    平板    桌面    宽屏
标识:  xs      sm       md       lg       xl
布局:  单栏    双栏紧凑 三栏网格 侧边栏   两侧留白
宽度: ─────────┬────────┬────────┬────────┬────────>

Responsive Design (响应式布局)

响应式布局会随着可用空间连续调整。容器变窄时,元素先压缩或换行;空间不足时,再通过断点切换成小屏结构。理想状态下,页面会一步步收紧,而不是突然坏掉。

Adaptive Design (适配式布局)

适配式布局会为几个宽度准备不同版型。宽度变化时,页面不一定连续缩放;跨过断点后,它会切换到另一套布局。它更像准备几套固定方案。

Fixed (固定)

固定布局使用明确尺寸,例如 width: 300px。小图标、头像、固定宽度按钮可以这样做。长文本、表格和窄屏页面如果大量固定尺寸,很容易溢出。

Fluid (流体)

流体布局让元素跟随父容器变化,例如 width: 100%flex: 1。它能吃满可用空间,但也需要最大、最小宽度约束。不设上限,正文会太长;不设下限,卡片会被挤坏。

Intrinsic (内在布局)

内在布局让内容参与决定尺寸,例如 max-contentmin-contentfit-content。标签、按钮和菜单项的文字长度不稳定时,这类尺寸很有用。它能避免短内容占太大,也能让长内容有边界。

Viewport (视口)

Viewport 是浏览器或设备当前可见的页面区域。断点、vw / vh 这类视口单位,以及首屏能看到多少内容,都以它为参考。

做响应式布局时,Viewport 通常决定页面级结构什么时候变化。手机上收起侧边栏,桌面上展开多列内容,就是典型例子。

Container Query (容器查询)

Container Query 让组件根据自己所在容器的尺寸变化,而不是只看整个屏幕宽度。同一个卡片可能出现在宽主栏,也可能出现在窄侧栏。只看视口宽度时,它很难知道自己实际还有多少空间。

容器够宽时,组件可以显示更多字段;容器变窄时,就收起次要内容。这比全局断点更贴近组件自己的处境。

Safe Area (安全区域)

Safe Area 是移动设备边缘里适合放置内容的安全范围。刘海、圆角屏幕和底部系统手势条都会占掉一部分边缘空间。

移动端的固定底栏、返回按钮和全屏图片如果贴得太靠边,可能会被硬件遮挡,或者和系统手势冲突。Safe Area 给这些边缘内容留出避让空间。

╭─────────────────╮
│      ━━━━      │避让区-----------------│
│                 │
│                 │
│                 │
│    Safe Area    │
│    安全区域     │
│                 │
│                 │
│                 │
│                 │
│                 │
│-----------------│
│       ( )       │手势区
╰─────────────────╯

5. 前端布局工程 (Front-end Layout Engineering)

Normal Flow (文档流)

Normal Flow 是浏览器默认的排版方式。没有用 positionfloatflexgrid 改变布局时,元素会按照 HTML 顺序进入页面。

块级元素通常从上到下排列,行内内容在一行里从左到右流动,空间不足时自动换行。先理解文档流,才能判断元素为什么出现在当前位置,也能少用定位去硬修布局。

Box Model (盒模型)

Box Model 描述一个元素在页面上占据空间的方式。每个盒子由内容区、内边距、边框和外边距组成,对应 contentpaddingbordermargin

内容区放文本或图片,内边距拉开内容和边框,边框形成盒子的边界,外边距负责和其他元素保持间隔。布局出问题时,先看盒子的实际尺寸,别只看 widthheight

Margin
 ╭Border───────╮
 │Padding      │
 │ ╭─────────╮ │
 │  Content  │
 │ ╰─────────╯ │
 │             │
 ╰─────────────╯

Display (显示类型)

Display 决定元素以什么身份参与页面排版。block 会独占一行,inline 会跟随文字流动,inline-block 能排在一行里,也可以设置宽高。

display 还可以创建新的布局上下文,例如 flexgrid。所以它既影响元素自己怎么排,也影响子元素怎么排。

display: block         display: inline
独占一行               跟随文字流
╭──────────────────╮   ╭──────────────────╮
│ A                │   │ 正文 A B C       │
│ B                │   │ 自动换行         │
│ C                │   │                  │
╰──────────────────╯   ╰──────────────────╯

display: inline-block  display: none
行内盒子               不显示,不占位
╭──────────────────╮   ╭──────────────────╮
│ 正文 [A][B][C]   │   │ A                │
│ 仍在同一行       │   │ C                │
│ 可设宽高         │   │                  │
╰──────────────────╯   ╰──────────────────╯

Flexbox (弹性布局)

Flexbox 是一维布局模型,主要处理一条轴线上的排列、分布和对齐。它可以让一组元素沿主轴排成一行或一列,再用交叉轴控制另一方向的对齐。

导航栏、按钮组、工具栏、表单行和卡片内部的图文结构都很适合 Flexbox。它不负责画完整网格,更擅长处理一排或一列项目在空间变化时怎么分布。

CSS Grid (CSS 栅格布局)

CSS Grid 是二维布局模型,可以同时控制行和列。页面骨架、卡片矩阵、仪表盘和表单分区都适合用它。

和设计里的栅格系统相比,CSS Grid 更偏工程实现。它可以把容器切成横向和纵向轨道,让元素占据指定区域,也可以跨越多行或多列。

Modular Grid 更像设计稿里的参考网格,用来规划视觉节奏和内容对齐;CSS Grid 是浏览器里的布局规则,决定元素占据哪些行、列和区域。

       列 1   列 2   列 3   列 4
      ╭──────┬──────┬──────┬──────╮
行 1 A   A   B   C   │
      ├──────┼──────┼──────┼──────┤
行 2 D   E   E   C   │
      ├──────┼──────┼──────┼──────┤
行 3 D   F   F   F   │
      ╰──────┴──────┴──────┴──────╯

Positioning (定位)

Positioning 决定元素如何确定自己的位置。默认的 static 跟随文档流;relative 保留原本空间,再相对自身偏移;absolute 脱离文档流,相对最近的定位祖先放置。

fixed 相对视口固定,常见于悬浮按钮、固定导航和底部操作栏;sticky 会先跟随文档流滚动,到达阈值后吸附在指定位置。定位适合处理覆盖和固定区域,不适合替代常规布局。

Z-index (层级)

Z-index 控制重叠元素在视觉上的前后顺序。数值更大的元素通常显示在更上层,但它只在特定层叠环境中比较,不能直接理解成整个页面的全局优先级。

使用 z-index 时,层级数量要克制。导航、浮层、弹窗、提示最好有固定约定。否则页面做久了,很容易出现 9999 这类局部修补。

z-index:数值越大,越靠上
      ╭ z=1 ──────╮
   ╭ z=10 ─────╮  
╭ z=99 ─────╮    
│           │    
╰───────────╯    
   ╰───────────╯  
      ╰───────────╯

Stacking Context (层叠上下文)

Stacking Context 是一组元素内部自己的叠放环境。一个元素创建新的层叠上下文后,子元素会先在内部排序,然后整个上下文再作为一个整体参与外部叠放。

这也是很多层级问题难排查的原因:子元素的 z-index 再高,也可能只能在父级上下文内部生效。常见触发条件包括定位配合 z-indexopacity 小于 1、transformfilterisolation 等。

父级会先作为一个整体参与外部排序

    ╭ Context B z=1 ───╮
    │       z=2 ─────╮│
    │    z=20 ────╮  │
    │ z=999 ───╮    │
    │            ──╯│
    │ ╭ Context A z=2 ────╮
    │╰─ z=1 ─────╮│
    ╰──│     z=10 ────╮  │
       │  z=99 ────╮    │
       │             ──╯│
       │           ──╯   │
       │ ╰──────────╯      │
       ╰───────────────────╯

Overflow (溢出)

Overflow 描述内容超出盒子边界时怎么处理。默认情况下,内容可能继续显示在盒子外;也可以用 overflow: hiddenoverflow: clip 截断,或者用 auto / scroll 提供滚动。

固定高度区域、长文本、图片、表格和横向列表都容易溢出。处理前先判断:内容应该换行,容器应该变大,还是确实需要裁切或滚动。

Scroll Container (滚动容器)

Scroll Container 是能够承载滚动的容器。一个元素设置了会产生滚动机制的 overflow 后,就可能成为内部内容的滚动边界。

滚动容器会影响吸顶元素、滚动阴影、内部列表、固定表头和弹层定位。很多滚动问题来自内部容器,不一定是页面本身在滚。