【问题标题】:Balance objects over two columns using CSS column-count: 2 in Chrome使用 CSS column-count: 2 在 Chrome 中平衡两列上的对象
【发布时间】:2019-01-16 16:34:33
【问题描述】:

我创建了一个仪表板解决方案,其中高度不断变化的对象堆叠在两列中。目标是将对象分布在列上,如下所示:

  1. 第一个对象在第一列的左上角
  2. 下一个对象低于该对象,除非没有足够的空间容纳对象的整个高度,如果对象不适合,则将其放在第二列中。
  3. 如果对象不适合第二列中的可用空间,则将对象分布在列上以实现高度相同的两列并使容器 div 可滚动。

对象没有固定的高度,一个对象可以在星期一为空,而在星期二占据整个左列。

我创建了以下内容:

<div id='container'>
  <div id='columncontainer'>
    <span id='span1'>Block1</span>
    <span id='span2'>Block2</span>
    <span id='span3'>Block3</span>
  </div>
</div>

.

#container{
  overflow-y: auto;
  height: 300px;
  width: 400px;
}

#columncontainer {
  column-count: 2;
}

#columncontainer > span {
  width: 100%;
  display: inline-block;
}

#span1 {
  height: 200px;
  width: 200px;
}

#span2 {
  height: 200px;
  width: 200px;
}

#span3 {
  height: 50px;
  width: 200px;
}

我在此解决方案中遇到的问题在此处演示并出现在 Chrome 浏览器中: https://jsfiddle.net/3620qgvs/

在此示例中,列中的最后两个对象很容易适合第二列 (200+50=250

但是,前两个对象在第一列中呈现,而高度为 50px 的 #span2 具有第二列的整个 300px。

我确实想将对象放在一起,所以使用块而不是 inline-block 不是一个选项。 (这会将对象分成两列)

我尝试过的将对象放在(浮动)线或(弹性)网格上的实现都有同样的问题;如果左列中有两个高度较大的对象,则右列中的两个高度较小的对象之间会有很多垂直空白(此处演示的块 2 和 4 之间的空白:https://jsfiddle.net/3kd9r8ye/2/)。这就是我使用列计数的原因,因为它的功能类似于“float: down”(不存在)

任何解决方案或替代方法?

【问题讨论】:

  • 附言。列之间的平衡似乎在 Firefox 和 Edge 中运行良好,而不是在 Chrome 中
  • Block1Block2span id='span1' 相同
  • 这是故意的。它们都应该有 200px 的高度,以便 Block2 将在第二列中呈现,因为 200+200 > 300px 的容器高度。
  • 如果您希望两个块具有相同的高度,您可以使用class 而不是id。在 HTML DOM 中不能有重复的 id。在你的情况下,这实际上不是问题。
  • 是的,感谢您指出这一点,我应该注意到这一点。但实际上,当使用类(我在我的生产代码中)时,问题仍然存在。

标签: html css google-chrome


【解决方案1】:

事实证明,在 Chrome CSS 属性中,“orphans”和“widows”默认设置为 2,而其他浏览器似乎保持为 1。

为了解决我描述的问题,应该在#columncontainer 上添加以下 CSS 属性:

orphans: 1
widows: 1

这将阻止 Chrome 尝试坚持一列。

进一步参考:

drafts.c​​sswg.org 的摘录:

If a block contains fewer lines than the value of widows or orphans, the rule simply becomes that all lines in the block must be kept together.

【讨论】:

    【解决方案2】:

    这是column-count 属性中常见的问题。对于您的问题,您可以使用以下解决方案,该解决方案适用于极少数css changes,而且我在您的问题中注意到您复制了导致 HTML 无效的元素 id。所以以后避免它,使用css classes

    #container {
      overflow-y: auto;
      height: 300px;
      width: 400px;
      border: 1px solid black;
    }
    
    #columncontainer {
      /* column-count: 2;*/
      border: 1px solid red;
      width: 100%;
    }
    
    #columncontainer>span {
      /*width: 100%;*/
      display: inline-block;
      background-color: #CCCC;
      margin: 5px;
      border: 1px solid blue;
      width: calc(50% - 15px);
    }
    
    .block1,
    .block2 {
      height: 200px;
      width: 200px;
    }
    
    .block3 {
      height: 50px;
      width: 200px;
    }
    <div id='container'>
    
      <div id='columncontainer'>
        <span id='span1' class="block1">Block1</span>
        <span id='span2' class="block2">Block2</span>
        <span id='span3' class="block3">Block3</span>
      </div>
    
    </div>

    【讨论】:

    • 感谢您的示例,但是此设置会导致另一个问题。由于对象现在在网格上,如果块 1 和 2 的高度不同,将会有很多空白,请在这个小提琴中检查块 2 和 4 之间的空白:jsfiddle.net/3kd9r8ye/2 这就是我使用列计数设置的原因.高度是可变的,宽度是恒定的(例如 50%)。我需要类似你的解决方案,但使用“float:down”而不是从左到右,这似乎不存在
    • 现在我明白了。这仍然是一个神秘的代码。我不明白为什么订单会与兄弟元素混淆。我正在努力。我会更新答案让你知道
    • 查看此示例。但这不适用于动态内容。 gridbyexample.com/examples/example32
    • 因为这对我来说毫无意义,所以我将其报告为错误:bugs.chromium.org/p/chromium/issues/detail?id=922660
    • 这是一个聪明的工作。有时你可以得到js的一些帮助并实现它。
    猜你喜欢
    • 2014-06-03
    • 2015-03-28
    • 2018-12-10
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多