如何防止元素内的列中断?


272

考虑以下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

要么

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

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


您是否尝试过给他李一个独立的风格?像<li style =“ width:??? px”>第四个数字要长一点</ li> ??? px =需要的宽度才能适合该第四个数字。
rmagnum2002 2011年

Answers:


397

正确的方法是使用闯入式CSS属性

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

不幸的是,截至2019年10月,Firefox不支持此功能,其他所有主流浏览器均支持此功能。使用Chrome,我可以使用上面的代码,但是不能使Firefox正常运行(请参见Bug 549114)。

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

更新

根据上面提到的错误报告,Firefox 20+支持page-break-inside: avoid作为一种机制来避免元素内的列中断,但是下面的代码片段展示了Firefox 20+ 仍然无法使用列表:

正如其他人所提到的,您可以这样做overflow: hiddendisplay: 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;
    -webkit-column-break-inside: avoid; /* Chrome, Safari */
    page-break-inside: avoid;           /* Theoretically FF 20+ */
    break-inside: avoid-column;         /* 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>


4
我相信Opera 11.5支持break-inside: avoid-column
Alohci 2011年

2
看着意见15 page-break-inside:avoid中FF 20应该工作
布赖恩镍

23
在2014年,正确的语法似乎是: -webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
Carles Jove i Buxeda,2014年

3
@CarlesJoveBuxeda在Firefox 31中看不到任何改进。column-break-inside或page-break-inside(带有或不带有前缀)均不起作用。
布赖恩·尼克

6
有点晚了,但是由于这仍然是2018年的问题,这可能对最终来到这里的其他人有用。如果有人在此之间仍然存在浏览器之间的错误,overflow: hidden则是更好的选择。display: inline-block;不幸的是,这会导致Chrome出现新问题。
SilasOtoko

170

添加;

display: inline-block;

子元素将阻止它们在列之间拆分。


1
很好 防止内联块的不良行为导致东西现在被压在一行上(如果它们太短的话)的一种可能方法是用一个display:block元素进一步包装它。目前,这可能是可靠的Firefox解决方法。
史蒂文·卢

此解决方案将删除列表项,因此,例如,如果您使用的是订单列表,则这不是替代方案。
里卡多·泽

非常适合将段落拆分为列。
克里斯C

对于列表项,如果将列表项(li)的内容嵌入到通过“ display:inline-block”设置的“ span”元素中,则此方法可以起作用。如果要控制在表格中的页面或列的折断位置,情况会更加复杂:您希望避免在表格行(tr)中折断。确实,多列布局仍然难以设置,但是我们需要它来允许站点适应非常窄的屏幕(例如智能手机)和宽屏(其中非常狭窄的colulns确实不公平
。– verdy_p 2014年

7
适用于我,<li>但我必须添加width:100%;以防止它们水平堆叠。
贾斯汀

47

将以下设置为您不想破坏的元素的样式:

overflow: hidden; /* fix for Firefox */
break-inside: avoid-column;
-webkit-column-break-inside: avoid;

1
谢谢!!我在使用FF时遇到问题,并且可以解决此问题!
弗朗西斯·佩隆

我也是。上面的解决方案对我不起作用,但是您的解决了。荣誉!
Maxx 2014年

这确实适用于FF,并且实际上并未隐藏我的内容!
贾斯汀

很好 也适用于colum文本段落。添加了溢出:用列将其隐藏到<div>的<p>中。适用于FF。
dichterDichter

1
事实上,overflow:hidden规则是不为别的规则修正,这什么原因造成的不间断布局...
鹅肝双

23

截至2014年10月,Firefox和IE 10-11的闯入似乎仍然存在漏洞。但是,在元素中添加溢出:隐藏以及侵入:避免,使其在Firefox和IE 10-11中都能正常工作。我目前正在使用:

overflow: hidden; /* Fix for firefox and IE 10-11  */
-webkit-column-break-inside: avoid; /* Chrome, Safari, Opera */
page-break-inside: avoid; /* Firefox */
break-inside: avoid; /* IE 10+ */
break-inside: avoid-column;

