要素内の列の分割を防ぐ方法は?


272

次のHTMLを検討してください。

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

および次のCSS:

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

現状では、Firefoxは現在これを次のようにレンダリングします。

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

4番目の項目が2番目と3番目の列に分割されていることに注意してください。それを防ぐにはどうすればよいですか?

希望するレンダリングは次のようになります。

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

または

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

編集:幅は、不要なレンダリングを示すためにのみ指定されています。実際のケースでは、もちろん固定幅はありません。


そのliをスタンドアロンスタイルにしようとしましたか?<li style = "width:??? px"> 4番目の数字は少し長い</ li> ??? px = 4番目の数字に合わせるために必要な幅
rmagnum2002、2011年

回答:


397

これを行う正しい方法は、break-inside CSSプロパティを使用することです。

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

残念ながら、2019年10月のように、これはFirefoxでサポートされていませんが、それは他のすべての主要なブラウザでサポートされています。Chromeでは上記のコードを使用できましたが、Firefoxでは何も機能しませんでした(Bug 549114を参照)。

必要に応じてFirefoxで実行できる回避策は、問題のないコンテンツをテーブルでラップすることですが、それを回避できる場合、これは本当に非常に恐ろしいソリューションです。

更新

上記のバグレポートによると、Firefox 20以降はpage-break-inside: avoid要素内の列の改行を回避するメカニズムとしてサポートしていますが、以下のコードスニペットは、リストではまだ機能しないことを示しています。

他の人が言っているように、あなたはできるかoverflow: hiddendisplay: inline-blockしかしこれは元の質問に示された箇条書きを削除します。ソリューションは、目標が何であるかによって異なります。

更新2 Firefoxは機能しなくなることを防いでdisplay:tableおりdisplay:inline-block、信頼できるが非セマンティックなソリューションは、各リスト項目を独自のリストにラップし、そこにスタイルルールを適用することです。

.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 11.5がサポートしているとbreak-inside: avoid-column
思い

2
見るとコメント15 page-break-inside:avoid FF 20で動作するはずです
ブライアン・ニッケル

23
:2014年には、右の構文は次のようだ -webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
カルレスJoveは私Buxeda

3
@CarlesJoveBuxeda Firefox 31で改善が見られません。column-break-insideまたはpage-break-inside(プレフィックスの有無にかかわらず)が機能していません。
ブライアンニッケル

6
少し遅いですが、これは2018年の問題であるため、ここで終了する他のユーザーにとって役立つ可能性があります。これを使用しているブラウザ間でまだバグが発生している場合overflow: hiddenは、より良いオプションです。display: inline-block;残念ながら、Chromeに新しい癖があります。
SilasOtoko

170

追加;

display: inline-block;

子要素に追加すると、列間で分割されなくなります。


1
これはいい。inline-blockの悪い動作が原因で1行に詰め込まれる(短すぎる場合)ための可能な方法は、これをさらにdisplay:block要素でラップすることです。これはおそらく今のところFirefoxの確実な回避策です。
Steven Lu

このソリューションはリストアイテムを削除するため、たとえば注文リストを使用している場合、これは代替手段にはなりません。
Ricardo Zea 2013

段落を列に分割するのに最適です。
ChrisC 2013年

