Правильний спосіб це зробити за допомогою властивості CSS, що проривається :
.x li {
break-inside: avoid-column;
}
На жаль, станом на жовтень 2019 року це не підтримується у Firefox, але його підтримує кожен інший головний браузер . За допомогою Chrome я зміг скористатись вищевказаним кодом, але я не зміг зробити щось для Firefox ( див. Bug 549114 ).
Вирішення, яке ви можете зробити для Firefox, якщо це необхідно, - це загорнути нерозривний вміст у таблицю, але це дійсно, дуже жахливе рішення, якщо ви можете цього уникнути.
ОНОВЛЕННЯ
Згідно згаданим вище звітом про помилку, Firefox 20+ підтримує page-break-inside: avoid
механізм уникнення розривів стовпців всередині елемента, але наведений нижче фрагмент коду демонструє, що він все ще не працює зі списками:
.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;
}
<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>
Як відзначають інші, ви можете зробити overflow: hidden
або , display: inline-block
але це знімає кулі , зазначені в первісному питанні. Ваше рішення варіюватиме залежно від ваших цілей.
UPDATE 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>