【问题标题】:How can I get vertical scrolling in wrapped columns using display: flex?如何使用 display: flex 在包装列中进行垂直滚动?
【发布时间】:2020-11-11 04:48:06
【问题描述】:

我想在多列上制作一个带有显示弹性的垂直列表,但它应该可以垂直滚动。还有一点重要,方向应该是从上到下;第二项应该在第一项的底部。

最后一件事,我并不总是有 20 个子元素,它可能只有两个,在这种情况下,我只需要将它们放在一列,而不是倍数......这就是为什么我没有使用CSS 多列布局解决方案,转向 flexbox。

我尝试过使用overflow: autooverflow-y: auto,但都没有成功。

JSFiddle:https://jsfiddle.net/r69onzhy/4/

如您所见,它可以水平滚动,但我希望垂直拥有它。

ul {
  display: flex;
  list-style: none;
  width: 210px;
  height: 100px;
  flex-direction: column;
  flex-wrap: wrap;
  padding: 0;
  margin: 0;
  overflow: auto;
}

li {
  width: 70px;
}
<ul>
  <li>Test 1</li>
  <li>Test 2</li>
  <li>Test 3</li>
  <li>Test 4</li>
  <li>Test 5</li>
  <li>Test 6</li>
  <li>Test 7</li>
  <li>Test 8</li>
  <li>Test 9</li>
  <li>Test 10</li>
  <li>Test 11</li>
  <li>Test 12</li>
  <li>Test 13</li>
  <li>Test 14</li>
  <li>Test 15</li>
  <li>Test 16</li>
  <li>Test 17</li>
  <li>Test 18</li>
  <li>Test 19</li>
  <li>Test 20</li>
</ul>

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    删除flex-direction: column

    overflow: auto; 更改为overflow-y: auto;

    如果每行需要 3 个项目,请使用

    li {
       flex: 0 0 33.33%;
    }
    

    【讨论】:

    • 是的,它有效,但它改变了方向......我需要第二个项目在第一个的底部......而不是在右边
    • 使用flex-direction: all-scroll;
    • 我不知道这个属性......而且我在网上找不到它。我试过了,但我的浏览器告诉我它是无效的......
    • 规范中没有这样的属性:w3.org/TR/css-flexbox-1/#flex-direction-property不确定你从哪里得到的。检查代码以查看它是否无效并将其删除以在没有它的情况下具有相同的行为。换句话说,它什么都不做
    • 对不起,我没有在规范中看到。
    【解决方案2】:
    ul {
      display: flex;
      list-style: none;
      width: 210px;
      height: 100px;
      flex-direction: column;
      flex-wrap: nowrap;
      padding: 0;
      margin: 0;
      overflow: hidden;
      overflow-y: auto;
    
    
      li {
        width: 100%;
      }
    }
    

    【讨论】:

    • 好的,但正如我所说,我想要 multiples 列...这就是为什么我需要换行...
    【解决方案3】:

    您可以考虑使用带有额外包装器的columns

    .wrapper {
      width: 210px;
      height: 100px;
      overflow: auto;
    
    }
    ul {
      columns:3;
      list-style:none;
      padding: 0;
      margin: 0;
    }
    
    li {
     padding:5px 0;
    }
    <div class="wrapper"><ul>
      <li>Test 1</li>
      <li>Test 2</li>
      <li>Test 3</li>
      <li>Test 4</li>
      <li>Test 5</li>
      <li>Test 6</li>
      <li>Test 7</li>
      <li>Test 8</li>
      <li>Test 9</li>
      <li>Test 10</li>
      <li>Test 11</li>
      <li>Test 12</li>
      <li>Test 13</li>
      <li>Test 14</li>
      <li>Test 15</li>
      <li>Test 16</li>
      <li>Test 17</li>
      <li>Test 18</li>
      <li>Test 19</li>
      <li>Test 20</li>
    </ul>
    </div>

    【讨论】:

    • 是的,我在使用 flex 之前尝试过这种方式,但问题是我并不总是有 20 个子菜单,它们可能只有 2 个,在这种情况下,我希望它们在一列中,但是这样解决方案它们将在多个列中...这就是我转向 flex 解决方案的原因...
    • @SimonTrichereau 即使使用 flexbox 我不认为你可以做到,拥有动态列数和垂直滚动。有很多变量,浏览器永远不知道何时考虑多列以及何时添加滚动。
    • 是的,我很害怕这是不可能的......但这就是我问的原因,想知道是否有解决方案......
    猜你喜欢
    • 1970-01-01
    • 2015-02-03
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多