响应方块网格

gar*_*hdn 163 html css aspect-ratio grid-layout responsive-design

我想知道如何创建一个响应方块的布局.每个正方形都有垂直和水平对齐的内容.具体示例如下所示......

响应广场与内容

web*_*iki 403

您只能使用CSS制作具有verticaly和horizo​​ntaly 居中内容的响应方格.我将在一步一步的过程中解释如何,但首先是你可以实现的2个演示:

响应3x3方格 3x3网格中的响应方形图像

现在让我们看看如何制作这些花哨的响应方块!



1.制作响应方块:

保持元素平方(或其他比例)的技巧是使用百分比padding-bottom.
旁注:您可以使用顶部填充或顶部/底部边距,但不会显示元素的背景.

由于顶部填充是根据父元素的宽度计算的(请参阅MDN以供参考),元素的高度将根据其宽度而变化.您现在可以根据宽度保持其纵横比.
此时你可以编码:

HTML:

 <div></div>
Run Code Online (Sandbox Code Playgroud)

CSS

div {
    width: 30%;
    padding-bottom: 30%; /* = width for a square aspect ratio */
}
Run Code Online (Sandbox Code Playgroud)

这是使用上面代码的3*3方格网格的简单布局示例.

使用此技术,您可以制作任何其他宽高比,这里是一个表格,根据宽高比和30%宽度给出底部填充的值.

 Aspect ratio  |  padding-bottom  |  for 30% width
------------------------------------------------
    1:1        |  = width         |    30%
    1:2        |  width x 2       |    60%
    2:1        |  width x 0.5     |    15%
    4:3        |  width x 0.75    |    22.5%
    16:9       |  width x 0.5625  |    16.875%
Run Code Online (Sandbox Code Playgroud)




2.在正方形内添加内容

因为你不能直接在正方形内添加内容(它会扩展它们的高度,而正方形不再是正方形)你需要在它们内部创建子元素(对于这个例子我是usind div)position: absolute;并将内容放入其中.这将把内容从流中取出并保持正方形的大小.

不要忘记添加position:relative;父div,以便绝对子项相对于其父项定位/调整大小.

让我们为我们的3x3正方形网格添加一些内容:

HTML:

<div class="square">
    <div class="content">
        .. CONTENT HERE ..
    </div>
</div>
... and so on 9 times for 9 squares ...
Run Code Online (Sandbox Code Playgroud)

CSS:

.square {
    float:left;
    position: relative;
    width: 30%;
    padding-bottom: 30%; /* = width for a 1:1 aspect ratio */
    margin:1.66%;
    overflow:hidden;
}

.content {
    position:absolute;
    height:80%; /* = 100% - 2*10% padding */
    width:90%; /* = 100% - 2*5% padding */
    padding: 10% 5%;
}
Run Code Online (Sandbox Code Playgroud)

结果 < - 使用一些格式使其漂亮!



3.中心内容

Horizo​​ntaly:

这很简单,你只需要添加text-align:center即可.content.
结果

垂直对齐

这变得严重!诀窍是使用

display:table;
/* and */
display:table-cell;
vertical-align:middle;
Run Code Online (Sandbox Code Playgroud)

我们不能使用display:table;on .square.contentdiv因为它与之冲突,position:absolute;所以我们需要在.contentdiv中创建两个子节点.我们的代码将更新如下:

HTML:

<div class="square">
    <div class="content">
        <div class="table">
            <div class="table-cell">
                ... CONTENT HERE ...
            </div>
        </div>
    </div>
</div>
... and so on 9 times for 9 squares ...
Run Code Online (Sandbox Code Playgroud)

CSS:

.square {
    float:left;
    position: relative;
    width: 30%;
    padding-bottom : 30%; /* = width for a 1:1 aspect ratio */
    margin:1.66%;
    overflow:hidden;
}

.content {
    position:absolute;
    height:80%; /* = 100% - 2*10% padding */
    width:90%; /* = 100% - 2*5% padding */
    padding: 10% 5%;
}
.table{
    display:table;
    height:100%;
    width:100%;
}
.table-cell{
    display:table-cell;
    vertical-align:middle;
    height:100%;
    width:100%;
}
Run Code Online (Sandbox Code Playgroud)




我们现在已经完成了,我们可以看一下这里的结果:

LIVE FULLSCREEN结果

