จะป้องกันการแตกคอลัมน์ภายในองค์ประกอบได้อย่างไร


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

โปรดสังเกตว่ารายการที่สี่ถูกแยกระหว่างคอลัมน์ที่สองและสาม ฉันจะป้องกันได้อย่างไร

การเรนเดอร์ที่ต้องการอาจมีลักษณะคล้าย:

 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 style = "width: ??? px"> หมายเลขสี่ยาวขึ้นเล็กน้อย </li> ??? px = ความกว้างที่ต้องการเพื่อให้พอดีกับหมายเลขสี่
rmagnum2002

คำตอบ:


397

วิธีที่ถูกต้องในการทำเช่นนี้คือคุณสมบัติ CSS ตัวแบ่ง :

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

แต่น่าเสียดายที่ในเดือนตุลาคม 2019 นี้จะไม่ได้รับการสนับสนุนใน Firefoxแต่ได้รับการสนับสนุนจากเบราว์เซอร์ที่สำคัญอื่น ๆ ทุกคน ด้วย Chrome ฉันสามารถใช้รหัสด้านบนได้ แต่ฉันไม่สามารถทำงานอะไรให้ Firefox ได้ ( ดู Bug 549114 )

วิธีแก้ปัญหาที่คุณสามารถทำได้สำหรับ Firefox หากจำเป็นคือการห่อเนื้อหาที่ไม่ทำลายของคุณลงในตาราง แต่นั่นเป็นวิธีการแก้ปัญหาที่เลวร้ายจริงๆถ้าคุณสามารถหลีกเลี่ยงได้

UPDATE

ตามรายงานข้อผิดพลาดดังกล่าวข้างต้น Firefox 20+ รองรับpage-break-inside: avoidเป็นกลไกในการหลีกเลี่ยงการแบ่งคอลัมน์ภายในองค์ประกอบ แต่ข้อมูลโค้ดด้านล่างแสดงให้เห็นว่ามันยังไม่ทำงานกับรายการ:

ดังที่คนอื่นพูดถึงคุณสามารถทำได้overflow: hiddenหรือdisplay: 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
Alohci

2
การดูความคิดเห็นที่ 15 page-break-inside:avoidควรทำงานใน FF 20
Brian Nickel

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;
Carles Jove i Buxeda

3
@CarlesJoveBuxeda ไม่เห็นการปรับปรุงใด ๆ ใน Firefox 31 ทั้งการแบ่งคอลัมน์ภายในหรือการแบ่งหน้า (อาจมีหรือไม่มีส่วนนำหน้า)
Brian Nickel

6
มันสายไปเล็กน้อย แต่เนื่องจากยังคงมีปัญหาในปี 2018 อาจเป็นประโยชน์กับคนอื่น ๆ ที่มาที่นี่ หากใครยังคงมีข้อบกพร่องระหว่างเบราว์เซอร์กับสิ่งนี้overflow: hiddenเป็นตัวเลือกที่ดีกว่า display: inline-block;ทำให้เกิดนิสัยแปลกใหม่ด้วย Chrome แต่น่าเสียดายที่
SilasOtoko

170

เพิ่ม;

display: inline-block;

องค์ประกอบลูกจะป้องกันไม่ให้ถูกแยกระหว่างคอลัมน์


1
ดีจัง. วิธีที่เป็นไปได้เพื่อป้องกันไม่ให้พฤติกรรมที่ไม่ดีของอินไลน์บล็อกก่อให้เกิดสิ่งที่จะได้รับในขณะนี้ squished ในหนึ่งบรรทัด (ถ้าพวกเขาจะสั้นเกินไป) คือการห่อต่อไปนี้ด้วยdisplay:blockองค์ประกอบ นี่น่าจะเป็นวิธีแก้ปัญหา Firefox ที่มั่นคงในตอนนี้
Steven Lu

วิธีนี้จะลบรายการในรายการดังนั้นหากคุณใช้รายการสั่งซื้อเช่นนี้จะไม่เป็นทางเลือก
Ricardo Zea

ทำงานอย่างสมบูรณ์แบบสำหรับการแบ่งย่อหน้าออกเป็นคอลัมน์
ChrisC

