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.

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

Brian Nickel
sumber
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.

Steve
sumber
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;
pengguna2540794
sumber
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;
VerticalGrain
sumber
Ini tampaknya menjadi daftar yang paling lengkap
binaryfunt
12

Firefox sekarang mendukung ini:

page-break-inside: avoid;

Ini memecahkan masalah elemen yang melanggar kolom.

paul haine
sumber
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;
}
keithjgrant
sumber
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>

Sébastien Gicquel
sumber
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;
AlphaMycelium
sumber
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;
}
hextech
sumber
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;
PETA
sumber
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/

dichterDichter
sumber
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.

Christopher
sumber
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!

mateostabio
sumber
1

Saya menghadapi masalah yang sama saat menggunakan kolom kartu

saya memperbaikinya menggunakan

 display: inline-flex ;
 column-break-inside: avoid;
 width:100%;
Misterius_Anny
sumber
1
<style>
ul li{display: table;}  
</style>

bekerja dengan sempurna

Tahir
sumber
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.

Gatsbimantico
sumber
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.

Rubah
sumber