跳到正文

Flexbox 弹性布局实验场

Flexbox Playground

在实时示例上逐个切换 flex 属性,同时看到 CSS 和每个属性改变了什么。

每个 flexbox 属性都放在一个活的示例上,每个控件下面有一行说明它实际做什么。预览是浏览器自己的 flex 布局,CSS 就是那个状态的书面记录,所以你看到的就是你的页面会做的。

🔒 完全在你的浏览器里运行cssflexboxlayoutlearn

预览

点一个项目,就能在右边改它自己的属性。

容器

项目 1

代码

输出
  • · 主轴是横向的。
  • · flex-grow 都是 0,所以多余的空间由 justify-content 来分。

保持默认值的属性不会写出来,只写你改过的。

预览用的就是浏览器自己的 flexbox,CSS 是把那个状态照抄下来的,所以这里看到的就是页面上的样子。要做二维布局,就去 CSS 网格布局生成。

怎么用

  1. 设置容器属性

    方向、换行和三个对齐属性。每个下面都有一句话解释它改变什么——尤其是 `align-content`,只有一行时它什么都不做。

  2. 点一个项目来编辑它

    grow、shrink、basis、align-self 和 order 作用于单个项目。增删项目,看容器如何重新分配。

  3. 读说明并复制 CSS

    面板描述你当前的布局实际会做什么,输出省略每一个仍在默认值的属性——所以你复制的只是你改过的。

常见问题

为什么我的项目溢出而不是收缩?

要么是 `flex-shrink: 0`,要么是某个子元素有最小内容尺寸。flex 项目的 `min-width` 默认是 `auto`,意味着它不会收缩到比内容更窄——一串不断行的长字符串或一张宽图片是常见的元凶。`min-width: 0` 是修法。

`align-items` 和 `align-content` 有什么区别?

`align-items` 在交叉轴上放置每个项目。`align-content` 放置的是换行产生多行之后的*整块行*——所以在 `nowrap` 下,或者只有一行时,它什么都不做。这是“这个属性坏了”最常见的来源。

该用 `order` 来重排东西吗?

慎用。它改变视觉顺序而不改变 DOM 顺序,所以屏幕阅读器和 Tab 顺序仍然跟着标记走。键盘用户在一个视觉上重排过的布局里按 Tab,焦点会在屏幕上跳来跳去——所以规范把它称为最后的手段。

Flexbox 还是 Grid?

一维用 Flexbox——一排按钮、一个工具栏、一张卡片的内部。行和列必须互相对齐时用 Grid。如果你在嵌套 flex 容器来假装一个网格,你要的是 Grid。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。