CSS Flex网格 - 最后一项的宽度相同

时间:2013-10-28 01:00:35

标签: css css3 layout flexbox

嘿我正在尝试为图库创建一个响应式的框布局,看起来像http://webdesignerwall.com/demo/responsive-column-grid/

示例的问题在于宽度是硬编码的,并且媒体查询是必需的。我有很多专栏可以解决这个问题。

我可以使用Flex girds获得相同的结果,但是最后一列比其他列大,如此CodePen所示:

http://codepen.io/anon/pen/zClcx

HTML

<div class="flex-container same-width same-height">
  <div class="flex-item">
    <div>g</div>
  </div>
  <div class="flex-item">
    <div>g</div>
  </div>
  <div class="flex-item">
    <div>g</div>
  </div>
  <div class="flex-item">
    <div>why am I longer than my friends?</div>
  </div>
</div>

CSS

.flex-container {
    display: -webkit-flex;
    display: flex;
    width: 100%;
    max-width: 950px;
    flex-wrap: wrap;
    justify-content: space-between;
    background: grey;

  & > * {
    min-width: 300px;
    background: green;
    max-width: 404px;
    flex: 1 1 auto;
  }
  .flex-item > div {
    background: red;
  }
}

问题: 如何让最后一列与其他列的尺寸相同?

4 个答案:

答案 0 :(得分:21)

将flex增长设为0。

小提琴:http://jsfiddle.net/RichAyotte/Ev5V7/

enter image description here

<div class='flex-container seven'>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
</div>

.flex-container {
    display: flex;
    flex-flow: row wrap;
    justify-content: flex-start;
}
.flex-container div {
    font-size: 200%;
    padding: 2mm;
    margin: 10px 10px;
    flex: 0 1 20%;
    box-shadow: 3px 3px 2px 0px rgba(50, 50, 50, 0.5);
}

答案 1 :(得分:10)

这是一种常见的误解,但Flexbox不是网格系统。将弹性项设置为灵活后,它们只能相对于同一行上的其他弹性项目进行大小调整,而不能使用任何其他行上的弹性项目进行调整。没有使用特定宽度就无法强制它们排队(尽管这个宽度可以是百分比)。

由于您的柔性物品非常灵活,因此您的最小宽度无用。您的flex-shrink值没有用处,因为您的flex项目可以包装。最大宽度是阻止最后一行上的项填充整行的唯一因素。您必须知道前一行中项目的确切宽度才能设置正确的最大宽度值。

相关:

答案 2 :(得分:5)

使用弹性框,您必须小心max-min-宽度。引自w3schools

  

提示:随着盒子缩小和增长,柔性元素会缩小或增长。只要盒子中有额外的空间,就会扩展柔性元素以填充该空间。

要抵消这种情况,请为容器启动X个像素的宽度,但使用百分比而不是内部框的像素数量。所有列的容器百分比都相同。

这样做也不需要柔性盒,因为只有当你想要在水平方向上扩展盒子时(根据每个盒子的内容使它们更宽)而不是垂直方向。

PS - 如果你想要这个响应并保持宽度与两者之间的空间成比例,也可以使用百分比作为边距(但请记住边框和填充大小)。这不是必需的,但它是在不同设备上保持一致外观的有用功能。

答案 3 :(得分:1)

CSS

.box {
    display: grid;
    grid-template-columns: repeat(auto-fill,minmax(160px, 1fr));
}

HTML

<div class="box">
    <div>One</div>
    <div>Two</div>
    <div>Three</div>
    <div>Four</div>
    <div>Five</div>
    <div>Six</div>
    <div>Seven</div>
    <div>Eight</div>
    <div>Nine</div>
    <div>Ten</div>
</div>