Consider the following 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>
and the following CSS:
.x {
-moz-column-count: 3;
column-count: 3;
width: 30em;
}
As it stands, Firefox currently renders this similarly to the following:
• Number one • Number three bit longer
• Number two • Number four is a • Number five
Notice that the fourth item was split between the second and third column. How do I prevent that?
The desired rendering might look something more like:
• 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
Edit: The width is only specified to demonstrate the unwanted rendering. In the real case, of course there is no fixed width.
The accepted answer is now two years old and things appear to have changed.
This article explains the use of the
column-break-inside
property. I can't say how or why this differs frombreak-inside
, because only the latter appears to be documented in the W3 spec. However, the Chrome and Firefox support the following:Adding;
to the child elements will prevent them being split between columns.
works perfectly
Firefox 26 seems to require
And Chrome 32 needs
The correct way to do this is with the break-inside CSS property:
Unfortunately, no browser currently supports this. With Chrome, I was able to use the following, but I couldn't make anything work for Firefox (See Bug 549114):
The workaround you can do for Firefox if necessary is to wrap your non-breaking content in a table but that is a really, really terrible solution if you can avoid it.
UPDATE
According to the bug report mentioned above, Firefox 20+ supports
page-break-inside: avoid
as a mechanism for avoiding column breaks inside an element but the below code snippet demonstrates it still not working with lists:As others mention, you can do
overflow: hidden
ordisplay: inline-block
but this removes the bullets shown in the original question. Your solution will vary based on what your goals are.UPDATE 2 Since Firefox does prevent breaking on
display:table
anddisplay:inline-block
a reliable but non-semantic solution would be to wrap each list item in its own list and apply the style rule there:This works for me in 2015 :