リスト項目の場合、これは「display:inline-block」で設定された「span」要素内にリスト項目(li)のコンテンツを埋め込む場合に機能します。テーブル内のページまたは列を分割する場所を制御する場合、状況はさらに複雑になります。テーブル行(tr)内での分割を避けたい場合。本当に、マルチカラムレイアウトはまだセットアップすることは困難ですが、我々はそれがサイトが(スマートフォンなど)と非常に狭いcolulnsは本当に不公平ですワイドディスプレイ(と非常に狭い画面に適応できるようにする必要があります。
verdy_p

7
私には問題あり<li>ませんが、width:100%;横に積み重ならないように追加する必要がありました。
ジャスティン

47

以下を、分割したくない要素のスタイルに設定します。

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

1
ありがとうございました!!私はFFに問題があり、これで修正されました!
フランシスペロン2013

私も。上記の解決策は私にはうまくいきませんでしたが、あなたの解決策はうまくいきました。賞賛!
Maxx

これはFFで機能し、実際にはコンテンツを非表示にしません!
ジャスティン

いいね。列のテキスト段落でも機能します。追加されたオーバーフロー:<p>および<div>に非表示になり、列が表示されます。FFで動作します。
dichterDichter 2015

1
実際には、overflow:hiddenルールが他のルールの修正はありませんが、それはある ...改行なしのレイアウトを引き起こすもの
グラダブル

23

2014年10月の時点で、FirefoxとIE 10-11のブレークインはまだバグがあるようです。ただし、要素にoverflow:hiddenを追加し、break-inside:avoidを追加すると、FirefoxおよびIE 10-11で機能するようになります。私は現在使用しています:

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;

これは最も包括的なリストのようです
binaryfunt

12

Firefoxはこれをサポートします:

page-break-inside: avoid;

これにより、要素が列を越えて壊れる問題が解決されます。


これは機能していますか?私はFF 22でこのフィドルを見ていますが、機能しません。jsfiddle.net
ブライアンニッケル

ここでも同じですが、Firefox 22では機能しません。また、Firebugは表示されるpage-break-before:page-break-after:、表示されませんpage-break-inside:
Ricardo Zea

Firefoxのバージョン28。これは私にとってまだうまくいく唯一のものです、ありがとう!
Sander Verhagen 2014

9

受け入れられた回答は2歳になり、状況は変わったようです。

この記事では、column-break-insideプロパティの使用について説明します。これがとどのようにまたはなぜ異なるのかはわかりません。break-inside後者のみがW3仕様に文書化されているように見えるためです。ただし、ChromeとFirefoxは以下をサポートしています。

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

これは、上記の「Li」が「a」に置き換わる一般的な<div class = "a">では機能しません。divはまだ壊れています。FF 26
ナセル

バグではありません。上記のコードは、そのセレクターがli要素専用である場合でも、説明されている関数に対して正しいものです。このサンプルでは、​​ "li {...}"の代わりに別のCSSセレクタ "div.a {...}"を引き続き使用できます。
verdy_p 2014年

ただし、Chromeはまだ-webkit-column-break-inside:avoid;をサポートしていません。テーブル行上:これは機能せず、不適切な位置でテーブルを壊すことは避けられません(特に、テイルセルにテキストだけでなくアイコンも含まれている場合)。ただし、Chromeもテキスト行の中央の垂直位置で分割されているように見えます。 、テキストグリフの上部が最初の列の下部にあり、テキストグリフの下部が次の列の上部にあるテキストを分割します!!!結果はまったく読め
ませ

2017年の時点では、column-break-insideは有効なcssプロパティではないようです。MDNは、「Edgeは非標準の-webkit-column-break-insideバリアントもサポートしている」とのみ述べています。
Jacob C.はモニカ

9

これは私にとって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>


これは、上の私のために働いているulCSSのトリックに掲載され、要素:css-tricks.com/almanac/properties/b/break-inside、およびcaniuse互換ノートに基づいて正しいようだ:「部分的なサポートはサポートしていないを指しbreak-beforebreak-afterbreak-inside性質。WebKitおよびBlinkベースのブラウザーは-webkit-column-break-*、同じ結果を達成するために非標準のプロパティを同等にサポートしています(ただし、autoおよびalways値のみ)。Firefox はサポートせず、同じ結果を達成するbreak-*ためのpage-break-*プロパティをサポートします。
1919年

3

次のコードは、要素内の列の区切りを防ぐために機能します。

-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年、Chrome、Firefox、Operaでこれが動作するようになりました(他の多くの失敗した試みの後):

.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が必要とするようです

page-break-inside: avoid;

Chrome 32には

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

2

私は同じ問題を抱えていて、解決策を見つけました:

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

FF 38.0.5でも機能する:http ://jsfiddle.net/rkzj8qnv/


このソリューションは私に役立ちます
OzzyCzech

1

Firefoxで考えられる回避策は、ブレークさせたくない要素のCSSプロパティ「display」を「table」に設定することです。LIタグで機能するかどうかはわかりませんが(おそらくリスト-item-styleが失われるでしょう)、Pタグで機能します。


このソリューションはリストアイテムを削除するため、たとえば注文リストを使用している場合、これは代替手段にはなりません。
Ricardo Zea 2013

1

div追加することで次の列に分割されていたいくつかのを修正しました

overflow: auto

子供に div

* Firefoxでのみ修正されることに気付きました!


1

カード列を使用しているときに同じ問題に直面しました

私はそれを使って修正しました

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


0

実際の回答を更新しました。

これはFirefoxと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 */
}

注:フロートプロパティは、ブロックの振る舞いを作る1であるように思われます。


0

この回答は特定の状況にのみ適用される場合があります。要素に高さを設定すると、これは列のスタイルに従います。これにより、その高さに含まれるものはすべて行に保持されます。

opのようなリストがありましたが、2つの要素、アイテムと、それらのアイテムを操作するボタンが含まれていました。私はテーブルのようにそれを扱う<ul> - table<li> - table-row<div> - table-cell4列のレイアウトにULを置きます。列がアイテムとボタンの間で分割されることがありました。私が使ったコツは、Div要素にボタンを覆う行の高さを与えることでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.