CSS Flexbox 生成器

通过图形界面调整 flex-direction、justify-content、align-items、flex-wrap 和 gap,一边查看实时预览一边试验 Flexbox 布局的免费工具。生成的 CSS 代码可一键复制。

边动手边搭 Flexbox 布局

Flexbox 是沿着一条轴线排布元素的布局之法。本工具让您在画面上切换 `flex-direction`、`justify-content`、`align-items`、`flex-wrap` 与 `gap`,边改边看结果,并把写成的 CSS 直接复制出去。

**在 Flexbox 上栽跟头,几乎都栽在「`justify-content` 与 `align-items` 各朝哪个方向使劲」这一点上。** 前者管**主轴**上的排布,后者管**交叉轴**上的排布。棘手之处在于:**`flex-direction` 由 `row` 改作 `column` 的那一刻,这两条轴便对调了。** 元素并排时管水平方向的 `justify-content`,一旦改为纵向堆叠,管的便成了垂直方向。多数「怎么也居不了中」的抱怨,**不过是没留意该改的属性已经换了一个罢了。**

使用方法

  1. 从预设起步 居中、两端对齐、纵向堆叠等常用样式都已备好。
  2. 切换 flex-direction **在 `row` 与 `column` 之间来回,轴的对调便看得一清二楚。**
  3. 试一试对齐的属性 依次改动 `justify-content` 与 `align-items`,确认各自如何使劲。
  4. 复制生成的 CSS 排布中意之后,便可原样贴进您的代码。

用好本工具的小技巧

  • justify-content 用于「主轴」方向的对齐,align-items 用于「交叉轴」方向的对齐。将 flex-direction 设为 column 后主轴变为纵向,这两个属性的视觉效果会互换。
  • 「居中对齐」预设组合了 justify-content: center 与 align-items: center,是用 Flexbox 实现水平垂直双向居中最常见的写法。
  • gap 属性只在项目之间添加间距,不会影响容器外侧的空白(margin)。与 margin 不同,它能让相邻项目之间保持均匀的间隙而不影响边缘留白。
  • 为单个项目设置 align-self 后,该项目会忽略容器整体的 align-items 设置,适合让某一个元素单独呈现不同的对齐方式。
  • 启用 flex-wrap: wrap 后,超出容器宽度(column 模式下为高度)的项目会自动换到下一行,是响应式卡片布局中常用的技巧。

这些场景会用到

搭一条导航栏

**标志居左、菜单居右,正是 `justify-content: space-between` 的典型用场。**

把卡片等距排开

用 `gap` 便省去了为求间距均匀而抵消 `margin` 的那些小把戏。

把元素放在正中

**把 `justify-content` 与 `align-items` 都设为 `center`,是最短的路。**

学习 Flexbox

改一个值看一眼结果,比读多少说明都学得快。

Flexbox 的术语

主轴
元素排布所沿的方向,由 `flex-direction` 定下。**`row` 时为水平,`column` 时为垂直。**
交叉轴
与主轴成直角的方向。**主轴一对调,它也随之对调。**
justify-content
管**主轴上**的排布,提供居中、两端对齐、均匀分布等。
align-items
管**交叉轴上**的排布。在默认的 `stretch` 之下,子元素会长到满高。
flex-wrap
决定放不下的元素是否换行。留作 `nowrap` 则被压缩着塞进去。
gap
元素之间所留的空隙。**与 `margin` 不同,它不会在外缘添出多余的空隙。**

常见问题

justify-content 控制 Flexbox「主轴」方向(由 flex-direction 决定,默认是横向)的对齐方式,align-items 控制与主轴垂直的「交叉轴」方向的对齐方式。当 flex-direction 为 row 时主轴是横向,因此 justify-content 负责横向排列、align-items 负责纵向排列;但改为 flex-direction: column 后主轴变为纵向,这两个属性的作用会互换。

当 flex-direction 为 column 时,主轴变为纵向,因此使用 justify-content: center 可以实现纵向居中。若还需要横向(交叉轴方向)居中,则使用 align-items: center。两者结合即可在纵向堆叠布局中同时实现上下左右居中。

Flexbox 的 gap 属性在 2021 年前后 Chrome 和 Safari 的支持一度落后,但目前主流浏览器(Chrome 84+、Safari 14.1+、Firefox 63+)均已支持。如果必须兼容非常old的浏览器,可以考虑用 margin 作为替代方案。

flex-grow 用于指定容器有多余空间时项目应扩展多少来填补空白,flex-shrink 用于指定容器空间不足以容纳所有项目原始大小时项目应收缩多少。两者都是以项目的基准尺寸(flex-basis)为基础,决定多余或不足的空间如何分配。

一般来说,Flexbox 更适合「单一方向(一行或一列)排列的元素组」布局,例如导航栏或横向排列的卡片。而 CSS Grid 适合同时控制行与列的二维布局,例如整个页面的网格结构。简单的线性排列选择 Flexbox,需要复杂的网格状布局则选择 Grid。
工具君

闲话 ― Flexbox 如何改变 CSS 布局的历史

在 CSS Flexbox(正式名称为 CSS Flexible Box Layout Module)出现之前,网页的横向布局通常依靠 float 属性实现。然而 float 原本是为了让文字环绕图片而设计的功能,并非用于布局,因此用它来做布局需要许多变通手段,其中最著名的就是防止父元素高度塌陷的「clearfix」技巧。

W3C 于 2009 年发布了 Flexbox 的第一份草案,它专为「一维排列」布局而设计。过去需要多行 float 相关 CSS 技巧才能实现的效果——如让元素沿主轴伸缩、均匀分配空间、实现垂直居中——如今只需 justify-content、align-items 等声明式属性即可完成。

大约在 2015 年前后,主流浏览器完成了对 Flexbox 的实现,它迅速成为实现导航栏、卡片布局、表单对齐等常见网页设计模式的标准手段。「终于能用 Flexbox 实现垂直居中」在当时的前端开发者社区中尤其受到欢迎,因为这曾是 CSS 中公认最棘手的问题之一。

如今,Flexbox 与专注于二维布局的 CSS Grid 各司其职、共同存在:Flexbox 负责「沿单一方向排列的组件内部布局」,Grid 则负责「整个页面的网格状布局」。