控制弹性元素在主轴上的比例

在这篇指南中我们将探索应用于弹性(flex)元素的三个属性,它们能使我们在主轴方向上控制弹性元素的尺寸和伸缩性—— flex-grow flex-shrink flex-basis 。充分了解这些属性如何与伸张和缩小的元素一起工作是掌握弹性盒子(flexbox)的关键所在。

预览

这三个属性控制弹性元素的以下几个方面的灵活性:

  • flex-grow :该元素获得(伸张)多少正可用空间(positive free space)?
  • flex-shrink :该元素要消除(收缩)多少负可用空间(negative free space)?
  • flex-basis :在该元素未伸张和收缩之前,它的大小是多少?
  • 以上属性通常用简写属性 flex 表达。下面的代码设置 flex-grow 属性值为 2 flex-shrink 属性值为 1 flex-basis 属性值为 auto

    .item {
      flex: 2 1 auto;
    

    如果你阅读过文章弹性盒子的基本概念,那么你应该已经对这些属性有了初步了解。为了让你能明白当你在用它们的时候浏览器在做什么,我们将进一步探讨它们。

    工作于主轴的重要概念

    在考虑 flex 属性如何在主轴方向上控制比率之前,有一些概念值得我们去深究。这涉及到弹性元素在任何伸缩之前的自然尺寸,以及可用空间(free space)的概念

    弹性元素的尺寸

    为了计算出有多少可用空间能用于放置弹性元素,浏览器必须知道这个元素有多大。它是如何解决没有应用绝对单位的宽度和高度的弹性元素?

    在 CSS 中还有 min-content max-content 这两个概念;这两个关键字可以用来代替 长度单位

    例如下面的例子,我们有两段包含一个文本字符串的段落。第一段设置了 min-content 的宽度。在支持这个关键字的浏览器你可以看见文本已尽可能抓住机会来自动换行,使之变得尽可能小且没有溢出。这就是该字符串的 min-content 大小。本质上讲,字符串中最长的单词决定了大小。

    第二段设置了 max-content 值,其与前者相反。它会变得尽可能大,没有自动换行的机会。如果容器太窄,它就会溢出其自身的盒子。