Bagaimana mencegah pemutusan kolom dalam suatu elemen?


272

Pertimbangkan HTML berikut:

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

dan CSS berikut:

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

Seperti berdiri, Firefox saat ini membuat ini mirip dengan yang berikut:

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

Perhatikan bahwa item keempat terpecah antara kolom kedua dan ketiga. Bagaimana saya mencegahnya?

Render yang diinginkan mungkin terlihat seperti:

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

atau

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

Sunting: Lebar hanya ditentukan untuk menunjukkan render yang tidak diinginkan. Dalam kasus nyata, tentu saja tidak ada lebar tetap.


Sudahkah Anda mencoba memberikan gaya mandiri itu? seperti <li style = "width: ??? px"> Nomor empat sedikit lebih panjang </li> ??? px = lebar yang dibutuhkan agar sesuai dengan nomor empat.
rmagnum2002

Jawaban:


397

Cara yang benar untuk melakukan ini adalah dengan properti CSS pembobolan :

.x li {
    break-inside: avoid-column;
}

Sayangnya, pada Oktober 2019, ini tidak didukung di Firefox tetapi didukung oleh setiap browser utama lainnya . Dengan Chrome, saya dapat menggunakan kode di atas, tetapi saya tidak dapat membuat apa pun berfungsi untuk Firefox ( Lihat Bug 549114 ).

Solusi yang dapat Anda lakukan untuk Firefox jika perlu adalah membungkus konten Anda yang tidak melanggar dalam sebuah tabel, tetapi itu adalah solusi yang sangat, sangat mengerikan jika Anda bisa menghindarinya.

MEMPERBARUI

Menurut laporan bug yang disebutkan di atas, Firefox 20+ mendukung page-break-inside: avoidsebagai mekanisme untuk menghindari jeda kolom di dalam suatu elemen tetapi potongan kode di bawah ini menunjukkan masih tidak berfungsi dengan daftar:

Seperti yang disebutkan orang lain, Anda dapat melakukan overflow: hiddenatau display: inline-blocktetapi ini menghilangkan peluru yang ditunjukkan dalam pertanyaan asli. Solusi Anda akan bervariasi berdasarkan pada apa tujuan Anda.

UPDATE 2 Karena Firefox tidak mencegah kerusakan display:tabledan display:inline-blocksolusi yang dapat diandalkan tetapi non-semantik adalah untuk membungkus setiap item daftar dalam daftar sendiri dan menerapkan aturan gaya di sana:

.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
Saya percaya Opera 11.5 mendukungbreak-inside: avoid-column
Alohci

2
Melihat Komentar 15 page-break-inside:avoid harus bekerja di FF 20.
Brian Nickel

23
Pada tahun 2014, sintaksis yang tepat adalah: -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 Tidak melihat peningkatan apa pun di Firefox 31. Tidak ada kolom break-inside atau page-break-inside (dengan atau tanpa awalan) yang berfungsi.
Brian Nickel

6
Ini agak terlambat, tetapi karena ini masih menjadi masalah pada tahun 2018, ini mungkin berguna bagi orang lain yang berakhir di sini. Jika ada yang masih memiliki bug antara browser dengan ini, overflow: hiddenadalah pilihan yang lebih baik. display: inline-block;sayangnya, menyebabkan kebiasaan baru dengan Chrome.
SilasOtoko

170

Menambahkan;

display: inline-block;

elemen anak akan mencegah mereka terpecah antara kolom.


1
Ini bagus. Cara yang mungkin untuk mencegah perilaku buruk dari inline-block menyebabkan hal-hal sekarang bisa diperas pada satu baris (jika mereka terlalu pendek) adalah dengan membungkus ini lebih lanjut dengan display:blockelemen. Ini kemungkinan akan menjadi solusi Firefox yang solid untuk saat ini.
Steven Lu

