使用4个方形按钮创建自适应布局

时间:2019-05-16 07:24:00

标签: css css3 flexbox css-grid

我想创建一个这样的布局:

enter image description here

黑色边框表示窗口(或容器)的宽度。 粉色方块很简单divs,我将其视为按钮。它们始终具有相同的四个大小,并且总是正方形。

单个按钮的最大宽度必须为300px,最小为50px。 当有足够的空间时,所有四个按钮都位于同一行上,否则最后两个按钮将位于新行上。 按钮可调整大小。重要的是它们永远不会小于50px并且总是正方形。

我该怎么办?我曾尝试使用Flexbox,例如:https://codepen.io/anon/pen/NVpzYe

但是显然它不起作用。然后我不知道如何设置正确的高度。

.container {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
}

.firstChildren {
  width: 50%;
  border: 1px solid black;
  display: flex;
  height: 50px;
  minWidth: 50px;
}

.secondChildren {
  width: 50%;
  border: 1px solid black;
  height: 50px;
}
<div class="container">
  <div class="firstChildren">
    <div class="secondChildren" />
    <div class="secondChildren" />
  </div>
  <div class="firstChildren">
    <div class="secondChildren" />
    <div class="secondChildren" />
  </div>
</div>

2 个答案:

答案 0 :(得分:2)

维护与嵌套弹性框相同的标记:

  • flex: 1 1 50%使用firstChildren,以便它们在行中共享相等的空间,

  • flex: 1元素上设置secondChildren以延伸到可用空间,

  • min-width: 50px上将secondChildren设置为最小宽度要求,

现在向框添加一些边距,并在伪元素上使用padding-top: 100%使框成为正方形(请注意,框的限制为300px max-width应用于firstChild元素以调整此边距)-尝试更改窗口大小并检查以下代码段:

* {
  box-sizing: border-box;
}

.container {
  display: flex;
  flex-wrap: wrap;
}

.firstChildren {
  flex: 1 1 50%;
  display: flex;
  max-width: 640px; /* max-width = 300px + 4 x 10px margin */
}

.secondChildren {
  flex: 1;
  border: 1px solid black;
  min-width: 50px; /* minimum width */
  margin: 10px;
}

.secondChildren:after { /* create squares */
  content: '';
  display: inline-block;
  vertical-align: top;
  padding-top: 100%;
}
<div class="container">
  <div class="firstChildren">
    <div class="secondChildren"></div>
    <div class="secondChildren"></div>
  </div>
  <div class="firstChildren">
    <div class="secondChildren"></div>
    <div class="secondChildren"></div>
  </div>
</div>

答案 1 :(得分:0)

使用flex: 0 1 ...

注意!

您必须使用</div>而不是/关闭div

See working code

.container {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
}

.firstChildren {
  display: flex;
  flex-wrap: nowrap;
  flex: 1 0 25%;
  margin: 2rem;
}

.secondChildren {
  flex: 0 1 50%;
  height: 30vh;
  background: pink;
  margin: 2rem;
  min-width: 50px;
  max-width: 300px;
}
<div class="container">
  <div class="firstChildren">
  <div class="secondChildren"></div>
    <div class="secondChildren"></div>
  </div>
  <div class="firstChildren">
    <div class="secondChildren"></div>
    <div class="secondChildren"></div>
  </div>
</div>