【问题标题】:Why does my column gap get smaller when I increase the width of my container?当我增加容器的宽度时,为什么我的列间距变小了?
【发布时间】:2021-01-07 03:19:58
【问题描述】:

我很难理解多列布局中列间隙背后的逻辑。我在this Fiddle 中有以下 HTML/CSS:

<div class="flex-container">
  <div class="flex-item">1</div>
  <div class="flex-item">2</div>
</div>
.flex-container {
  height: 500px;
  width: 300px;
  border: 1px solid blue;
  columns: 120px;
  padding: 10px;
}

.flex-item {
  background: OliveDrab;
  padding: 5px;
  width: 100px;
  height: 100px;
  line-height: 100px;
  color: white;
  text-align: center;
  break-inside: avoid-column;
}

您会注意到,如果将容器的width 从 300px 更改为 400px,列之间的间隙实际上会缩小。

为什么要这样做?是否可以将列左对齐以使它们不会移动? Fixed gap between CSS columns 可能暗示这是不可能的。

【问题讨论】:

    标签: html css flexbox css-multicolumn-layout


    【解决方案1】:

    如果您不指定列数(columns 的第二个参数),那么系统将计算出可能的列数(即,它将 auto 作为 column-count 参数)。

    您已指定 120 像素的“理想”列宽,而实际项目的宽度小于该值。因此系统认为您可以将 3 列放入宽度为 400px 的容器中,并相应地布置前两列。

    这是来自https://developer.mozilla.org/en-US/docs/Web/CSS/column-width的一些信息

    column-width CSS 属性设置理想的列宽 多列布局。容器将有尽可能多的列 适合没有任何宽度小于列宽的 价值。如果容器的宽度比指定的窄 值,单列的宽度将小于声明的 列宽。

    如果你想确保只有两列,那么给出第二个参数:

    columns: 120px 2;
    

    .flex-container {
      height: 500px;
      width: 400px;
      border: 1px solid blue;
      columns: 120px 2;
      padding: 10px;
    }
    
    .flex-item {
      background: OliveDrab;
      padding: 5px;
      width: 100px;
      height: 100px;
      line-height: 100px;
      color: white;
      text-align: center;
      break-inside: avoid-column;
    }
    <div class="flex-container">
      <div class="flex-item">1</div>
      <div class="flex-item">2</div>
    </div>

    【讨论】:

    • 诀窍是 column-width:120px 不受尊重。它只是使用的最小边界。最终宽度更大
    • @TemaniAfif - 是的,谢谢,虽然我不确定“理想”或“最小边界”的确切定义 - 它在 MDN 文档中被描述为“理想” - 也许这与最小边界?我已经添加了链接和报价,以防对人们有所帮助。
    • 谢谢!这就解释了为什么观察到的行为。在指定列数方面,我不能这样做,因为我希望它取决于宽度,但我猜有固定宽度的列和固定的间隙,但列数灵活is impossible?
    • @Garrett 为我的回答添加了一个解决方案,如果有兴趣
    【解决方案2】:

    列布局有点棘手。如果您阅读与column-width 相关的规范,您可以找到:

    描述了最佳的列宽。实际的列宽可能更宽(以填充可用空间),或更窄(仅当可用空间小于指定的列宽时)。 ref

    从元素中移除宽度并调整容器大小以注意这一点:

    .flex-container {
      width: 400px;
      border: 1px solid blue;
      columns: 120px;
      padding: 10px;
      overflow:hidden;
      resize:horizontal;
    }
    
    .flex-item {
      background: OliveDrab;
      padding: 5px;
      height: 100px;
      line-height: 100px;
      color: white;
      text-align: center;
      break-inside: avoid-column;
    }
    <div class="flex-container">
      <div class="flex-item">1</div>
      <div class="flex-item">2</div>
    </div>

    您会注意到间隙确实是固定的,但列的宽度在变化。

    您可以在此处找到有关该算法的更多详细信息:https://drafts.csswg.org/css-multicol-1/#pseudo-algorithm


    一种解决方案是考虑使用具有固定列宽的 CSS 网格。诀窍是将网格列的宽度定义为等于间隙+列宽度,然后让容器填充所有列(其宽度将是 间隙+列宽度的乘数)

    调整屏幕大小以查看结果:

    .container {
      display:grid;
      grid-template-columns:repeat(auto-fit,140px); /* 120 + 20 */
      overflow: hidden;
      resize: horizontal;
      border: 1px solid blue;
    
    }
    
    .flex-container {
      grid-column:1/-1;
      column-width: 120px;
      column-gap: 20px;
      padding: 10px;
    }
    
    .flex-item {
      background: OliveDrab;
      padding: 5px;
      height: 100px;
      line-height: 100px;
      color: white;
      text-align: center;
      break-inside: avoid-column;
    }
    <div class="container">
      <div class="flex-container">
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
        <div class="flex-item">5</div>
        <div class="flex-item">6</div>
        <div class="flex-item">7</div>
        <div class="flex-item">8</div>
        <div class="flex-item">9</div>
        <div class="flex-item">10</div>
      </div>
    </div>

    【讨论】:

    • 太棒了!我必须在项目中添加 overflow: hidden 作为 Firefox 错误的解决方法(详细信息 here)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2022-11-18
    • 2022-11-24
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多