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

Tim*_*mwi 251 html css css-multicolumn-layout

请考虑以下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>
Run Code Online (Sandbox Code Playgroud)

和以下CSS:

.x {
    -moz-column-count: 3;
    column-count: 3;
    width: 30em;
}
Run Code Online (Sandbox Code Playgroud)

目前,Firefox目前的渲染类似于以下内容:

• Number one    • Number three          bit longer
• Number two    • Number four is a    • Number five
Run Code Online (Sandbox Code Playgroud)

请注意,第四个项目在第二列和第三列之间分开.我该如何预防呢?

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

• Number one    • Number four is a
• Number two      bit longer
• Number three  • Number five
Run Code Online (Sandbox Code Playgroud)

要么

• Number one    • Number three        • Number five
• Number two    • Number four is a
                  bit longer
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*kel 363

执行此操作的正确方法是使用break-inside CSS属性:

.x li {
    break-inside: avoid-column;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,目前没有浏览器支持此功 使用Chrome,我可以使用以下内容,但我无法为Firefox做任何工作(参见错误549114):

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

.x ul {
    margin: 0;
}

.x li {
    -webkit-column-break-inside: avoid;
    -moz-column-break-inside:avoid;
    -moz-page-break-inside:avoid;
    page-break-inside: avoid;
    break-inside: avoid-column;
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以为Firefox执行的解决方法是将非破坏性内容包装在表中,但如果您可以避免它,这是一个非常非常糟糕的解决方案.

UPDATE

根据上面提到的错误报告,Firefox 20+支持page-break-inside: avoid作为避免元素内部列断裂的机制,但下面的代码片段表明它仍然无法使用列表:

<div class='x'>
    <ul>
        <li>Number one, one, one, one, one</li>
        <li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>
        <li>Number three</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)
.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+ */
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,你可以这样做overflow: hidden,display: inline-block但是这会删除原始问题中显示的子弹.您的解决方案将根据您的目标而有所不同.

更新2由于Firefox没有阻止打破display:tabledisplay:inline-block一个可靠的,但非语义的解决办法是换每个项目在其自己的列表,并应用该样式规则有:

<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>
Run Code Online (Sandbox Code Playgroud)
.x li {
    break-inside: avoid-column;
}
Run Code Online (Sandbox Code Playgroud)

  • 在2014年,正确的语法似乎是:```-webkit-column-break-inside:avoid; -moz柱断裂-内:避免; -o-柱断裂-内:避免; -MS-柱断裂-内:避免; 列突破内部:避免; ``` (23认同)
  • 这有点晚了,但由于这仍然是2018年的一个问题,这可能对其他人来说很有用.如果有人在浏览器之间仍然存在错误,那么`overflow:hidden`是更好的选择.不幸的是,`display:inline-block;`导致Chrome出现新的怪癖. (5认同)
  • 我相信Opera 11.5支持`break-inside:avoid-column` (4认同)
  • @CarlesJoveBuxeda在Firefox 31中没有看到任何改进.无论是在内部使用column-break-inside还是使用page-break-inside(带或不带前缀)都没有效果. (3认同)
  • 看[评论15](https://bugzilla.mozilla.org/show_bug.cgi?id=549114#c15)`page-break-inside:avoid`应该在FF 20中工作. (2认同)
  • 在 **Firefox 97.0.1** 上测试,“break-inside:void-column;”工作完美。 (2认同)

小智 165

添加;

display: inline-block;
Run Code Online (Sandbox Code Playgroud)

子元素将阻止它们在列之间分割.

  • 适用于我的`<li>`但我必须添加`width:100%;`以防止它们水平堆叠. (6认同)
  • 此解决方案删除了​​列表项,因此如果您使用订单列表,则这不是替代方案。 (3认同)
  • 这很好。防止 inline-block 的不良行为导致内容现在在一行上被压扁(如果它们太短)的一种可能方法是用 `display:block` 元素进一步包装它。目前这可能是一个可靠的 Firefox 解决方法。 (2认同)

小智 46

设置跟随您不想破坏的元素的样式:

overflow: hidden; /* fix for Firefox */
break-inside: avoid-column;
-webkit-column-break-inside: avoid;
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但我不明白为什么? (3认同)

Ver*_*ain 23

截至2014年10月,在Firefox和IE 10-11中,内容似乎仍然存在问题.但是,添加溢出:隐藏到元素,以及break-inside:避免,似乎使它在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;
Run Code Online (Sandbox Code Playgroud)


小智 11

Firefox现在支持这个:

page-break-inside: avoid;
Run Code Online (Sandbox Code Playgroud)

这解决了元素跨列的问题.


kei*_*ant 9

接受的答案现在已经两年了,事情似乎发生了变化.

本文介绍了该column-break-inside属性的用法.我不能说这是怎么或为什么不同break-inside,因为只有后者似乎记录在W3规范中.但是,Chrome和Firefox支持以下内容:

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
}
Run Code Online (Sandbox Code Playgroud)


Séb*_*uel 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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


小智 7

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

我用它修复了它

 display: inline-flex ;
 column-break-inside: avoid;
 width:100%;
Run Code Online (Sandbox Code Playgroud)


小智 5

以下代码可防止元素内出现分栏:

-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
-o-column-break-inside: avoid;
-ms-column-break-inside: avoid;
column-break-inside: avoid;
Run Code Online (Sandbox Code Playgroud)