【问题标题】:Vertical layout css垂直布局 css
【发布时间】:2018-07-28 20:35:48
【问题描述】:

我想用 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

【问题讨论】:

  • 每列或每行 6 项?
  • 可以考虑使用css网格吗?
  • @GibinEalias 是的
  • @TemaniAfif 专栏 ;)

标签: html css flexbox vertical-alignment


【解决方案1】:

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

.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 - 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    要使结构拆分为新列,它需要知道可以容纳其内容的限制。

    为了清楚起见,想想一个带有一些文本的简单段落标签。一旦文本超过页面(或容器)的宽度,多余的文本将换行到下一行。因此,对于行,可以将宽度设置为限制,默认为视口宽度的 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 解决方案来完美解决这种情况。

    希望这会有所帮助。

    【讨论】:

    • 很高兴能帮上忙。您可以投票和/或将答案标记为正确答案,以便对其他用户有所帮助。谢谢。
    【解决方案3】:

    高度是动态的,基于您要垂直控制的项目数(在本例中为 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>

    【讨论】:

    • 这不是动态的calc(6 * 1.125em),因为如果您更改字体大小和任何其他样式,则必须更改它,所以我认为不需要使用 calc 复杂化
    • 你是什么意思?如果他更改了font-size,它将与字体大小相关
    • 是的,只有字体大小...如果我更改任何其他样式,它将不起作用(边框、填充、边距、高度等)
    • 这不完全正确?,只有在他使用box-sizing: border-box 否则paddingmarginborder 将在框外应用时才会中断
    • box-sizing: content-box 我想你知道这是默认值 ;) 所以他不需要使用它,并且边距、边框、填充都会生效[并且作为旁注边距没有任何意义用 box-sizing]
    【解决方案4】:

    试试这种风格:

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

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

    【讨论】:

    • 112px ?你能解释一下吗
    • 您需要设置容器的高度,以便弹性项目溢出到下一列。在这种情况下,height: 112px; 使其溢出。
    • 这意味着这只适用于这种特殊情况,这不是通用解决方案
    • 你是对的。我已经修改了我的答案并解释了更多。
    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2014-10-07
    • 2012-10-25
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多