【问题标题】:CSS column-count columns differ in heightCSS column-count 列的高度不同
【发布时间】:2013-11-16 11:34:09
【问题描述】:

我正在尝试创建一个图像的砌体网格一般的想法是使用 column-count in 来实现this example

我有三列包含一堆图像,CSS 和 HTML 与链接中的相同。问题是列不能正确对齐。最右边的列通常比其他列短得多。显然,除非图像大小相同,否则列永远不会完美对齐,但差异远大于此。有时前两列各包含十个图像,但第三列仅包含两个(图像大小相似),这意味着您可以轻松地将一些图像从第一列和第二列移动到第三列以获得更好的对齐.这个结果似乎与列数的想法背道而驰。

如果您将某些图像更改为小得多的图像,上述链接也会发生这种情况。仅仅是列计数仍然存在问题且不应使用,还是有一些技巧可以阻止这种情况发生?

编辑:这是基本的 CSS(减去许多基本样式,如过渡和其他东西,我试图将其删除以查看它们是否是罪魁祸首)。

#wrapper {
    width: 90%;
    max-width: 1100px;
    min-width: 800px;
    margin: 50px auto;
}

#columns {
    -webkit-column-count: 4;
    -webkit-column-gap: 10px;
    -webkit-column-fill: auto;
    -moz-column-count: 4;
    -moz-column-gap: 10px;
    -moz-column-fill: auto;
    column-count: 4;
    column-gap: 15px;
    column-fill: auto;
}

.pin {
    display: inline-block;
    background: #FEFEFE;
    border: 2px solid #FAFAFA;
    box-shadow: 0 1px 2px rgba(34, 25, 25, 0.4);
    margin: 0 2px 15px;
    -webkit-column-break-inside: avoid;
    -moz-column-break-inside: avoid;
    column-break-inside: avoid;
    padding: 15px;
    padding-bottom: 5px;
}

here is a JSFiddle 显示了问题。有四列,但在 Chrome 中,第三列比它需要的要短,图像可以从第四列移动以使它们更均匀。请注意,这个例子“没有那么糟糕”,但问题可能比这大得多。有时差值等于几张图片的大小。

【问题讨论】:

  • 我没有答案,但我可以告诉你,列数没有问题,它是自 2011 年以来的 w3c 候选人推荐。w3.org/TR/css3-multicol
  • 很好知道。也许我不明白它是如何工作的,但这是预期的行为似乎很奇怪。在某些情况下,它甚至不会使用所有列,它会完全跳过最后一列,以使其他列保持平衡。

标签: css css-multicolumn-layout column-count


【解决方案1】:

你应该尝试使用

column-fill: balance;
-moz-column-fill: balance;
-webkit-column-fill: balance;

来源:https://www.w3.org/TR/css-multicol-1/#cf

您的 JSFiddle 并没有太大变化,因为列是按此 column-count CSS 属性顺序填充的,因此元素的顺序保持不变。因此,如果您确实先有大图像,然后是由小图像组成的列,那么您可能会有不同大小的列。

column-fill: balance; 属性无法发挥作用,因为它无法更改顺序。

如果您想调整元素的顺序以使列的长度(或多或少)相等,请使用 JavaScript。

【讨论】:

  • 感谢您的回答,但余额是默认的列填充值,因此设置它不会改变任何内容。在上面的小提琴中尝试一下,你会看到。
  • 等等,我的错。我把它设置为自动,不是什么都没有。不过似乎仍然没有改变任何东西:(
  • 确实...还无法找到解决方案。你可以肯定你不会得到一个完美的对齐,不如 javascript,因为它是计算如何填充列的浏览器。此外,您可能会遇到浏览器之间的巨大差异。
  • 好吧,当事物的大小不同时,就没有完美的东西,但我会接受“不是屏幕的一半”。 :) W3Schools 声称任何浏览器都没有正确支持列填充,所以我想这可能是列工作的情况,但不是所有设置。
  • 我想我明白了。这实际上并没有什么问题。列按顺序填充,因此元素的顺序保持不变。你有大量的图像,最后一列是小图像。所以无论你尝试做什么,如果你不能改变图像的顺序,你就无法得到更好的结果!
【解决方案2】:

确保列中的直接子项没有填充、边距或边框。

IE 如果使用 ul 和 li,请确保 li 上没有填充、边距或边框,如果需要将其放在嵌套元素上。

我知道这是旧的,但我无法在任何地方找到这个答案,希望这对某人有帮助:) 它确实困扰了我!

【讨论】:

    【解决方案3】:

    您可能必须使用此 Javascript

    var tallest=0;
    
    $(document).ready(function() {
        $('.pin').each(function(){
            if($(this).height() > tallest)
               tallest = $(this).height();
        });
        $('.pin').css('height', tallest + 'px');
    });
    

    参考:Matching column height in 2column layout

    否则,只需在“pin”类中设置一个静态高度

    【讨论】:

    • 感谢您的输入,但这将提供完全不同的布局(无需使用 javascript 即可创建)。
    • 对不起,我好像误解了你的意思。我认为您希望所有列的高度相同,并设置 column-fill: balance;在这一点上没有帮助,所以我建议你使用这个 Javascript。感谢您的评论。
    猜你喜欢
    • 2018-12-10
    • 2014-12-07
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多