【问题标题】:How is the height calculated in this case?在这种情况下如何计算高度?
【发布时间】:2019-06-13 17:50:16
【问题描述】:

在此设置中:

html,
body {
  height: 100%;
}

.app {
  display: flex;
}

.menu {
  background-color: red;
  width: 100px;
}

.content {
  flex: 1;
  border: 1px solid blue;
}
<div class="app">
    <div class="menu">menu</div>
    <div class="content">
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
      <div>content</div>
    </div>
  </div>

我有两个问题。

  1. 您可以看到menu 的高度与content 的高度相同,对吧? 有人可以解释这是为什么吗?是否继承了app的高度(高度是根据contentdiv的内容动态计算的)?

  2. 如果我在 .menu 属性中插入 height: 100%,如下所示:

.menu {
            background-color: red;
            width: 100px;
            height: 100%
      }

然后菜单的高度降低。有人可以解释为什么会这样吗?如果 menu 应该像之前的情况一样继承 app 的高度,那么为什么写 height:100% 会阻止这种情况呢?

【问题讨论】:

  • 默认情况下,您的菜单高度会弯曲以占据所有空间,将其设置为 100% 将使其成为其内容的 100%(“菜单”文本的 100%)
  • @DanielVafidis 错了,100% 并不意味着 100% 的内容,而是它的父元素(包含块),但此规则将失败,因为父元素上没有设置高度。跨度>

标签: html css flexbox


【解决方案1】:

对于第一种情况,它与 flexbox 的默认对齐方式有关,即stretch。因此,所有元素都会拉伸以适应容器的高度1,因此菜单与内容的高度相同。换句话说,最高的元素将定义高度,另一个将拉伸以适应该高度。

更改对齐方式,您将不再有这种行为:

html,
body {
  height: 100%;
}

.app {
  display: flex;
  align-items:flex-start; /*anything different from stretch*/
}

.menu {
  background-color: red;
  width: 100px;
  height:100%;
}

.content {
  flex: 1;
  border: 1px solid blue;
}
<div class="app">
  <div class="menu">menu</div>
  <div class="content">
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
  </div>
</div>

通过添加height:100%,您现在可以明确地为元素应用高度(不再应用拉伸),但这将无法达到auto 值(内容的高度),因为父元素没有指定任何高度2

html,
body {
  height: 100%;
}

.app {
  display: flex;
}

.menu {
  background-color: red;
  width: 100px;
  height:100%;
}

.content {
  flex: 1;
  border: 1px solid blue;
}
<div class="app">
  <div class="menu">menu</div>
  <div class="content">
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
  </div>
</div>

1 如果 flex 项目的 cross size 属性计算为 auto,并且两个交叉轴边距都不是 auto,则 flex 项目被拉伸。它使用的值是使项目的边距框的交叉尺寸尽可能接近与线相同的尺寸所需的长度,同时仍然尊重 min-height/min-width 施加的约束/max-height/max-width.ref

我们的案例中只有一行,因此它与整个容器相同。


2 指定百分比高度。该百分比是相对于生成的框的包含块的高度计算的。如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位的,则值计算为'auto' .ref

给应用添加一个高度,你会看到发生了什么:

html,
body {
  height: 100%;
}

.app {
  display: flex;
  height:80%;
}

.menu {
  background-color: red;
  width: 100px;
  height:100%;
}

.content {
  flex: 1;
  border: 1px solid blue;
}
<div class="app">
  <div class="menu">menu</div>
  <div class="content">
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
    <div>content</div>
  </div>
</div>

更新

根据这里的 cmets,特殊情况是百分比高度在父元素中没有指定高度的情况下起作用。

html,
body {
  height: 100%;
}

.app {
  display: flex;
  height: 80%;
}

.menu {
  background-color: red;
  width: 100px;
}

.container{
  flex: 1;
  background:green;
}

.test {
  height: 80%;
  border: 2px solid blue;
}
<div class="app">
<div class="menu">menu</div>
  <div class="container">
    <div class="test">percentage height is working here!! why??</div>
  </div>
</div>

正如我在a previous answer 中解释的那样,.container 的高度没有明确设置,但我们没有任何循环依赖,因为.container 的高度是由拉伸行为而不是他的内容定义的,所以浏览器可以先用stretch设置.container的高度,然后解析.test元素的百分比高度。

如果 flex 项目有 align-self:stretch,重做其内容的布局,将此使用的大小视为其确定的交叉大小,以便可以解析百分比大小的子项。 ref

在没有拉伸效果的情况下,浏览器需要先根据内容找到高度,而内容的高度是基于容器的,因此我们有一个循环依赖,这会使百分比高度失败到auto in为了能够定义容器高度。

【讨论】:

  • For the first case, it's about the default alignment of flexbox which is stretch. So all the elements will stretch to fit the height of the container->但最初不知道/指定容器的高度对吗? (而是根据contentdiv的内容后计算)
  • @jdoe 是的,但是里面有定义这个高度的内容,所以基本上最大的元素将定义所有元素的高度
  • 是的,我的意思是“应用程序”的高度最初是未知的,对吧?那么首先app根据content div调整了它的高度,然后menu继承了它?
  • @jdoe 这不是继承,而是拉伸对齐。如果有剩余空间,我们告诉元素拉伸但是 height:100% 不同,我们告诉元素以容器的高度作为参考,但没有设置高度,所以它会失败
  • @jdoe 不,他们从不继承高度,默认情况下高度总是自动的(内容的高度),只有一些属性会创建这种继承,比如 flexbox 的拉伸效果或 height:100% ONLY当父级指定为高度时
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2018-12-26
  • 2020-07-27
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多