สำหรับไอเท็มรายการสิ่งนี้สามารถใช้งานได้หากคุณฝังเนื้อหาของลิสต์ไอเท็ม (li) ภายในชุดองค์ประกอบ "span" ที่มี "display: inline-block" สถานการณ์มีความซับซ้อนมากขึ้นหากคุณต้องการควบคุมตำแหน่งที่จะแบ่งหน้าหรือคอลัมน์ภายในตาราง: คุณต้องการหลีกเลี่ยงตัวแบ่งภายในแถวของตาราง (tr) จริงๆแล้วเค้าโครงหลายคอลัมน์ยังคงติดตั้งได้ยาก แต่เราต้องการอนุญาตให้ไซต์ปรับให้เข้ากับหน้าจอที่แคบมาก (เช่นสมาร์ทโฟน) และหน้าจอกว้าง (ที่ colulns แคบมากไม่ยุติธรรมจริง ๆ )
verdy_p

7
ใช้งานได้สำหรับฉัน<li>แต่ฉันต้องเพิ่มwidth:100%;เพื่อป้องกันไม่ให้ซ้อนในแนวนอน
Justin

47

ตั้งค่าตามสไตล์ขององค์ประกอบที่คุณไม่ต้องการทำลาย:

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

1
ขอบคุณ!! ฉันมีปัญหากับ FF และแก้ไขได้!
ฟรานซิส Perron

ฉันด้วย. การแก้ปัญหาข้างต้นไม่ได้ทำงานสำหรับฉัน แต่คุณทำ รุ่งโรจน์!
Maxx

สิ่งนี้ใช้ได้กับ FF และไม่ได้ซ่อนเนื้อหาของฉันจริง ๆ !
Justin

ดี ทำงานสำหรับย่อหน้าข้อความ colum เช่นกัน เพิ่มล้น: ซ่อนไว้ใน <p> ind <div> พร้อมคอลัมน์ ใช้งานได้กับ FF
dichterDichter

1
ที่จริงแล้วoverflow:hiddenกฎไม่ได้แก้ไขสำหรับกฎอื่น ๆ มันเป็นสิ่งที่ทำให้รูปแบบที่ไม่แตกสลาย ...
Gras Double

23

เมื่อวันที่ตุลาคม 2557 ความผิดพลาดภายในยังคงเป็นรถใน Firefox และ IE 10-11 อย่างไรก็ตามการเพิ่มโอเวอร์โฟลว์: ซ่อนอยู่ในองค์ประกอบพร้อมกับตัวแบ่ง: หลีกเลี่ยงดูเหมือนว่าจะทำงานใน 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/bnickel/5qwMf
Brian Nickel

เหมือนกันที่นี่ไม่ทำงานใน Firefox 22 นอกจากนี้ Firebug จะแสดงpage-break-before:หรือpage-break-after:ไม่แสดงเท่านั้นpage-break-inside:
Ricardo Zea

Firefox รุ่นที่ 28 นี่เป็นสิ่งเดียวที่เหมาะกับฉันขอบคุณ!
Sander Verhagen

9

คำตอบที่ยอมรับได้คือตอนนี้มีอายุสองปีและสิ่งต่าง ๆ มีการเปลี่ยนแปลง

บทความนี้จะอธิบายการใช้งานของcolumn-break-insideคุณสมบัติ ฉันไม่สามารถบอกได้ว่าสิ่งนี้แตกต่างกันbreak-insideอย่างไรเพราะเหตุใดเอกสารฉบับหลังจึงปรากฏในข้อมูลจำเพาะของ W3 อย่างไรก็ตาม Chrome และ Firefox รองรับสิ่งต่อไปนี้:

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

สิ่งนี้ใช้ไม่ได้กับ <div class = "a"> โดยที่ "a" แทนที่ "Li" ของคุณด้านบน กองทหารยังคงบุกเข้าไปข้างใน FF 26
นัสเซอร์

ไม่ใช่ข้อบกพร่อง รหัสด้านบนนั้นถูกต้องสำหรับฟังก์ชั่นที่อธิบายไว้แม้ว่าตัวเลือกจะใช้สำหรับองค์ประกอบ li เท่านั้น คุณยังสามารถใช้ตัวเลือก CSS อื่น "div.a {... }" แทน "li {... }" ในตัวอย่างนี้
verdy_p

