Cách chính xác để làm điều này là với thuộc tính CSS đột phá :
.x li {
break-inside: avoid-column;
}
Thật không may, kể từ tháng 10 năm 2019, điều này không được hỗ trợ trong Firefox nhưng nó được hỗ trợ bởi mọi trình duyệt lớn khác . Với Chrome, tôi đã có thể sử dụng mã ở trên, nhưng tôi không thể làm bất cứ điều gì hoạt động cho Firefox ( Xem Bug 549114 ).
Cách giải quyết bạn có thể làm cho Firefox nếu cần là bọc nội dung không vi phạm của bạn trong một bảng nhưng đó là một giải pháp thực sự, thực sự khủng khiếp nếu bạn có thể tránh được.
CẬP NHẬT
Theo báo cáo lỗi được đề cập ở trên, Firefox 20+ hỗ trợ page-break-inside: avoid
như một cơ chế để tránh phá vỡ cột bên trong một phần tử nhưng đoạn mã dưới đây cho thấy nó vẫn không hoạt động với danh sách:
.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>
Như những người khác đề cập, bạn có thể làm overflow: hidden
hoặc display: inline-block
nhưng điều này sẽ loại bỏ các viên đạn được hiển thị trong câu hỏi ban đầu. Giải pháp của bạn sẽ thay đổi dựa trên mục tiêu của bạn là gì.
CẬP NHẬT 2 Vì Firefox không ngăn chặn được display:table
và display:inline-block
một giải pháp đáng tin cậy nhưng không có ngữ nghĩa sẽ là bọc từng mục danh sách trong danh sách riêng của mình và áp dụng quy tắc kiểu ở đó:
.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>