考虑下面的HTML:

<div class='x'>
    <ul>
        <li>Number one</li>
        <li>Number two</li>
        <li>Number three</li>
        <li>Number four is a bit longer</li>
        <li>Number five</li>
    </ul>
</div>

和以下CSS:

.x {
    -moz-column-count: 3;
    column-count: 3;
    width: 30em;
}

就目前情况来看,Firefox当前的渲染方式如下:

• Number one    • Number three          bit longer
• Number two    • Number four is a    • Number five

请注意,第四项在第二列和第三列之间被分割了。我该如何预防呢?

所需的渲染可能看起来更像:

• Number one    • Number four is a
• Number two      bit longer
• Number three  • Number five

or

• Number one    • Number three        • Number five
• Number two    • Number four is a
                  bit longer

编辑:宽度仅用于演示不需要的渲染。在实际情况下,当然没有固定的宽度。


当前回答

我想我也遇到了同样的问题,并找到了解决方案:

-webkit-column-fill: auto; /* Chrome, Safari, Opera */
-moz-column-fill: auto; /* Firefox */
column-fill: auto;  

也工作在FF 38.0.5: http://jsfiddle.net/rkzj8qnv/

其他回答

<style>
ul li{display: table;}  
</style>

完美的作品

正确的方法是使用break-inside CSS属性:

.x li {
    break-inside: avoid-column;
}

不幸的是,截至2021年10月,Firefox仍然不支持这一功能,但其他主要浏览器都支持。使用Chrome,我可以使用上面的代码,但我不能让任何东西在Firefox上工作(见Bug 549114)。

如果有必要的话,Firefox的解决方法是将不中断的内容包装在一个表中,但如果可以避免的话,这是一个非常非常糟糕的解决方案。

更新

根据上面提到的错误报告,Firefox 20+支持page-break-inside: avoid作为一种机制来避免元素内部的换行,但下面的代码片段表明它仍然不能用于列表:

以下方式{ column-count: 3; 宽度:30 em; } .x ul { 保证金:0; } .x li { -webkit-column-break-inside:避免; -moz-column-break-inside:避免; -moz-page-break-inside:避免; page-break-inside:避免; break-inside:避免柱子; } < div class = ' x ' > < ul > <li>数字一,一,一,一,一</li> <li>数字二,二,二,二,二,二,二,二,二,二,二,二,二,二</li> <李> 3号李< / > < / ul > < / div >

正如其他人提到的,您可以使用overflow: hidden或display: inline-block,但这将删除原始问题中显示的项目符号。你的解决方案会根据你的目标而有所不同。

更新2由于Firefox确实防止了display:table和display:inline-block的破坏,一个可靠但非语义的解决方案是将每个列表项包装在自己的列表中,并在那里应用样式规则:

.x { -moz-column-count: 3; -webkit-column-count: 3; column-count: 3; width: 30em; } .x ul { margin: 0; page-break-inside: avoid; /* Theoretically FF 20+ */ break-inside: avoid-column; /* Chrome, Safari, IE 11 */ display:table; /* Actually FF 20+ */ } <div class='x'> <ul> <li>Number one, one, one, one, one</li> </ul> <ul> <li>Number two, two, two, two, two, two, two, two, two, two, two, two</li> </ul> <ul> <li>Number three</li> </ul> </div>

Firefox现在支持这个:

page-break-inside: avoid;

这解决了元素在列之间断开的问题。

我只是通过添加修正了一些div被分割到下一列

overflow: auto

给孩子们。

*意识到它只修复它在Firefox!

公认的答案已经过去两年了,而且情况似乎已经发生了变化。

本文解释了column-break-inside属性的用法。我不能说这与内部破解有何不同,因为只有后者在W3规范中被记录了下来。然而,Chrome和Firefox支持以下功能:

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
}