可编辑的小提琴


  • 这很棒.对其他人来说只是一个单挑:如果你正在使用`*{box-sizing:border-box; 你需要将.content div中的高度和宽度调整为100%.:) (4认同)
  • @ d.raev是的.填充百分比和边距根据父级的宽度计算.点击此处查看填充https://developer.mozilla.org/en-US/docs/Web/CSS/padding (2认同)
  • 保证金价值背后的计算是什么?如果我想设置一个 5x5 的网格怎么办? (2认同)
  • @kiwi1342 **all** margins + all width 在一行上的总和必须等于 100%。因此,对于 5x5 网格,您可以使用 18% 的宽度和 1% 的元素每一边的边距。 (2认同)

jbu*_*483 13

您可以使用vw(视图宽度)单位,这将使方块根据屏幕的宽度响应.

快速模拟这将是:

html,
body {
  margin: 0;
  padding: 0;
}
div {
  height: 25vw;
  width: 25vw;
  background: tomato;
  display: inline-block;
  text-align: center;
  line-height: 25vw;
  font-size: 20vw;
  margin-right: -4px;
  position: relative;
}
/*demo only*/

div:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  height: inherit;
  width: inherit;
  background: rgba(200, 200, 200, 0.6);
  transition: all 0.4s;
}
div:hover:before {
  background: rgba(200, 200, 200, 0);
}
Run Code Online (Sandbox Code Playgroud)
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`margin-left:-4px;`使用`margin-right:-4px`.相反,不要混淆mincharspace中的不一致,但设置为包装父字体大小为0,而将子元素重置为`1rem`(relative-em) (4认同)

Pat*_*ley 8

接受的答案很棒,但可以这样做flexbox.

这是一个用BEM语法编写的网格系统,允许每行显示1-10列.

如果最后一行不完整(例如,您选择每行显示5个单元格,并且有7个项目),则尾随项目将水平居中.要控制尾随项的水平对齐,只需更改类下的justify-content属性即可.square-grid.

.square-grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.square-grid__cell {
  background-color: rgba(0, 0, 0, 0.03);
  box-shadow: 0 0 0 1px black;
  overflow: hidden;
  position: relative;
}

.square-grid__content {
  left: 0;
  position: absolute;
  top: 0;
}

.square-grid__cell:after {
  content: '';
  display: block;
  padding-bottom: 100%;
}

// Sizes – Number of cells per row

.square-grid__cell--10 {
  flex-basis: 10%;
}

.square-grid__cell--9 {
  flex-basis: 11.1111111%;
}

.square-grid__cell--8 {
  flex-basis: 12.5%;
}

.square-grid__cell--7 {
  flex-basis: 14.2857143%;
}

.square-grid__cell--6 {
  flex-basis: 16.6666667%;
}

.square-grid__cell--5 {
  flex-basis: 20%;
}

.square-grid__cell--4 {
  flex-basis: 25%;
}

.square-grid__cell--3 {
  flex-basis: 33.333%;
}

.square-grid__cell--2 {
  flex-basis: 50%;
}

.square-grid__cell--1 {
  flex-basis: 100%;
}
Run Code Online (Sandbox Code Playgroud)

.square-grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.square-grid__cell {
  background-color: rgba(0, 0, 0, 0.03);
  box-shadow: 0 0 0 1px black;
  overflow: hidden;
  position: relative;
}

.square-grid__content {
  left: 0;
  position: absolute;
  top: 0;
}

.square-grid__cell:after {
  content: '';
  display: block;
  padding-bottom: 100%;
}

// Sizes – Number of cells per row

.square-grid__cell--10 {
  flex-basis: 10%;
}

.square-grid__cell--9 {
  flex-basis: 11.1111111%;
}

.square-grid__cell--8 {
  flex-basis: 12.5%;
}

.square-grid__cell--7 {
  flex-basis: 14.2857143%;
}

.square-grid__cell--6 {
  flex-basis: 16.6666667%;
}

.square-grid__cell--5 {
  flex-basis: 20%;
}

.square-grid__cell--4 {
  flex-basis: 25%;
}

.square-grid__cell--3 {
  flex-basis: 33.333%;
}

.square-grid__cell--2 {
  flex-basis: 50%;
}

.square-grid__cell--1 {
  flex-basis: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<div class='square-grid'>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
  <div class='square-grid__cell square-grid__cell--7'>
    <div class='square-grid__content'>
      Some content
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

小提琴:https://jsfiddle.net/patrickberkeley/noLm1r45/3/

这是在FF和Chrome中测试的.

  • 尽管如此,你仍然使用填充底部来修复高度,所以它实际上和接受的答案相同.唯一的区别是网格是如何形成的,而不是平方网格. (3认同)

Tem*_*fif 5

aspect-ratio 现在我们可以使用ref属性轻松地做到这一点

.container {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)); /* 3 columns */
  grid-gap: 10px;
}

.container>* {
  aspect-ratio: 1 / 1; /* a square ratio */
  border: 1px solid;
  
  /* center content */
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

img {
  max-width: 100%;
  display: block;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div> some content here </div>
  <div><img src="https://picsum.photos/id/25/400/400"></div>
  <div>
    <h1>a title</h1>
  </div>
  <div>more and more content <br>here</div>
  <div>
    <h2>another title</h2>
  </div>
  <div><img src="https://picsum.photos/id/104/400/400"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

也像下面一样,我们可以有可变数量的列

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  grid-gap: 10px;
}

.container>* {
  aspect-ratio: 1 / 1; /* a square ratio */
  border: 1px solid;
  
  /* center content */
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

img {
  max-width: 100%;
  display: block;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div> some content here </div>
  <div><img src="https://picsum.photos/id/25/400/400"></div>
  <div>
    <h1>a title</h1>
  </div>
  <div>more and more content <br>here</div>
  <div>
    <h2>another title</h2>
  </div>
  <div><img src="https://picsum.photos/id/104/400/400"></div>
  <div>more and more content <br>here</div>
  <div>
    <h2>another title</h2>
  </div>
  <div><img src="https://picsum.photos/id/104/400/400"></div>
</div>
Run Code Online (Sandbox Code Playgroud)