gar*_*hdn 163 html css aspect-ratio grid-layout responsive-design
我想知道如何创建一个响应方块的布局.每个正方形都有垂直和水平对齐的内容.具体示例如下所示......

web*_*iki 403
您只能使用CSS制作具有verticaly和horizontaly 居中内容的响应方格.我将在一步一步的过程中解释如何,但首先是你可以实现的2个演示:
现在让我们看看如何制作这些花哨的响应方块!
保持元素平方(或其他比例)的技巧是使用百分比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)
因为你不能直接在正方形内添加内容(它会扩展它们的高度,而正方形不再是正方形)你需要在它们内部创建子元素(对于这个例子我是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)
结果 < - 使用一些格式使其漂亮!
Horizontaly:
这很简单,你只需要添加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)
我们现在已经完成了,我们可以看一下这里的结果:
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)
接受的答案很棒,但可以这样做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中测试的.
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)