html - 嵌套的 flex 元素不会使父级增长

标签 html css flexbox

我正在尝试编写一个标题,其中包含月份名称和该月份的所有日期,就在该名称的正下方。

天元素有固定的宽度,所以我想:为什么不使用 flexbox?

由于某些原因,.day 元素正在从其父元素中掉落,而父元素不会增长。

你能给我一个提示,为什么 flex-basis: auto 不会让 month-slot 在 days's slot 溢出后增长吗?

至于实现,我已经找到了使用 float: left 而不是使用 flexbox 的解决方法。但我无法理解为什么它会这样工作。

.main {
  display: flex;
}

.month {
  flex: 0 0 auto;
}

.days {
  display: flex;
}

.day {
  flex: 0 0 2em;
}
<div class='main'>
  <div class='month'>
    <div class='name'>Jan</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Feb</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
      <div class='day'>7</div>
      <div class='day'>8</div>
      <div class='day'>9</div>
      <div class='day'>10</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Mar</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
    </div>
  </div>
</div>

代码笔:http://codepen.io/skyboyer/pen/MyzeLW

jsFiddle:https://jsfiddle.net/azizn/ytt7jb85/

最佳答案

使用 width: 2em 而不是 flex: 0 0 2em

.main {
  display: flex;
}
.month {
  flex: 0 0 auto;
}
.days {
  display: flex;
}
.day {
  width: 2em;
}
<div class='main'>
  <div class='month'>
    <div class='name'>Jan</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Feb</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
      <div class='day'>7</div>
      <div class='day'>8</div>
      <div class='day'>9</div>
      <div class='day'>10</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Mar</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
    </div>
  </div>
</div>

您的代码的问题是 Firefox 和 Chrome 大小 .month 考虑了内容的宽度,但没有考虑 flex-basis

.main {
  display: flex;
}
.month {
  flex: 0 0 auto;
}
.days {
  display: flex;
  overflow: hidden;
}
.main.big .day {
  flex: 0 0 2em;
}
.main.big > .month:after {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  border: 1px solid red;
}
<div class='main grow'>
  <div class='month'>
    <div class='name'>Jan</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Feb</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
      <div class='day'>7</div>
      <div class='day'>8</div>
      <div class='day'>9</div>
      <div class='day'>10</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Mar</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
    </div>
  </div>
</div>
<hr />
<div class='main big'>
  <div class='month'>
    <div class='name'>Jan</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Feb</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
      <div class='day'>3</div>
      <div class='day'>4</div>
      <div class='day'>5</div>
      <div class='day'>6</div>
      <div class='day'>7</div>
      <div class='day'>8</div>
      <div class='day'>9</div>
      <div class='day'>10</div>
    </div>
  </div>
  <div class='month'>
    <div class='name'>Mar</div>
    <div class='days'>
      <div class='day'>1</div>
      <div class='day'>2</div>
    </div>
  </div>
</div>

这是一个错误。根据Line Length Determination , 当 determining the flex base size .month 案例 E 适用:

size the item into the available space using its used flex basis in place of its main size, treating a value of content as max-content.

计算最大内容大小的复杂问题已移至 CSS Sizing 4:

max-content inline size: The box’s “ideal” size in the inline axis. Usually the narrowest inline size it could take while fitting around its contents if none of the soft wrap opportunities within the box were taken. (See §4 Intrinsic Size Determination.)

如果是 non-replaced block ,

The max-content inline size of a block container box is the inline-size of the box after layout, if all children are sized under a max-content constraint.

它明确表示“布局后”。它没有说“在 flex 布局之前”之类的话。所以 flex-basis: 2em 不应该被忽略,并且应该有助于容器的最大内容大小。

关于html - 嵌套的 flex 元素不会使父级增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968138/

相关文章:

javascript - 使用 JavaScript 提交

html - 如何在 ul 中设置滚动条的样式

css - Angular:primeng 的样式无法工作,即使它们列在 styles.scss 中

html - 尽管有 `flex: 1` 和 `flex-basis: 0`,但 Flexbox 子节点并不相等

html - Css3 flex 属性元素在布局上对齐

css - 如何制作带有附加链接的 Flexbox Gallery Images 使它们成为 flex childs

带有图像 : what's the best semantic for this? 的 HTML 帮助按钮

html - 安卓原生浏览器 : input placeholder works not correctly

html - 无法将 div 的内容在 Edge 中左对齐

html - 使用 CSS 调整 Canvas 大小会扭曲鼠标操作