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

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


当前回答

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

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

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

其他回答

这个答案可能只适用于某些情况;如果您为元素设置了高度,列样式将遵循此设置。通过将高度内的所有内容保存为一行。

我有一个像op一样的列表,但它包含两个元素,项目和按钮,用于对这些项目进行操作。我把它当作一个表<ul> - table, <li> - table-row, <div> - table-cell,把ul放在一个4列布局中。这些列有时会被项目和按钮分开。我使用的技巧是给Div元素一个行高来覆盖按钮。

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

overflow: auto

给孩子们。

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

2019年,在Chrome、Firefox和Opera上(在许多其他不成功的尝试之后),这样做对我来说是有效的:

.content {
    margin: 0;
    -webkit-column-break-inside: avoid;
    break-inside: avoid;
    break-inside: avoid-column;
}

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

正确的方法是使用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>

试试这个:

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

...对我有用,也许对你也有用。