Правильный способ сделать это с помощью CSS-свойства break-inside :
.x li {
break-inside: avoid-column;
}
К сожалению, по состоянию на октябрь 2019 года это не поддерживается в Firefox, но поддерживается всеми другими крупными браузерами . С Chrome я смог использовать приведенный выше код, но не смог заставить что-либо работать для Firefox ( см. Ошибку 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
но это удаляет маркеры, показанные в исходном вопросе. Ваше решение будет зависеть от ваших целей.
ОБНОВЛЕНИЕ 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>