อย่างไรก็ตาม Chrome ยังไม่รองรับ -webkit-column-break-inside: หลีกเลี่ยง; บนแถวของตาราง: สิ่งนี้ใช้งานไม่ได้และเรายังไม่สามารถหลีกเลี่ยงการแบ่งตารางในตำแหน่งที่ไม่ดี (โดยเฉพาะถ้าเซลล์นิทานไม่เพียง แต่มีข้อความ แต่มีไอคอน แต่ Chrome ยังปรากฏขึ้นเพื่อแยกตำแหน่งแนวตั้งที่ตรงกลางของบรรทัดข้อความ การทำลายข้อความด้วยส่วนบนของ glyphs ข้อความที่ด้านล่างของคอลัมน์แรกและส่วนล่างของ glyphs ข้อความที่ด้านบนของคอลัมน์ถัดไป !!! ผลลัพธ์ไม่สามารถอ่านได้อย่างแน่นอน !!!
verdy_p

ในปี 2017 การแบ่งคอลัมน์ภายในดูเหมือนจะไม่ใช่คุณสมบัติ css ที่ถูกต้อง MDN กล่าวเพียงว่า "Edge ยังรองรับชุดตัวแปร --webkit-column-break-inside ที่ไม่ได้มาตรฐาน"
Jacob C. พูดว่า Reinstate Monica

9

สิ่งนี้ใช้ได้กับฉันในปี 2558:

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>


นี้คือการทำงานสำหรับฉันในulองค์ประกอบที่ถูกโพสต์บนเทคนิค CSS: css-tricks.com/almanac/properties/b/break-insideและดูเหมือนว่าถูกต้องตามบันทึก caniuse ความเข้ากันได้: "การสนับสนุนบางส่วนไม่ได้หมายถึงการสนับสนุนbreak-before, break-after, break-insideคุณสมบัติ . เบราว์เซอร์ที่ใช้ WebKit- และ Blink มีการสนับสนุนเทียบเท่าสำหรับคุณสมบัติที่ไม่ได้มาตรฐาน-webkit-column-break-*เพื่อให้ได้ผลลัพธ์เดียวกัน (แต่เฉพาะautoและalwaysค่า) Firefox ไม่สนับสนุนbreak-*แต่สนับสนุนpage-break-*คุณสมบัติเพื่อให้ได้ผลลัพธ์เดียวกัน "
nabrown

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 ต้องการ

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 (คุณอาจสูญเสียรายการ - ลักษณะรายการ) แต่ใช้งานได้กับแท็ก P


วิธีนี้จะลบรายการในรายการดังนั้นหากคุณใช้รายการสั่งซื้อเช่นนี้จะไม่เป็นทางเลือก
Ricardo Zea

1

ฉันเพิ่งแก้ไขบางส่วนdivที่แยกลงในคอลัมน์ถัดไปโดยการเพิ่ม

overflow: auto

เพื่อให้เด็กdivs

* ตระหนักว่าแก้ไขได้เฉพาะใน 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 */
}

หมายเหตุ: ลอยคุณสมบัติน่าจะเป็นหนึ่งทำให้พฤติกรรมบล็อก


0

คำตอบนี้อาจใช้ได้กับบางสถานการณ์เท่านั้น หากคุณตั้งค่าความสูงเป็นองค์ประกอบของคุณสิ่งนี้จะถูกเชื่อฟังโดยการกำหนดสไตล์คอลัมน์ มีโดยการรักษาสิ่งที่มีอยู่ภายในความสูงที่แถว

ฉันมีรายการเช่น op แต่มีสององค์ประกอบรายการและปุ่มเพื่อดำเนินการกับรายการเหล่านั้น ผมได้รับการปฏิบัติเช่นโต๊ะ<ul> - table, <li> - table-row, <div> - table-cellใส่ UL ในรูปแบบ 4 คอลัมน์ บางครั้งคอลัมน์ถูกแยกระหว่างรายการและปุ่ม เคล็ดลับที่ฉันใช้คือการทำให้องค์ประกอบ Div มีความสูงของเส้นเพื่อครอบคลุมปุ่มต่างๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.