सबसे सरल और सबसे विश्वसनीय समाधान सही स्थानों पर फ्लेक्स आइटम सम्मिलित करना है। यदि वे पर्याप्त चौड़े हैं ( 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>
लेकिन यह बदसूरत है और शब्दार्थ नहीं है। इसके बजाय, हम फ्लेक्स कंटेनर के अंदर छद्म तत्व उत्पन्न कर सकते हैं, और 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>
लेकिन एक सीमा है: फ्लेक्स कंटेनर में केवल एक ::before
और एक ::after
छद्म तत्व हो सकता है। इसका मतलब है कि आप केवल 2 लाइन ब्रेक को मजबूर कर सकते हैं।
इसे हल करने के लिए, आप फ्लेक्स कंटेनर के बजाय फ्लेक्स आइटम के अंदर छद्म तत्व उत्पन्न कर सकते हैं। इस तरह आप 2 तक सीमित नहीं रहेंगे। लेकिन उन छद्म तत्वों में फ्लेक्स आइटम नहीं होंगे, इसलिए वे लाइन ब्रेक को मजबूर करने में सक्षम नहीं होंगे।
लेकिन सौभाग्य से, सीएसएस डिस्प्ले L3 पेश किया है display: contents
(वर्तमान में केवल फ़ायरफ़ॉक्स 37 द्वारा समर्थित):
तत्व स्वयं कोई बक्से उत्पन्न नहीं करता है, लेकिन उसके बच्चे और छद्म तत्व अभी भी सामान्य रूप से बक्से उत्पन्न करते हैं। बॉक्स पीढ़ी और लेआउट के प्रयोजनों के लिए, तत्व को ऐसे माना जाना चाहिए जैसे कि इसे अपने बच्चों और दस्तावेज़ पेड़ में छद्म तत्वों के साथ बदल दिया गया हो।
तो आप display: contents
फ्लेक्स कंटेनर के बच्चों के लिए आवेदन कर सकते हैं , और प्रत्येक को एक अतिरिक्त आवरण के अंदर लपेट सकते हैं। फिर, फ्लेक्स आइटम उन अतिरिक्त आवरण और बच्चों के छद्म तत्व होंगे।
.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>
वैकल्पिक रूप से, के अनुसार विखंडन फ्लेक्स लेआउट और सीएसएस विखंडन , flexbox टूट जाता है का उपयोग करके मजबूर की अनुमति देता है break-before
, break-after
या उनके सीएसएस 2.1 उपनाम:
.item:nth-child(3n) {
page-break-after: always;
break-after: always;
}
.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>
फ्लेक्सबॉक्स में मजबूर लाइन ब्रेक अभी तक व्यापक रूप से समर्थित नहीं हैं, लेकिन यह फ़ायरफ़ॉक्स पर काम करता है।