Solusi ini menghapus item daftar, jadi jika Anda menggunakan daftar pesanan misalnya ini tidak akan menjadi alternatif.
Ricardo Zea

Berfungsi sempurna untuk membagi paragraf menjadi kolom.
ChrisC

untuk item daftar, ini dapat berfungsi jika Anda menanamkan konten item daftar (li) dalam elemen "span" yang diatur dengan "display: inline-block". Situasinya jauh lebih kompleks jika Anda ingin mengontrol tempat memecah halaman atau kolom dalam tabel: Anda ingin menghindari jeda dalam baris tabel (tr). Sungguh, tata letak multi-kolom masih sulit untuk diatur, tetapi kami membutuhkannya untuk memungkinkan situs beradaptasi dengan layar yang sangat sempit (seperti smartphone) dan ke tampilan lebar (di mana colul yang sangat sempit benar-benar tidak adil.
verdy_p

7
Bekerja untuk saya <li>tetapi saya harus menambahkan width:100%;untuk mencegah mereka menumpuk secara horizontal.
Justin

47

atur mengikuti gaya elemen yang tidak ingin Anda hancurkan:

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

1
Terima kasih!! Saya mengalami masalah dengan FF dan ini memperbaikinya!
Francis Perron

Saya juga. Solusi di atas tidak bekerja untuk saya, tetapi solusi Anda berhasil. Pujian!
Maks.

Ini berfungsi pada FF dan sebenarnya tidak menyembunyikan konten saya!
Justin

bagus. bekerja untuk paragraf teks colum juga. Added overflow: disembunyikan ke <p> ind <div> dengan kolom. Bekerja untuk FF.
dichterDichter

1
Sebenarnya, overflow:hiddenaturan ini tidak untuk memperbaiki aturan lain, adalah apa yang menyebabkan tata letak nonbreaking ...
Gras ganda

23

Pada Oktober 2014, pembobolan tampaknya masih bermasalah di Firefox dan IE 10-11. Namun, menambahkan overflow: disembunyikan ke elemen, bersama dengan break-inside: avoid, tampaknya membuatnya bekerja di Firefox dan IE 10-11. Saat ini saya menggunakan:

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;

Ini tampaknya menjadi daftar yang paling lengkap
binaryfunt

12

Firefox sekarang mendukung ini:

page-break-inside: avoid;

Ini memecahkan masalah elemen yang melanggar kolom.


Sudahkah Anda bekerja? Saya melihat biola ini di FF 22 dan tidak berhasil: jsfiddle.net/bnickel/5qwMf
Brian Nickel

Sama di sini, tidak berfungsi di Firefox 22. Selain itu, Firebug hanya menampilkan page-break-before:atau page-break-after:tetapi tidakpage-break-inside:
Ricardo Zea

Versi 28 dari Firefox. Ini adalah satu-satunya yang bekerja untuk saya, terima kasih!
Sander Verhagen

9

Jawaban yang diterima sekarang berusia dua tahun dan segala sesuatu tampaknya telah berubah.

Artikel ini menjelaskan penggunaan column-break-insideproperti. Saya tidak bisa mengatakan bagaimana atau mengapa ini berbeda break-inside, karena hanya yang terakhir yang tampaknya didokumentasikan dalam spesifikasi W3. Namun, Chrome dan Firefox mendukung yang berikut:

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

Ini tidak berfungsi untuk jenderal <div class = "a"> di mana "a" menggantikan "Li" Anda di atas. Div masih pecah di dalam. FF 26
Nasser

Bukan bug. kode di atas benar untuk fungsi yang dijelaskan bahkan jika pemilihnya hanya untuk elemen li. Anda masih dapat menggunakan pemilih CSS lain "div.a {...}" alih-alih "li {...}" dalam sampel ini.
verdy_p

Namun Chrome masih tidak mendukung -webkit-kolom-break-inside: avoid; pada baris tabel: ini tidak berfungsi dan kita masih tidak dapat menghindari memecah tabel di posisi yang buruk (terutama jika sel kisah tidak hanya berisi teks tetapi ikon; tetapi Chrome juga tampaknya terpecah pada posisi vertikal apa pun di tengah-tengah baris teks) , memecah teks dengan bagian atas glyphs teks di bagian bawah kolom pertama, dan bagian bawah glyphs teks di bagian atas kolom berikutnya !!! Hasilnya benar-benar tidak dapat dibaca !!!
verdy_p

Pada 2017, kolom-break-inside sepertinya bukan properti css yang valid. MDN hanya mengatakan "Edge juga mendukung varian -webkit-kolom-break-inside yang tidak standar."
Jacob C. mengatakan Reinstate Monica

9

Ini bekerja untuk saya di 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>


Ini bekerja untuk saya pada ulelemen, yang diposting di trik CSS: css-tricks.com/almanac/properties/b/break-inside , dan tampaknya benar berdasarkan catatan kompatibilitas caniuse: "Dukungan parsial mengacu tidak mendukung break-before, break-after, break-insidesifat Browser berbasis WebKit dan Blink memang memiliki dukungan setara untuk properti non-standar -webkit-column-break-*untuk mencapai hasil yang sama (tetapi hanya nilai auto- alwaysnilai). Firefox tidak mendukung break-*tetapi mendukung page-break-*properti untuk mencapai hasil yang sama. "
nabrown

3

Kode berikut berfungsi untuk mencegah pemutusan kolom di dalam elemen:

-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

Pada tahun 2019, memiliki ini berfungsi untuk saya di Chrome, Firefox dan Opera (setelah banyak upaya gagal lainnya):

.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 tampaknya membutuhkan

page-break-inside: avoid;

Dan kebutuhan Chrome 32

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

2

Saya punya masalah yang sama saya pikir dan menemukan solusi dalam hal ini:

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

Bekerja juga di FF 38.0.5: http://jsfiddle.net/rkzj8qnv/


Solusi ini membantu saya
OzzyCzech

1

Solusi yang mungkin untuk Firefox adalah mengatur "tampilan" properti CSS dari elemen yang tidak ingin Anda hilangkan di dalamnya menjadi "tabel". Saya tidak tahu apakah itu bekerja untuk tag LI (Anda mungkin akan kehilangan daftar -item-style), tetapi berfungsi untuk tag P.


Solusi ini menghapus item daftar, jadi jika Anda menggunakan daftar pesanan misalnya ini tidak akan menjadi alternatif.
Ricardo Zea

1

Saya baru saja memperbaiki beberapa divs yang membelah ke kolom berikutnya dengan menambahkan

overflow: auto

untuk anak-anak div.

* Menyadari itu hanya memperbaikinya di Firefox!


1

Saya menghadapi masalah yang sama saat menggunakan kolom kartu

saya memperbaikinya menggunakan

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

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

bekerja dengan sempurna


0

Saya membuat pembaruan dari jawaban yang sebenarnya.

Ini tampaknya bekerja pada firefox dan 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 */
}

Catatan: The mengapung properti tampaknya menjadi orang yang membuat perilaku blok.


0

Jawaban ini mungkin hanya berlaku untuk keadaan tertentu; Jika Anda mengatur ketinggian ke elemen Anda, ini akan dipatuhi oleh gaya kolom. Di sana-dengan menjaga segala sesuatu yang terkandung dalam ketinggian itu menjadi satu baris.

Saya punya daftar, seperti op, tetapi berisi dua elemen, item dan tombol untuk bertindak atas item-item itu. Saya diperlakukan seperti meja <ul> - table, <li> - table-row, <div> - table-cellmenempatkan UL dalam tata letak 4 kolom. Kolom kadang-kadang dibagi antara item dan tombolnya. Trik yang saya gunakan adalah memberi elemen Div ketinggian garis untuk menutupi tombol.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.