垂直布局 css

Vertical layout css

我想用 flexbox 创建一个垂直布局。

结构如下:

.container {
  display: flex;
  flex-direction: column;
}
<div class="container">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
  <div class="child">6</div>
  <div class="child">7</div>
  <div class="child">8</div>
</div>

每列应该显示 6 个项目

1    7
2    8
3
4
5
6

试试这个风格:

.container {
    display: flex;
    flex-direction: column;
    height: 112px;
    flex-wrap: wrap;
}

我在这里所做的是设置容器的高度 div 以便弹性项目在溢出时换行到下一列。为此,您还需要设置 flex-wrap: wrap;。在这种情况下,height: 112px 导致了溢出。您可以根据您的要求进行更改。

高度是动态的,基于你想要垂直控制的项目数量(在本例中为 6),我计算的高度基于 1rem font-size:

6 个项目的示例:

.container {
  display: flex;
  flex-flow: column wrap;
  font-size: 1rem;
  max-height: calc(6 * 1.2em);
}
<div class="container">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
  <div class="child">6</div>
  <div class="child">7</div>
  <div class="child">8</div>
</div>

7 个项目的示例:

.container {
  display: flex;
  flex-flow: column wrap;
  font-size: 1rem;
  max-height: calc(7 * 1.2em);
}
<div class="container">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
  <div class="child">6</div>
  <div class="child">7</div>
  <div class="child">8</div>
</div>

对于要分成新列的结构,它需要知道它可以容纳其内容的限制。

为了清楚起见,想象一个带有一些文本的简单段落标记。一旦文本超过页面(或容器)的宽度,多余的文本就会换行到下一行。因此,对于行,宽度可以设置为限制,默认情况下为视口宽度的 100% 或容器宽度的 100%。

但是这里因为我们处理的是列并且它以高度作为限制,所以这里的挑战就出现了,因为在 HTML 文档中高度是无限的。因为当内容随着垂直滚动条增加时,页面的高度会增加到任何程度。 (请注意,在宽度 overflow 水平滚动条的情况下,同样可以实现,但这里我们讨论的是默认行为)。

因此,在这种情况下,只有当我们为容器指定高度时,才能将内容分成新的列(CSS 网格除外)。

它可以像其他答案中提到的那样以像素或 rem 为单位指定。

或者,如果您正在寻找与上述行等效的行为,则可以求助于 viewport-height,类似于 viewport-width 行的情况。 PEN

body {
  margin: 0;
}

.container {
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  height: 100vh;
}

.child {
  height: 16.667vh;
}

请注意,这不是一个完美的解决方案,因为它可能会在内容超出高度时导致错位,并且还会出现浏览器兼容性问题。您也可以考虑 CSS 网格或尝试 Javascript 解决方案来完美解决这种情况。

希望对您有所帮助。

由于 OP 同意接受 CSS 网格解决方案,这里有一个:

.container {
  display: grid;
}

.child:nth-child(6n + 2) {
  grid-row-start: 2;
}

.child:nth-child(6n + 3) {
  grid-row-start: 3;
}

.child:nth-child(6n + 4) {
  grid-row-start: 4;
}

.child:nth-child(6n + 5) {
  grid-row-start: 5;
}

.child:nth-child(6n) {
  grid-row-start: 6;
}

PEN - 希望对您有所帮助。