Làm thế nào để ngăn chặn phá vỡ cột trong một yếu tố?


272

Hãy xem xét HTML sau:

<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>

và CSS sau:

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

Như hiện tại, Firefox hiện biểu hiện điều này tương tự như sau:

 Number one     Number three          bit longer
 Number two     Number four is a     Number five

Lưu ý rằng mục thứ tư được phân chia giữa cột thứ hai và thứ ba. Làm thế nào để tôi ngăn chặn điều đó?

Kết xuất mong muốn có thể trông giống như:

 Number one     Number four is a
 Number two      bit longer
 Number three   Number five

hoặc là

 Number one     Number three         Number five
 Number two     Number four is a
                  bit longer

Chỉnh sửa: Chiều rộng chỉ được chỉ định để thể hiện kết xuất không mong muốn. Trong trường hợp thực tế, tất nhiên không có chiều rộng cố định.


bạn đã thử cho li đó một phong cách độc lập chưa? như <li style = "width: ??? px"> Số bốn dài hơn một chút </ li> ??? px = chiều rộng cần thiết để phù hợp với số bốn đó.
rmagnum2002

Câu trả lời:


397

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: avoidnhư 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:

Như những người khác đề cập, bạn có thể làm overflow: hiddenhoặc display: inline-blocknhư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:tabledisplay:inline-blockmộ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>


4
Tôi tin rằng Opera 11,5 hỗ trợbreak-inside: avoid-column
Alohci

2
Nhìn vào Comment 15 page-break-inside:avoid nên hoạt động trong FF 20.
Brian Nickel

23
Vào năm 2014, cú pháp đúng dường như là: -webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
Carles Jove i Buxeda

3
@CarlesJoveBuxeda Không thấy bất kỳ cải thiện nào trong Firefox 31. Cả hai cột ngắt trong hoặc ngắt trang (có hoặc không có tiền tố) đều hoạt động.
Brian Nickel

6
Hơi muộn một chút, nhưng vì đây vẫn là một vấn đề trong năm 2018, điều này có thể hữu ích cho những người khác kết thúc ở đây. Nếu bất cứ ai vẫn gặp lỗi giữa các trình duyệt với điều này, overflow: hiddenlà lựa chọn tốt hơn. display: inline-block;Thật không may, gây ra những điều kỳ quặc mới với Chrome.
SilasOtoko

170

Thêm;

display: inline-block;

các phần tử con sẽ ngăn chúng được phân chia giữa các cột.


1
Điều này là tốt Một cách khả thi để ngăn chặn hành vi xấu của khối nội tuyến khiến công cụ hiện bị cắt xén trên một dòng (nếu chúng quá ngắn) là tiếp tục bọc display:blockphần tử này bằng một phần tử. Điều này có thể sẽ là một cách giải quyết Firefox vững chắc cho đến bây giờ.
Steven Lu

Giải pháp này sẽ loại bỏ mục danh sách, vì vậy nếu bạn đang sử dụng danh sách đơn hàng chẳng hạn thì đây sẽ không phải là một giải pháp thay thế.
Ricardo Zea

Hoạt động hoàn hảo để tách các đoạn văn thành các cột.
ChrisC

