簡體   English   中英

使用flexbox連續控制項目數

[英]Control item count in a row with flexbox

我想按原樣在第一行中顯示4個項目,但在第二行中僅顯示3個項目,然后在第三行中顯示4個項目,在第四行中顯示3個項目,依此類推...

我已經通過nth-child實現了這一點,但是代碼太多了,並且不靈活且不可擴展。

flex有可能嗎? 還是網格?

 * { box-sizing: border-box; } .grid-wrapper { display: flex; flex-wrap: wrap; justify-content: center; } .grid-wrapper .grid-item { width: 25%; text-align: center; padding: 5px; } p { background: #ddd; padding: 15px; } 
 <div class="grid-wrapper"> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> </div> 

您只需要考慮以下一條規則:

 /*7 = 4 (1st row) + 3 (2nd row) and 5 = 1st element in 2nd row (4 + 1)*/
.grid-wrapper .grid-item:nth-child(7n + 5) {
  width: calc(100%/3);
  flex-grow:0;
}

訣竅是使一個元素更大以觸發換行,然后依靠flex-grow填充空間。

完整代碼

 * { box-sizing: border-box; } .grid-wrapper { display: flex; flex-wrap: wrap; justify-content: center; } .grid-wrapper .grid-item { width: 25%; text-align: center; padding: 5px; flex-grow: 1; } .grid-wrapper .grid-item:nth-child(7n + 5) { width: calc(100%/3); flex-grow:0; } p { background: #ddd; padding: 15px; } 
 <div class="grid-wrapper"> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div><div class="grid-item"> <p>Grid Item</p> </div> </div> 

flex有可能嗎? 還是網格?

這是使用網格的解決方案,更易於構建:

  • 考慮使用grid-template-columns: repeat(12, 1fr)的12列網格布局grid-template-columns: repeat(12, 1fr)

  • 使用grid-column: span 3將每個grid-item分為4列grid-column: span 3

  • 7個grid-item以一個模式重復; 這意味着每偶數行都有3個項, 第n個子項索引分別為7n7n - 17n - 2

請參見下面的演示:

 * { box-sizing: border-box; } .grid-wrapper { display: grid; /* grid container */ grid-template-columns: repeat(12, 1fr); /* 12-column layout */ } .grid-wrapper .grid-item { text-align: center; padding: 5px; grid-column: span 3; /* 4 items in a row */ } .grid-wrapper .grid-item:nth-child(7n - 2), .grid-wrapper .grid-item:nth-child(7n - 1), .grid-wrapper .grid-item:nth-child(7n) { /* even row */ grid-column: span 4; /* 3 items in the even row */ } p { background: #ddd; padding: 15px; } 
 <div class="grid-wrapper"> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> </div> 


Flexbox解決方案

在flexbox的情況下,我將使用幾乎相同的第n個子邏輯,而代碼中唯一的變化如下:

.grid-wrapper .grid-item:nth-child(7n - 2),
.grid-wrapper .grid-item:nth-child(7n - 1),
.grid-wrapper .grid-item:nth-child(7n) { /* even row */
  width: 33.33%;
}

請參見下面的演示:

 * { box-sizing: border-box; } .grid-wrapper { display: flex; flex-wrap: wrap; justify-content: center; } .grid-wrapper .grid-item { width: 25%; text-align: center; padding: 5px; } p { background: #ddd; padding: 15px; } /* ADDED THESE */ .grid-wrapper .grid-item:nth-child(7n - 2), .grid-wrapper .grid-item:nth-child(7n - 1), .grid-wrapper .grid-item:nth-child(7n) { /* even row */ width: 33.33%; } 
 <div class="grid-wrapper"> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> <div class="grid-item"> <p>Grid Item</p> </div> </div> 


單獨說明一下,如果您有興趣使用Flexbox 連續放置n個項目 ,則以下答案可能會為您提供更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM