我有一些div .test
和grid-template-columns: auto auto auto;
,因为我希望列宽像flex效果,这取决于元素的宽度,还有justify-content: start;
向左对齐列,这也是为什么我使用auto
而不是1fr
,因为我不希望列被拉伸到更长的宽度。
问题是,我不知道如何像表格一样整齐地对齐列,从下面的例子中可以看出,第二个div .test
中的p .target
比第一个长,我试图实现的是使所有其他列宽度跟随最长的一个。
PS:我不想用table。我还可以使用JavaScript找到最长的一个,并将所有其他的宽度设置为这个。我只是想看看是否有一个简单的解决方案与CSS只。
p {
margin: 0;
}
.test {
column-gap: 30px;
display: grid;
grid-template-columns: auto auto auto;
justify-content: start;
}
p:nth-child(2) {
position: relative;
width: 120px;
}
.flex {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
position: absolute;
left: 0;
right: 0;
}
<div class="test">
<p class="target">Hello</p>
<p><span class="flex">Helloooooooooooooo</span></p>
<p>Hello</p>
</div>
<div class="test">
<p class="target">Hellooo</p>
<p><span class="flex">Helloooooooooooooo</span></p>
<p>Hello</p>
</div>
例如,它在表中看起来像这样:
td:nth-child(2) {
position: relative;
width: 120px;
}
.flex {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
position: absolute;
left: 0;
right: 0;
top: 0;
}
<table>
<tbody>
<tr>
<td>Hello</td>
<td><span class="flex">Helloooooooooooooo</span></td>
<td>Hello</td>
</tr>
<tr>
<td>Hellooo</td>
<td><span class="flex">Helloooooooooooooo</span></td>
<td>Hello</td>
</tr>
</tbody>
</table>
请注意,所有第二列一起开始,即使第一列“hellooo”从第二行开始更长。
2条答案
按热度按时间bejyjqdl1#
重构你的HTML,以便在一个网格中添加所有项目,并使用
inline-grid
:请注意,您必须使用更复杂的
nth-child
来定位每行的第二个元素:试试看:
kcugc4gi2#
如果你想让网格列表现得像一个表格,你需要把你的项目放在一个网格容器中,而不是两个单独的容器中:
要设置每行第二个元素的宽度,您只需在网格布局中指定宽度:
但是,如果我们现在去掉
p:nth-child(2)
选择器,我们将使.flex
元素完全定位在网格上,而不是p
元素,这会搞乱布局。但实际上,您可以完全摆脱绝对定位,而不会弄乱布局,并将溢出属性应用于所有网格项,如下所示:
下面是结果,更干净的代码: