Flexbox 布局背后的思考过程

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

我只需要将两个盒子并排放置,我听说 flexbox 很擅长处理这类事情。

只需将 display: flex; 添加到父元素,即可将子元素水平排列。

嗯,这很酷。我想我可以用浮动来实现,但这更容易。

它们可能应该占据它们具有的全部空间。我可以将父元素宽度设置为 100% 吗?我可以,但这显然不会影响子元素。

如果父元素的空间比子元素需要的空间更大,它不会做任何事情来帮助子元素单独填充空间。

也许我可以在子元素上使用 width: 50%;?这有效,但我认为 flexbox 的意义在于你不必对宽度进行所有具体的指定。啊,是的,flexbox 有所有这些方法来表达子元素的增长、收缩和初始行为。看起来 flex: 1; 是这里最简单的方法。

flex: 1; 应用于子元素允许它们增长并填充空间。

我喜欢到目前为止我还没有进行任何数学运算或硬编码值。我可以将其变成一个三列模式而无需修改 CSS 吗?

不错。

嗯,等等。大小有点,呃,灵活?没有任何东西强制这些盒子始终占据容器的三分之一。

看起来 flex-basis: 33% 无法解决这个问题。flex: 0 0 33%; 也无济于事。看起来 width: 33%; flex-shrink: 0; 可以,如果我们真的想强迫它。

有时设计需要大小完全相等的盒子。这可能是 CSS Grid 的领域,但无论如何。

在窄宽度下强制这种大小行为的冗长单词可能是一种不常见的情况。我们也可以在子元素上使用 word-break: break-word; hyphens: auto; 来解决它。

我们还可以做的一件事就是让这些项目自动换行,而不是对此过于严格。Flexbox 可以做到这一点,对吧?

哦,对了,这让我想起了前两个项目高度相同是多么酷。这是默认的 stretch 行为,但也可以控制。并且它是按行进行的,这就是第二行有其自身不同高度的原因。

如果我想让第一个“Love”块位于顶部怎么办?看起来我可以重新排序它,是吗?让我们看看,默认顺序是 0,所以要放在第一位,我使用 order: -1;

哈!这有点奏效了。但我的意思是,我希望它占据顶行的全部宽度。我想我可以将其提升到 flex-basis: 100%;,其他元素将相应地换行。

源顺序和视觉顺序不同,这很奇怪。也许这应该归入“永远不要这样做”的类别。

如果我想在某个时候放弃整个 flexbox 该怎么办?我的一部分想要将方向更改为使用 flex-direction: column; 垂直排列,并强制子元素为全宽。啊,在父元素上使用简单的 display: block; 就可以一举做到这一点。

与其更改所有 flexbox 内容以处理列布局,我们只需关闭 flexbox。

Flexbox 可以做更多的事情!我最喜欢的一件事是自动边距如何“推开”其他元素(如果有空间)。这只是一段小小的旅程,使用一些UI并观察灵活布局的有用之处以及可能使其变得混乱的地方。