【问题标题】:How can I make Flexbox children 100% height of their parent?我怎样才能让 Flexbox 孩子 100% 的高度是他们的父母?
【发布时间】:2013-03-01 03:26:25
【问题描述】:

我正在尝试填充 Flexbox 中弹性项目的垂直空间。

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  background-color: red;
}
.flex-2-child {
  height: 100%;
  width: 100%;
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>

这是JSFiddle

flex-2-child 不会填充所需的高度,除非以下两种情况:

  1. flex-2 的高度为 100%(这很奇怪,因为弹性项目默认为 100% + 它在 Chrome 中是错误的)
  2. flex-2-child 有一个绝对位置,这也很不方便

目前这在 Chrome 或 Firefox 中不起作用。

【问题讨论】:

  • 使用height:100%有什么问题;对于 .flex-2 ?
  • 它违背了 flex 项目的目的,即自行填充内容,它给了我 chrome 中最奇怪的错误,每当我调整窗口大小时高度就会回到零
  • 其实只有最新版的火狐才能正常运行
  • 目前,在 flexbox 中渲染百分比高度时,浏览器之间的行为存在显着差异:stackoverflow.com/a/35537510/3597276
  • 是的,Chrome 有一些问题,尤其是嵌套弹性盒。例如,我有一个嵌套的 flex 盒子,其中的孩子有 height:100%,但他们正在以自然高度渲染。奇怪的是,如果我将它们的高度更改为auto,那么它们会呈现为height:100%,就像我试图做的那样。如果它应该是这样工作的,那肯定是不直观的。

标签: css flexbox


【解决方案1】:

使用align-items: stretch

与 David Storey 的回答类似,我的解决方法是:

.flex-2 {
    display: flex;
    align-items: stretch;
}

请注意,height: 100% 应从子组件中删除(请参阅 cmets)。

除了align-items,您还可以在要拉伸的.flex-2-child 项目上使用align-self

【讨论】:

  • stretch: 这应该是选择的答案。
  • 如何对齐已拉伸到中间垂直对齐的 div 内的文本?
  • 是的,你应该添加删除height: 100%
  • 这拯救了我的一天。我有一个有一些项目的弹性行。我希望这些项目从其父项中获取高度。我在这里展示了我的问题codepen.io/dshung1997/pen/LYxvXNy
  • 如果我们在这个例子中无法控制“容器”,这会起作用吗?换句话说,我不能让“容器”使用弹性布局
【解决方案2】:

我已经回答了类似的问题here

我知道你已经说过position: absolute; 不方便,但它确实有效。有关修复调整大小问题的更多信息,请参见下文。

也可以查看jsFiddle 的演示,虽然我只添加了 WebKit 前缀,所以在 Chrome 中打开。

您基本上有两个问题,我将分别处理。

  1. 让弹性项目的子项填充高度 100%
  • 在孩子的父母上设置position: relative;
  • 在孩子身上设置position: absolute;
  • 然后您可以根据需要设置宽度/高度(在我的示例中为 100%)。
  1. 修复 Chrome 中调整大小滚动的“怪癖”
  • overflow-y: auto; 放在可滚动的 div 上。
  • 可滚动的 div 必须明确指定高度。我的样本已经有 100% 的高度,但如果没有应用,您可以指定 height: 0;

有关滚动问题的更多信息,请参阅this answer

【讨论】:

  • Point 1) 在 Chrome 中完美运行,Firefox 不需要绝对位置。
【解决方案3】:

如果我理解正确,你想让 flex-2-child 填充其父级的高度和宽度,使红色区域完全被绿色覆盖?

如果是这样,你只需要设置 flex-2 来使用 Flexbox:

.flex-2 {
    display: flex;
}

然后告诉 flex-2-child 变得灵活:

.flex-2-child {
    flex: 1;
}

http://jsfiddle.net/2ZDuE/10/

原因是 flex-2-child 不是 Flexbox item,但它的 parent 是。

【讨论】:

  • 我怎样才能做到这一点,只是身高 100%,每个孩子都是 50/50?
  • 请注意,如果您使用“align-items: center”,您将无法使用此修复程序,因为您的项目现在将变得等高。
  • @NeilMonroe 如果您只对一个孩子使用align-self: stretch,您仍然可以使用align-items: center
  • 嗨@David,我试过你的解决方案,它适用于 flex-direction: 行布局,它似乎不适用于 flex-direction: 列布局,或者我的代码中有任何地方错误.您能帮忙检查一下为什么在这个小提琴jsfiddle.net/78o54Lmv 中,内框不会占据其父级的全部高度吗?
  • 我必须将min-height: 100vh; 添加到.flex-2 元素才能使其正常工作。感谢您的帮助!
【解决方案4】:

我认为 Chrome 的行为更符合 CSS 规范(尽管它不太直观)。根据 Flexbox 规范,默认的 stretch 值为元素的“交叉尺寸属性”(height,在本例中)的 align-self 属性 changes only the used value。而且,据我了解the CSS 2.1 specification,百分比高度是根据父级height指定 值计算的,而不是其使用值。父级的height 的指定值不受任何弹性属性的影响,仍然是auto