đối với các mục danh sách, điều này có thể hoạt động nếu bạn nhúng nội dung của mục danh sách (li) trong phần tử "span" được đặt với "display: inline-block". Tình huống phức tạp hơn nhiều nếu bạn muốn kiểm soát nơi phá vỡ các trang hoặc cột trong các bảng: bạn muốn tránh các ngắt trong các hàng của bảng (tr). Thực sự, bố cục nhiều cột vẫn khó thiết lập, nhưng chúng tôi cần nó để cho phép các trang web thích ứng với màn hình rất hẹp (như điện thoại thông minh) và màn hình rộng (trong đó các cột rất hẹp thực sự không công bằng.
verdy_p

7
Hoạt động cho tôi <li>nhưng tôi đã phải thêm width:100%;để ngăn chặn chúng xếp theo chiều ngang.
Justin

47

đặt theo kiểu của phần tử mà bạn không muốn ngắt:

overflow: hidden; /* fix for Firefox */
break-inside: avoid-column;
-webkit-column-break-inside: avoid;

1
Cảm ơn bạn!! Tôi đã có vấn đề với FF và điều này sửa nó!
Francis Perron

Tôi cũng vậy. Các giải pháp trên không hiệu quả với tôi, nhưng bạn đã làm. Thanh danh!
Maxx

Điều này không hoạt động trên FF và nó không thực sự che giấu nội dung của tôi!
Justin

đẹp. làm việc cho đoạn văn bản colum là tốt. Đã thêm tràn: ẩn vào <p> ind <div> với các cột. Hoạt động cho FF.
dichterDichter

1
Trên thực tế, overflow:hiddenquy tắc này không phải là một sửa chữa cho các quy tắc khác, nó nguyên nhân gây ra bố cục không phá vỡ Bẻ khóa
Gras Double

23

Kể từ tháng 10 năm 2014, đột nhập dường như vẫn có lỗi trong Firefox và IE 10-11. Tuy nhiên, việc thêm tràn: ẩn vào phần tử, cùng với phần đột phá: tránh, dường như làm cho nó hoạt động trong Firefox và IE 10-11. Tôi hiện đang sử dụng:

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;

Đây dường như là danh sách đầy đủ nhất
binaryfunt

12

Firefox hiện hỗ trợ điều này:

page-break-inside: avoid;

Điều này giải quyết vấn đề của các yếu tố phá vỡ các cột.


Bạn đã làm việc này chưa? Tôi đang xem fiddle này trong FF 22 và nó không hoạt động: jsfiddle.net/bnickel/5qwMf
Brian Nickel

Tương tự ở đây, không hoạt động trong Firefox 22. Ngoài ra, Fireorms chỉ hiển thị page-break-before:hoặc page-break-after:khôngpage-break-inside:
Ricardo Zea

Phiên bản 28 của Firefox. Đây là người duy nhất làm việc cho tôi, cảm ơn!
Sander Verhagen

9

Câu trả lời được chấp nhận bây giờ đã hai tuổi và mọi thứ dường như đã thay đổi.

Bài viết này giải thích việc sử dụng column-break-insidetài sản. Tôi không thể nói làm thế nào hoặc tại sao điều này khác với break-inside, bởi vì chỉ cái sau dường như được ghi lại trong thông số W3. Tuy nhiên, Chrome và Firefox hỗ trợ như sau:

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
}

Điều này không hoạt động đối với <div class = "a"> trong đó "a" thay thế "Li" của bạn ở trên. Các div vẫn phá vỡ bên trong. FF 26
Nasser

Không phải là một lỗi. mã ở trên là chính xác cho chức năng được mô tả ngay cả khi bộ chọn của nó chỉ dành cho một phần tử li. Bạn vẫn có thể sử dụng một bộ chọn CSS khác "div.a {...}" thay vì "li {...}" trong mẫu này.
verdy_p

Tuy nhiên, Chrome vẫn không hỗ trợ -webkit-cột-break-Inside: tránh; trên một hàng của bảng: điều này không hoạt động và chúng tôi vẫn không thể tránh phá vỡ các bảng ở các vị trí xấu (đáng chú ý là nếu một ô câu chuyện không chỉ chứa văn bản mà là các biểu tượng; nhưng Chrome cũng xuất hiện để phân tách ở bất kỳ vị trí dọc nào ở giữa một dòng văn bản , phá vỡ văn bản với phần trên của glyphs văn bản ở dưới cùng của cột đầu tiên và phần dưới của glyphs văn bản ở trên cùng của cột tiếp theo !!! Kết quả là hoàn toàn không thể đọc được !!!
verdy_p

Kể từ năm 2017, đột phá cột bên trong dường như không phải là một thuộc tính css hợp lệ. MDN chỉ nói "Edge cũng hỗ trợ biến thể bên trong -webkit-cột-break-Inside không chuẩn".
Jacob C. nói Phục hồi Monica

9

Điều này làm việc cho tôi vào năm 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;
}
<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>