这似乎是最详尽的列表
binaryfunt

12

Firefox现在支持此功能:

page-break-inside: avoid;

这解决了元素跨列断裂的问题。


你有这个工作吗?我正在看FF 22中的这个小提琴,它不起作用:jsfiddle.net/bnickel/5qwMf
Brian Nickel

此处相同,在Firefox 22中不起作用。此外,Firebug仅显示page-break-before:page-break-after:不显示page-break-inside:
Ricardo Zea 2013年

Firefox版本28。这是唯一对我有用的,谢谢!
Sander Verhagen 2014年

9

现在公认的答案已经两年了,情况似乎已经改变。

本文介绍了该column-break-inside属性的用法。我不能说这与为何或为何不同break-inside,因为W3规范中似乎只记录了后者。但是,Chrome和Firefox支持以下功能:

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

这对于一般的<div class =“ a”>无效,其中“ a”代替了上面的“ Li”。div仍然在里面。FF 26
Nasser

不是错误。上面的代码对于所描述的函数是正确的,即使其选择器仅用于li元素。在此示例中,您仍然可以使用其他CSS选择器“ div.a {...}”代替“ li {...}”。
verdy_p 2014年

但是Chrome仍然不支持-webkit-column-break-inside:avoid; 在表格行上:这行不通,我们仍然无法避免在坏的位置断开表格(特别是如果一个故事单元格不仅包含文本而且包含图标;但是Chrome似乎也可以在文本行中间的任何垂直位置拆分) ,用第一列底部的文字
标志

截至2017年,column-break-inside似乎不是有效的CSS属性。MDN仅表示“ Edge还支持非标准的-webkit-column-break-inside变体。”
雅各布·C(Jacob C.)说应

9

这对我来说在2015年有效:

li {
  -webkit-column-break-inside: avoid;
  /* Chrome, Safari, Opera */
  page-break-inside: avoid;
  /* Firefox */
  break-inside: avoid;
  /* IE 10+ */
}
.x {
  -moz-column-count: 3;
  column-count: 3;
  width: 30em;
}
<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>


这是为我工作的ul内容,发布在CSS技巧:css-tricks.com/almanac/properties/b/break-inside,并根据caniuse兼容性的说明似乎是正确的:“部分支持指的是不支持的break-beforebreak-afterbreak-inside性质基于WebKit和Blink的浏览器确实对非标准-webkit-column-break-*属性具有相同的支持以实现相同的结果(但仅对autoalways值有效)。Firefox不支持break-*但确实支持这些page-break-*属性以实现相同的结果。”
nabrown

3

以下代码可防止元素内部出现列中断:

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

3

在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;
}

2

Firefox 26似乎需要

page-break-inside: avoid;

和Chrome 32的需求

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

2

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

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

在FF 38.0.5中也可以使用:http : //jsfiddle.net/rkzj8qnv/


此解决方案对我有帮助
OzzyCzech '16

1

Firefox可能的解决方法是将您不想在其中休息的元素的CSS属性“显示”设置为“表”。我不知道它是否适用于LI标签(您可能会丢失列表-item-style),但它适用于P标签。


此解决方案将删除列表项,因此,例如,如果您使用的是订单列表,则这不是替代方案。
里卡多·泽

1

我只是div通过添加修复了一些拆分到下一列的

overflow: auto

给孩子div的。

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


1

使用卡片列时我遇到了同样的问题

我用修复

 display: inline-flex ;
 column-break-inside: avoid;
 width:100%;


0

我更新了实际答案。

这似乎适用于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 */
}

注:浮动属性似乎是一个作为块行为。


0

此答案可能仅适用于某些情况;如果为元素设置高度,则列样式将遵循此高度。从而将包含在该高度内的所有内容保持一行。

我有一个列表,例如op,但是它包含两个元素,项目和操作这些项目的按钮。我对待它像一个表<ul> - table<li> - table-row<div> - table-cell把UL在4列布局。列有时会在项目及其按钮之间拆分。我使用的技巧是为Div元素赋予行高以覆盖按钮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.