使用 grid/flex 使行之间的列大小均匀
Evenly sized columns between rows using grid/flex
考虑以下片段:
#container{
border: solid 1px black;
display: inline-grid;
grid-template-columns: repeat(3, auto);
}
<div id="container">
<div class="row">
<div class="item">A1111</div>
<div class="item">B1</div>
<div class="item">C1</div>
</div>
<div class="row">
<div class="item">A2</div>
<div class="item">B2222</div>
<div class="item">C2</div>
</div>
<div class="row">
<div class="item">A3</div>
<div class="item">B3</div>
<div class="item">C3333</div>
</div>
</div>
最终结果是一个类似于 table 的显示,其中每一行的每个项目都是该列中最宽项目的宽度。
A1111 A2 A3
B1 B2222 B3
C1 C2 C3333
太棒了 - 但我需要 table 排列成行...
A1111 B1 C1
A2 B2222 C2
A3 B3 C3333
display: table
解决了这个问题 - 但 table 在间距、对齐等方面有一些缺点。因此,grid 和 flex 看起来很有吸引力。
唉,我想不出如何按需要排列信息。
将 display: grid
添加到 .row
有助于信息的顺序,但不会保持相等的列宽。
项目内容会有所不同,因此不能使用固定宽度,也不希望 grid/flex 跨越整个 page/containing 宽度。
我有办法做到。
.row {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
}
.row > .item {
display:block;
flex: 1 1;
border: 1px solid #000;
}
关于flex
的指南太棒了; Click here.
您可以使用 grid-column 定义网格项目应该在哪一列。这意味着该行不需要包含行 div.
工作示例...
#container{
border: solid 1px black;
display: inline-grid;
grid-auto-flow: row;
grid-gap: 10px;
padding: 10px;
}
.col1{
grid-column: 1;
}
.col2{
grid-column: 2;
}
.col3{
grid-column: 3;
}
<div id="container">
<div class="col1">A11111</div>
<div class="col2">B1</div>
<div class="col3">C1</div>
<div class="col1">A2</div>
<div class="col2">B2222222</div>
<div class="col3">C2</div>
<div class="col1">A3</div>
<div class="col2">B3</div>
<div class="col3">C33333333</div>
</div>
</div>
你的主要问题是你的标记太深了。您有类似 table 的标记,三层深度:table、行和单元格。对于网格布局,根本不需要“行”元素。
当您在元素上使用 display: grid
或 display: inline-grid
时,它会使该元素成为 网格容器 。然后它的每个子元素都变成 网格项 。网格项将布置在由其容器定义的网格中。
您还说过您想要等宽的列。为此,您应该使用 fr
单位而不是 auto
作为列大小:
grid-template-columns: repeat(3, 1fr);
…这将使每一列成为一个“分数”单位宽度。
#container{
border: solid 1px black;
display: inline-grid;
grid-template-columns: repeat(3, 1fr);
}
<div id="container">
<div class="item">A1111</div>
<div class="item">B1</div>
<div class="item">C1</div>
<div class="item">A2</div>
<div class="item">B2222</div>
<div class="item">C2</div>
<div class="item">A3</div>
<div class="item">B3</div>
<div class="item">C3333</div>
</div>
考虑以下片段:
#container{
border: solid 1px black;
display: inline-grid;
grid-template-columns: repeat(3, auto);
}
<div id="container">
<div class="row">
<div class="item">A1111</div>
<div class="item">B1</div>
<div class="item">C1</div>
</div>
<div class="row">
<div class="item">A2</div>
<div class="item">B2222</div>
<div class="item">C2</div>
</div>
<div class="row">
<div class="item">A3</div>
<div class="item">B3</div>
<div class="item">C3333</div>
</div>
</div>
最终结果是一个类似于 table 的显示,其中每一行的每个项目都是该列中最宽项目的宽度。
A1111 A2 A3
B1 B2222 B3
C1 C2 C3333
太棒了 - 但我需要 table 排列成行...
A1111 B1 C1
A2 B2222 C2
A3 B3 C3333
display: table
解决了这个问题 - 但 table 在间距、对齐等方面有一些缺点。因此,grid 和 flex 看起来很有吸引力。
唉,我想不出如何按需要排列信息。
将 display: grid
添加到 .row
有助于信息的顺序,但不会保持相等的列宽。
项目内容会有所不同,因此不能使用固定宽度,也不希望 grid/flex 跨越整个 page/containing 宽度。
我有办法做到。
.row {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
}
.row > .item {
display:block;
flex: 1 1;
border: 1px solid #000;
}
关于flex
的指南太棒了; Click here.
您可以使用 grid-column 定义网格项目应该在哪一列。这意味着该行不需要包含行 div.
工作示例...
#container{
border: solid 1px black;
display: inline-grid;
grid-auto-flow: row;
grid-gap: 10px;
padding: 10px;
}
.col1{
grid-column: 1;
}
.col2{
grid-column: 2;
}
.col3{
grid-column: 3;
}
<div id="container">
<div class="col1">A11111</div>
<div class="col2">B1</div>
<div class="col3">C1</div>
<div class="col1">A2</div>
<div class="col2">B2222222</div>
<div class="col3">C2</div>
<div class="col1">A3</div>
<div class="col2">B3</div>
<div class="col3">C33333333</div>
</div>
</div>
你的主要问题是你的标记太深了。您有类似 table 的标记,三层深度:table、行和单元格。对于网格布局,根本不需要“行”元素。
当您在元素上使用 display: grid
或 display: inline-grid
时,它会使该元素成为 网格容器 。然后它的每个子元素都变成 网格项 。网格项将布置在由其容器定义的网格中。
您还说过您想要等宽的列。为此,您应该使用 fr
单位而不是 auto
作为列大小:
grid-template-columns: repeat(3, 1fr);
…这将使每一列成为一个“分数”单位宽度。
#container{
border: solid 1px black;
display: inline-grid;
grid-template-columns: repeat(3, 1fr);
}
<div id="container">
<div class="item">A1111</div>
<div class="item">B1</div>
<div class="item">C1</div>
<div class="item">A2</div>
<div class="item">B2222</div>
<div class="item">C2</div>
<div class="item">A3</div>
<div class="item">B3</div>
<div class="item">C3333</div>
</div>