Đây là hoạt động đối với tôi trên ulyếu tố này, được đăng tải trên CSS thủ đoạn: css-tricks.com/almanac/properties/b/break-inside , và dường như chính xác dựa trên ghi chú tương thích caniuse: "hỗ trợ một phần đề cập đến không hỗ trợ break-before, break-after, break-insidetính chất Các trình duyệt dựa trên WebKit và Blink có hỗ trợ tương đương cho các -webkit-column-break-*thuộc tính không chuẩn để thực hiện cùng một kết quả (nhưng chỉ các giá trị autoalways). Firefox không hỗ trợ break-*nhưng không hỗ trợ các page-break-*thuộc tính để thực hiện cùng một kết quả. "
nabrown

3

Đoạn mã sau hoạt động để ngăn chặn các ngắt cột bên trong các phần tử:

-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
-o-column-break-inside: avoid;
-ms-column-break-inside: avoid;
column-break-inside: avoid;

3

Năm 2019, việc này hoạt động với tôi trên Chrome, Firefox và Opera (sau nhiều nỗ lực không thành công khác):

.content {
    margin: 0;
    -webkit-column-break-inside: avoid;
    break-inside: avoid;
    break-inside: avoid-column;
}

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
           break-inside: avoid-column;
             page-break-inside: avoid;
}

2

Firefox 26 dường như yêu cầu

page-break-inside: avoid;

Và Chrome 32 cần

-webkit-column-break-inside:avoid;
   -moz-column-break-inside:avoid;
        column-break-inside:avoid;

2

Tôi đã có cùng một vấn đề tôi nghĩ và tìm thấy một giải pháp trong việc này:

-webkit-column-fill: auto; /* Chrome, Safari, Opera */
-moz-column-fill: auto; /* Firefox */
column-fill: auto;  

Cũng hoạt động trong FF 38.0.5: http://jsfiddle.net/rkzj8qnv/


Giải pháp này giúp tôi
OzzyC817

1

Một cách giải quyết khả thi cho Firefox là đặt "hiển thị" thuộc tính CSS của phần tử mà bạn không muốn có một dấu ngắt bên trong thành "bảng". Tôi không biết nếu nó hoạt động cho thẻ LI (có thể bạn sẽ mất kiểu danh sách -item), nhưng nó hoạt động cho thẻ P.


Giải pháp này sẽ loại bỏ mục danh sách, vì vậy nếu bạn đang sử dụng danh sách đơn hàng chẳng hạn thì đây sẽ không phải là một giải pháp thay thế.
Ricardo Zea

1

Tôi chỉ sửa một số divs đang tách trên cột tiếp theo bằng cách thêm

overflow: auto

cho đứa trẻ div s.

* Nhận ra nó chỉ sửa nó trong Firefox!


1

Tôi gặp vấn đề tương tự trong khi sử dụng cột thẻ

tôi đã sửa nó bằng

 display: inline-flex ;
 column-break-inside: avoid;
 width:100%;

1
<style>
ul li{display: table;}  
</style>

hoạt động hoàn hảo


0

Tôi đã thực hiện một bản cập nhật của câu trả lời thực tế.

Điều này dường như đang hoạt động trên firefox và chrome: http://jsfiddle.net/gatsbimantico/QJeB7/1/embedded/result/

.x{
columns: 5em;
-webkit-columns: 5em; /* Safari and Chrome */
-moz-columns: 5em; /* Firefox */
}
.x li{
    float:left;
    break-inside: avoid-column;
    -webkit-column-break-inside: avoid;  /* Safari and Chrome */
}

Lưu ý: Các phao bất động sản dường như là một làm cho hành vi khối.


0

Câu trả lời này chỉ có thể áp dụng cho một số trường hợp nhất định; Nếu bạn đặt chiều cao cho các thành phần của mình, điều này sẽ được tuân theo kiểu dáng cột. Ở đó - bằng cách giữ bất cứ thứ gì có trong chiều cao đó thành một hàng.

Tôi đã có một danh sách, như op, nhưng nó chứa hai yếu tố, vật phẩm và nút để hành động theo những vật phẩm đó. Tôi coi đó như một bảng <ul> - table, <li> - table-row, <div> - table-cellđặt UL trong một bố cục 4 cột. Các cột đôi khi được phân chia giữa các mục và các nút của nó. Thủ thuật tôi đã sử dụng là cung cấp cho các phần tử Div chiều cao dòng để che các nút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.