如何创建具有相等宽度列的居中CSS网格?

时间:2017-08-01 12:35:17

标签: html css css3 css-grid

我想要一个菜单​​栏,其中所有菜单项具有相同的宽度(与最宽的菜单项一样宽)。菜单项的数量可以变化。如果有额外的空间,菜单应该在其容器中居中。

如果项目不适合一行,则项目可能会换行另一行,但它们仍应具有相同的宽度。像这样:

|    [   short   ] [loooooooong] [  between  ]    |
|    [  wrapped  ]                                |

我可以使用CSS吗?

我尝试使用display:grid,但失败了:



.container { 
  border: 1px solid black;
  display:inline-block;
}

.menu { 
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(50px, -webkit-max-content));
  grid-template-columns: repeat(auto-fit, minmax(50px, max-content));
  justify-content: center;
  grid-gap: 10px;
  
  background: #eee;
}

.item { 
  border: 1px solid #aaa;
  background: yellow;
  white-space: nowrap;
}

<div class="container">
  <h2>Two items</h2>
  
  <p>
    These should have equal widths (as wide as the widest one is) and be centered within the container.
  </p>
  
  <div class="menu">
    <div class="item">Short</div>
    <div class="item">Looooooooooong</div>
  </div>
  
  <p>
    They are centered all right, but don't have equal widths.
  </p>

  <h2>Three items</h2>
  
  <p>
    These three should also have same width with each other.
  </p>
  
  <div class="menu">
    <div class="item">First item</div>
    <div class="item">Second item</div>
    <div class="item">Third</div>
  </div>

  <p>
    They are centered all right, but don't have equal widths.
  </p>
  
  <h2>So many items that they won't fit on one line</h2>

  <p>
    These should also have equal widths, but they should wrap to the next row. I don't care whether the second row is centered as long as the items are aligned with the row above.
  </p>
  
  <div class="menu">
    <div class="item">First item</div>
    <div class="item">Second item</div>
    <div class="item">Third item, a longer one</div>
    <div class="item">Fourth item</div>
    <div class="item">Fifth item</div>
    <div class="item">Sixth item</div>
    <div class="item">Seventh item</div>
    <div class="item">Eight item</div>
    <div class="item">Ninth item</div>
    <div class="item">Tenth item</div>
    <div class="item">Item number 11</div>
    <div class="item">Item number 12</div>
    <div class="item">Item number 13</div>
    <div class="item">Item number 14</div>
    <div class="item">Item number 15</div>
    <div class="item">Item number 16</div>
    <div class="item">Item number 17</div>
    <div class="item">Item number 18</div>
    <div class="item">Item number 19</div>
    <div class="item">Item number 20</div>
    <div class="item">Item number 21</div>
    <div class="item">Item number 22</div>
    <div class="item">Item number 23</div>
  </div>
  <p>
    They have equal widths, but the width is the min width given in minmax and the content doesn't fit within the item.
  </p>
</div>
&#13;
&#13;
&#13;

(在CodePen中相同:https://codepen.io/jarnoan/pen/gxrEpR

问题Centered table-like layout with columns of equal widths using CSS?类似,但是按钮的数量是固定的,没有包装。

不需要显示:grid。

2 个答案:

答案 0 :(得分:1)

你有没有试过1fr 1fr 1fr(每个代表整个单一部分,在这种情况下,列)

其他人正在推荐使用flexbox,但是css-grid理论上可以做任何flexbox但可以获得二维的额外好处(相比之下只有1 w / flexbox)。此外,css-grid集成在浏览器级别,因此不依赖于任何框架。

答案 1 :(得分:0)

我现在有同样的问题。我能想到的最好的是。

.menu {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}
.item {
    flex: 0 1 200px;
    text-align: center;
}

这样,菜单项通常会占用200像素,但是如果没有足够的可用空间则会缩小菜单,并在内容需要时进行包装。

缺点是,如果一项需要超过200像素,则该项会增长,而另一项不会随之增长。每个包裹的物品也将居中,而不是向左对齐。