ทางออกที่ง่ายที่สุดและน่าเชื่อถือที่สุดคือการใส่เฟล็กซ์ในสถานที่ที่เหมาะสม หากพวกเขากว้างพอ ( width: 100%
) พวกเขาจะบังคับให้ขึ้นบรรทัดใหม่
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px
}
.item:nth-child(4n - 1) {
background: silver;
}
.line-break {
width: 100%;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="line-break"></div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="line-break"></div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="line-break"></div>
<div class="item">10</div>
</div>
แต่มันก็น่าเกลียดและไม่ใช่ความหมาย แต่เราสามารถสร้างองค์ประกอบหลอกภายใน flex container และใช้order
เพื่อย้ายไปยังตำแหน่งที่ถูกต้อง
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px
}
.item:nth-child(3n) {
background: silver;
}
.container::before, .container::after {
content: '';
width: 100%;
order: 1;
}
.item:nth-child(n + 4) {
order: 1;
}
.item:nth-child(n + 7) {
order: 2;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
แต่มีข้อ จำกัด คือ: flex container สามารถมีได้เฉพาะ::before
และ::after
องค์ประกอบหลอก นั่นหมายความว่าคุณสามารถบังคับให้แบ่ง 2 บรรทัดเท่านั้น
ในการแก้ปัญหานั้นคุณสามารถสร้างองค์ประกอบเทียมภายในรายการเฟล็กซ์แทนที่จะเป็นในคอนเทนเนอร์เฟล็กซ์ วิธีนี้คุณจะไม่ถูก จำกัด ที่ 2 แต่องค์ประกอบหลอกเหล่านั้นจะไม่เป็นรายการที่ยืดหยุ่นดังนั้นพวกเขาจะไม่สามารถบังคับให้ขึ้นบรรทัดใหม่ได้
แต่โชคดีที่CSS Display L3ได้เปิดตัวdisplay: contents
(ปัจจุบันรองรับเฉพาะ Firefox 37):
องค์ประกอบนั้นไม่ได้สร้างกล่องใด ๆ แต่ลูก ๆ และองค์ประกอบหลอกยังคงสร้างกล่องตามปกติ สำหรับวัตถุประสงค์ของการสร้างและเลย์เอาต์องค์ประกอบต้องได้รับการปฏิบัติเสมือนว่ามันถูกแทนที่ด้วยลูก ๆ และองค์ประกอบแบบหลอกในแผนผังเอกสาร
ดังนั้นคุณสามารถนำdisplay: contents
ไปใช้กับเด็ก ๆ ของ flex container และห่อเนื้อหาของแต่ละอันไว้ใน wrapper เพิ่มเติม จากนั้นไอเท็มแบบยืดหยุ่นจะเป็นเครื่องห่อเพิ่มเติมและองค์ประกอบแบบหลอกของเด็ก ๆ
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
display: contents;
}
.item > div {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px;
}
.item:nth-child(3n) > div {
background: silver;
}
.item:nth-child(3n)::after {
content: '';
width: 100%;
}
<div class="container">
<div class="item"><div>1</div></div>
<div class="item"><div>2</div></div>
<div class="item"><div>3</div></div>
<div class="item"><div>4</div></div>
<div class="item"><div>5</div></div>
<div class="item"><div>6</div></div>
<div class="item"><div>7</div></div>
<div class="item"><div>8</div></div>
<div class="item"><div>9</div></div>
<div class="item"><div>10</div></div>
</div>
อีกทางเลือกหนึ่งตามfragmenting Flex เค้าโครงและCSS Fragmentation , flexbox ช่วยให้การบังคับแบ่งโดยใช้break-before
, break-after
หรือ CSS 2.1 นามแฝงของพวกเขา
.item:nth-child(3n) {
page-break-after: always; /* CSS 2.1 syntax */
break-after: always; /* New syntax */
}
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px
}
.item:nth-child(3n) {
page-break-after: always;
background: silver;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
การแบ่งบรรทัดบังคับใน flexbox ยังไม่ได้รับการสนับสนุนอย่างกว้างขวาง แต่สามารถใช้งานได้กับ Firefox