Bir öğede sütun kırılması nasıl önlenir?


272

Aşağıdaki HTML'yi düşünün:

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

ve aşağıdaki CSS:

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

Halen Firefox bunu şu şekilde benzer hale getiriyor:

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

Dördüncü öğenin ikinci ve üçüncü sütun arasında bölündüğüne dikkat edin. Bunu nasıl önleyebilirim?

İstenen oluşturma daha çok şuna benzeyebilir:

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

veya

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

Düzenle: Genişlik yalnızca istenmeyen oluşturmayı göstermek için belirtilir. Gerçek durumda, elbette sabit bir genişlik yoktur.


o li'ye bağımsız bir stil vermeye çalıştın mı? gibi <li style = "width: ??? px"> Dördüncü sayı biraz daha uzundur </li> ??? px = bu dördüncü sayıya sığması için gereken genişlik.
rmagnum2002

Yanıtlar:


397

Bunu yapmanın doğru yolu, içeri giren CSS özelliğidir :

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

Ne yazık ki, Ekim 2019'dan itibaren bu Firefox'ta desteklenmiyor, ancak diğer tüm büyük tarayıcılar tarafından destekleniyor . Chrome ile yukarıdaki kodu kullanabildim, ancak Firefox için hiçbir şey yapamadım ( Bkz. Hata 549114 ).

Gerekirse Firefox için yapabileceğiniz geçici çözüm, kırılmaz içeriğinizi bir tabloya sarmaktır, ancak bu, kaçınabiliyorsanız gerçekten korkunç bir çözümdür.

GÜNCELLEME

Yukarıda belirtilen hata raporuna göre, Firefox 20+ page-break-inside: avoidbir öğenin içindeki sütun kırılmalarını önlemek için bir mekanizma olarak destekliyor , ancak aşağıdaki kod snippet'i hala listelerle çalışmadığını gösteriyor:

Diğerlerinin de belirttiği gibi, yapabilirsiniz overflow: hiddenveya display: inline-blockancak bu, orijinal soruda gösterilen mermileri kaldırır. Çözümünüz, hedeflerinizin ne olduğuna bağlı olarak değişecektir.

GÜNCELLEME 2 Firefox kırılmayı önlediğinden display:tableve display:inline-blockgüvenilir ancak anlamsız bir çözüm, her liste öğesini kendi listesine sarmak ve stil kuralını oraya uygulamak olacaktır:

.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
Opera break-inside: avoid-column
11.5'in

2
Baktığımızda Yorum 15 page-break-inside:avoid FF 20'de çalışmalıdır
Brian Nikel

23
2014 yılında, doğru sözdizimi -webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
şöyledir

3
@CarlesJoveBuxeda Firefox 31'de herhangi bir gelişme görmüyorum. Ne sütun içeri girme ne de sayfa içeri girme (önekli veya öneksiz) çalışmıyor.
Brian Nickel

6
Biraz geç oldu, ancak bu 2018'de hala bir sorun olduğundan, bu, buraya giren diğerleri için yararlı olabilir. Bununla tarayıcılar arasında hala hatalar varsa overflow: hidden, daha iyi bir seçenektir. display: inline-block;ne yazık ki Chrome ile yeni garipliklere neden oluyor.
SilasOtoko

170

Ekleme;

display: inline-block;

alt öğelerin sütunlar arasında bölünmesini engelleyecektir.


1
Bu iyi. Satır içi bloğun kötü davranışını önlemenin bir şeyin artık bir satırda ezilmesine neden olmasının (çok kısasa) olası bir yolu, bunu bir display:blocköğeyle daha fazla sarmaktır . Bu şimdilik şimdilik sağlam bir Firefox çözümü olacak.
Steven Lu

Bu çözüm liste öğesini kaldırdığından, örneğin sipariş listelerini kullanıyorsanız, bu bir alternatif olmaz.
Ricardo Zea

Paragrafları sütunlara bölmek için mükemmel çalışır.
ChrisC

liste öğeleri için bu, liste öğesinin (li) içeriğini "display: inline-block" ile ayarlanan bir "span" öğesinin içine gömerseniz işe yarayabilir. Tablolardaki sayfaların veya sütunların nerede kesileceğini denetlemek istiyorsanız durum çok daha karmaşıktır: tablo satırlarındaki (tr) kesilmeleri önlemek istiyorsunuz. Gerçekten, çok sütunlu düzenlerin ayarlanması hala zordur, ancak sitelerin çok dar ekranlara (akıllı telefonlar gibi) ve geniş ekranlara (çok dar körfezlerin gerçekten haksız olduğu yerlerde) uyum sağlamasına izin vermeliyiz.
verdy_p

7
Benim için çalışıyor <li>ama width:100%;yatay olarak istiflenmelerini önlemek için eklemeliydim .
Justin

47

aşağıdakileri kırmak istemediğiniz öğenin stiline göre ayarlayın:

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

1
Teşekkür ederim!! FF ile sorun yaşıyordum ve bu düzeltmek!
Francis Perron

Ben de. Yukarıdaki çözümler benim için işe yaramadı, ama seninki işe yaradı. Kudos!
Maxx

Bu FF üzerinde çalışıyor ve aslında içeriğimi gizlemiyor!
Justin

Güzel. colum metin paragraf için de çalışır. Taşma eklendi: <p> ind <div> sütunlarıyla gizlendi. FF için çalışıyor.
Dikter

1
Aslında, overflow:hiddenkural diğer kurallar için bir düzeltme değildir , kırılmayan düzene neden olan şey budur ...
Gras Double

23

