En basit ve en güvenilir çözüm, esnek eşyaları doğru yerlere yerleştirmektir. Yeterince genişlerse ( width: 100%
), satır sonunu zorlarlar.
.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>
Ama bu çirkin ve anlamsal değil. Bunun yerine, esnek kabın içinde sözde elemanlar oluşturabilir ve order
bunları doğru yerlere taşımak için kullanabiliriz.
.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>
Ancak bir sınırlama vardır: esnek kabın sadece bir ::before
ve bir ::after
sözde elemanı olabilir. Bu, yalnızca 2 satır sonunu zorlayabileceğiniz anlamına gelir.
Bunu çözmek için esnek öğeler yerine esnek öğelerin içinde sözde öğeler oluşturabilirsiniz. Bu şekilde 2 ile sınırlı kalmayacaksınız. Ancak bu sözde unsurlar esnek öğeler olmayacak, bu nedenle satır sonlarını zorlayamayacaklar.
Ancak neyse ki, CSS Display L3 tanıtıldı display: contents
(şu anda yalnızca Firefox 37 tarafından desteklenmektedir):
Öğenin kendisi herhangi bir kutu oluşturmaz, ancak alt öğeleri ve sözde öğeler hala normal şekilde kutular oluşturur. Kutu oluşturma ve düzenleme amacıyla, öğe, belge ağacındaki alt öğeleri ve sözde öğelerle değiştirilmiş gibi ele alınmalıdır.
Böylece display: contents
esnek kabın çocuklarına başvurabilir ve her birinin içeriğini ek bir ambalajın içine sarabilirsiniz. Daha sonra, esnek eşyalar bu ek sarmalayıcılar ve çocukların yalancı elemanları olacaktır.
.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>
Alternatif olarak, Fragmanlama Flex Düzeni ve CSS Fragmentasyonuna göre Flexbox,break-before
, break-after
ya da CSS 2.1 takma adları:
.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'taki zorunlu satır sonları henüz geniş çapta desteklenmiyor, ancak Firefox'ta çalışıyor.