考虑下面的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

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


当前回答

对于Firefox来说,一个可能的解决方法是将CSS属性“display”设置为“table”,即您不希望在元素内部有断点的元素。我不知道它是否适用于LI标记(您可能会丢失list -item样式),但它适用于P标记。

其他回答

正确的方法是使用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和chrome: http://jsfiddle.net/gatsbimantico/QJeB7/1/embedded/result/

.x{
columns: 5em;
-webkit-columns: 5em; /* Safari and Chrome */
-moz-columns: 5em; /* Firefox */
}
.x li{
    float:left;
    break-inside: avoid-column;
    -webkit-column-break-inside: avoid;  /* Safari and Chrome */
}

注意:float属性似乎是导致块行为的原因。

火狐26似乎需要

page-break-inside: avoid;

Chrome 32需要

-webkit-column-break-inside:avoid;
   -moz-column-break-inside:avoid;
        column-break-inside:avoid;

下面的代码可以防止元素内部的换行:

-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
-o-column-break-inside: avoid;
-ms-column-break-inside: avoid;
column-break-inside: avoid;

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

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

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