Ekim 2014 itibariyle, alıştırmalar Firefox ve IE 10-11'de hala hatalı görünüyor. Bununla birlikte, taşma ekleme: öğeye gizlenmiş, içeriye girme ile birlikte: kaçının, Firefox ve IE 10-11'de çalıştığı görülüyor. Şu anda kullanıyorum:

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;

Bu en kapsamlı liste gibi görünüyor
binaryfunt

12

Firefox şimdi bunu destekliyor:

page-break-inside: avoid;

Bu, sütunları aşan elemanlar sorununu çözer.


Bu işi yaptın mı? FF 22'deki bu kemana bakıyorum
Brian Nickel

Aynen, aynı zamanda Firefox 22., Kundakçı sadece ekranlarda çalışmaz page-break-before:ya page-break-after:amapage-break-inside:
Ricardo Zea

Firefox'un 28. sürümü. Benim için işe yarayan tek kişi bu, teşekkürler!
Sander Verhagen

9

Kabul edilen cevap şimdi iki yaşında ve işler değişmiş gibi görünüyor.

Bu makalede , column-break-insidemülkün kullanımı açıklanmaktadır . Bunun nasıl veya neden farklı olduğunu söyleyemem break-inside, çünkü sadece ikincisi W3 spesifikasyonunda belgeleniyor gibi görünüyor. Ancak, Chrome ve Firefox aşağıdakileri destekler:

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

Bu genel bir "div class =" a "> için geçerli değildir; burada" a "yukarıdaki" Li "ifadenizin yerine geçer. Div hala içeri girdi. FF 26
Nasser

Hata değil. yukarıdaki kod, seçici sadece bir li elemanı için olsa bile açıklanan fonksiyon için doğrudur. Yine de bu örnekte "li {...}" yerine başka bir CSS seçici "div.a {...}" kullanabilirsiniz.
verdy_p

Ancak Chrome hala -webkit-column-break-inside'ı desteklemez: avo; tablo satırında: bu işe yaramaz ve yine de kötü konumlardaki tabloları kırmaktan kaçınamayız (özellikle bir masal hücresi sadece metin değil simgeler içeriyorsa; Chrome ayrıca bir metin satırının ortasındaki herhangi bir dikey konumda bölünmüş gibi görünüyor. , metni ilk sütunun altındaki metin gliflerinin üst kısmı ve sonraki sütunun üstündeki metin gliflerinin alt kısmı ile
kırmak

2017 itibariyle sütun içeri girme geçerli bir css özelliği gibi görünmüyor. MDN yalnızca "Edge ayrıca standart olmayan -webkit-column-break-inside varyantını da destekler."
Jacob C., Reinstate Monica'ya

9

Bu 2015'te benim için çalışıyor:

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>


Bu benim için çalışıyor ulCSS hileler yayınlanan edilir elementler: css-tricks.com/almanac/properties/b/break-inside ve caniuse uyumluluk notlara dayanarak doğru görünüyor: "Kısmi destek desteklemeyen belirtir break-before, break-after, break-insideözellikleri WebKit ve Blink tabanlı tarayıcılar -webkit-column-break-*, aynı sonucu elde etmek için standart olmayan özellikler için eşdeğer bir desteğe sahiptir (ancak yalnızca autove alwaysdeğerleri). Firefox aynı sonucu elde etmek break-*için page-break-*özellikleri desteklemez, destekliyor . "
nabrown

3

Aşağıdaki kod, öğelerin içindeki sütun kesmelerini önlemek için çalışır:

-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

2019'da bunun Chrome, Firefox ve Opera'da benim için çalışmasını sağlamak (diğer birçok başarısız denemeden sonra):

.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 gerektiriyor gibi görünüyor

page-break-inside: avoid;

Ve Chrome 32 ihtiyaçları

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

2

Ben düşünüyorum aynı sorun vardı ve bu bir çözüm buldum:

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

FF 38.0.5'te de çalışıyor: http://jsfiddle.net/rkzj8qnv/


Bu çözüm bana yardımcı oluyor
OzzyCzech

1

Firefox için olası bir geçici çözüm, içinde bir ara vermek istemediğiniz öğenin CSS özelliğini "display" olarak ayarlamak "table" olarak ayarlanmıştır. LI etiketi için çalışıp çalışmadığını bilmiyorum (muhtemelen liste -item tarzı kaybedersiniz), ancak P etiketi için çalışır.


Bu çözüm liste öğesini kaldırdığından, örneğin sipariş listelerini kullanıyorsanız, bu bir alternatif olmaz.
Ricardo Zea

1

Sadece divekleyerek bir sonraki sütuna bölen bazı s düzeltildi

overflow: auto

çocuğa div.

* Sadece Firefox'ta düzelttiğini fark ettim!


1

Kart sütunlarını kullanırken aynı sorunla karşılaştım

kullanarak sabitledim

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

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

Mükemmel çalışıyor


0

Gerçek cevabı güncelledim.

Firefox ve krom üzerinde çalışıyor gibi görünüyor: 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 */
}

Not: şamandıra mülkiyet blok davranışı yapan kişi olarak görünmektedir.


0

Bu cevap yalnızca belirli durumlar için geçerli olabilir; Öğelerinize bir yükseklik ayarlarsanız, sütun stiline uyulur. Bu yükseklikteki her şeyi bir sıraya tutarak.

Op gibi bir listem vardı, ancak bu öğeler üzerinde hareket etmek için iki öğe, öğe ve düğme içeriyordu. Bir tablo gibi tedavi <ul> - table, <li> - table-row, <div> - table-cell4 kolon düzeninde UL koydu. Sütunlar bazen öğe ve düğmeleri arasında bölünüyordu. Kullandığım numara, Div öğelerine düğmeleri kaplayacak bir satır yüksekliği vermekti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.