设置显式的height: 100% 可以正式地计算孩子的高度百分比,就像将height: 100% 设置为html 可以计算@987654333 的百分比高度一样@ 在 CSS 2.1 中。

【讨论】:

  • 没错!要将其付诸实践,只需将height:100% 添加到.flex-2。这是jsfiddle
  • Chrome 的行为更符合 Chrome 团队对 CSS 规范的解释。虽然它可以这样解释,但有更好的解释方法,任何一种方法都不会让我们陷入这个集市、烦人和令人讨厌的行为。他们应该考虑更多。
  • @RickDoesburg,这是一年多以前的事了,但我相信我不得不求助于固定高度元素。我希望这些浏览器能够齐心协力。我真的开始不喜欢移动领域了。
  • 将垂直 flexbox 容器的子容器设置为 height: 100% 在 Chrome 中给我带来了非常奇怪的结果。似乎这会导致“指定高度”设置为容器的总高度,而不是元素本身的高度,因此当其他元素的大小相对于它计算时会导致不需要的滚动.
【解决方案5】:

我自己找到了解决方案。假设您有以下 CSS:

.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  height: 100%; <- didn't work
}

这种情况下,设置高度100%是不行的,所以我将margin-bottom规则设置为auto,比如:

.child {
  margin-bottom: auto;
}

并且子元素将与父元素的最顶部对齐。

如果您愿意,也可以使用align-self 规则:

.child {
  align-self: flex-start;
}

【讨论】:

  • 一个不错的 hack,但问题是:如果 child 是侧边栏并且它有背景颜色,则边距空间仍然是白色的。
  • 这个解决方案的好处在于父级的高度可以是动态的!以前的解决方案要求父级具有设定的高度。谢谢你。
【解决方案6】:

这也可以在我们要拉伸的元素上使用align-self: stretch; 来解决。

有时希望在 Flexbox 设置中仅拉伸一项。

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  align-self: stretch;
  background-color: red;
}
.flex-2-child {
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>

【讨论】:

    【解决方案7】:

    .container {
        height: 200px;
        width: 500px;
        display: -moz-box;
        display: -webkit-flexbox;
        display: -ms-flexbox;
        display: -webkit-flex;
        display: -moz-flex;
        display: flex;
        -webkit-flex-direction: row;
        -moz-flex-direction: row;
        -ms-flex-direction: row;
        flex-direction: row;
    }
    .flex-1 {
       flex:1 0 100px;
        background-color: blue;
    }
    .flex-2 {
        -moz-box-flex: 1;
        -webkit-flex: 1;
        -moz-flex: 1;
        -ms-flex: 1;
        flex: 1 0 100%;
        background-color: red;
    }
    .flex-2-child {
        flex: 1 0 100%;
        height: 100%;
        background-color: green;
    }
    <div class="container">
        <div class="flex-1"></div>
        <div class="flex-2">
            <div class="flex-2-child"></div>
        </div>
    </div>

    http://jsfiddle.net/2ZDuE/750/

    【讨论】:

    • 解释一下。
    【解决方案8】:

    一个想法是display:flex;flex-direction: row; 是用.flex-1.flex-2 填充container div,但这并不意味着.flex-2 有一个默认的height:100%;,即使它延伸到全高。

    若要让子元素 (.flex-2-child) 与 height:100%;,您需要将父元素设置为 height:100%; 或在 .flex-2 div 上使用 display:flex;flex-direction: row;

    据我所知,display:flex 不会将所有子元素的高度扩展到 100%。

    一个小演示,去掉了.flex-2-child的高度,在.flex-2上使用了display:flex;http://jsfiddle.net/2ZDuE/3/

    【讨论】:

      【解决方案9】:

      有趣的事实:height-100% 适用于最新的 chrome;但不是在 Safari 中;


      所以顺风的解决方案是

      “弹性项目-拉伸”

      https://tailwindcss.com/docs/align-items

      并递归地应用到孩子的孩子的孩子...

      【讨论】:

        【解决方案10】:
        .parent {
            display: flex;
        }
        
        .child {
            min-height: 100%;
        }
        

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
        【解决方案11】:

        .container { . . . . 对齐项目:拉伸; . . . . }

        【讨论】:

        • 欢迎来到stackoverflow。您需要充分解释您的答案,以及它与现有答案的不同之处。见stackoverflow.com/help/how-to-answer
        • 你的答案似乎和 B T 的一样(提前三年写的),但表达得更差。
        【解决方案12】:

        这是我使用css+ 的解决方案。

        首先,如果第一个孩子 (flex-1) 应该是 100px,它不应该是 flex。

        实际上,在css+ 中,您可以设置灵活和/或静态元素(列或行),您的示例变得如此简单:

        <div class="container">
          <div class="EXTENDER">
            <div class="COLS">
              <div class="CELL _100px" style="background-color:blue">100px</div>
              <div class="CELL _FLEX" style="background-color:red">flex</div>
            </div>
          </div>
        </div>
        

        容器 CSS:

        .container {
            height: 200px;
            width: 500px;
            position: relative;
        }
        

        显然包括css+ 0.2 core

        这里是the fiddle

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2017-12-05
          • 2021-06-15
          • 1970-01-01
          相关资源
          最近更新 更多