使用CSS Grid创建等宽度的侧边栏列

4

在中间列占用剩余空间的情况下,左右两列是否可以拥有相同的宽度? 我不想像grid-template-columns: 20% 60% 20%这样设置百分比,因为不确定这些列的内容是什么。

Flexbox和表格似乎都没有解决此问题的方案,因此我再次尝试使用网格分数,但没有任何运气。

.grid {
    display: grid;
    grid-gap: 20px;
    grid-template-columns: 1fr auto 1fr;
}

.col-1 {
    background-color: #FFCCCC;
    white-space: nowrap;
}

.col-2 {
    background-color: #CCFFCC;
}

.col-3 {
    background-color: #CCCCFF;
    white-space: nowrap;
}
<div class="grid">
    <div class="col col-1">This is column one</div>
    <div class="col col-2">Morbi semper accumsan odio, a interdum nisl dapibus eget. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque placerat urna ut finibus mollis. Morbi risus odio, pulvinar non rutrum nec, lacinia sit amet diam. Sed vitae imperdiet felis, sed gravida tortor. Maecenas a nisl ac leo finibus sollicitudin. Vestibulum non scelerisque odio, vehicula aliquam tortor.</div>
    <div class="col col-3">Column 3</div>
</div>


使用 flexbox 像 这个 这样的东西?如果你想让两列宽度一样,这意味着应用固定宽度或使用百分比,此外如果宽度小于内容会发生什么? - Rainbow
我尝试了你建议的方法,但是列应该与它们的内容一样宽。它们不应该更小。 - Kees Hak
列的宽度应该与其内容一样宽。如果一个列的内容比另一个列的内容小,那么它们就不能是相等的大小,我建议您编辑您的问题并添加所有您想要的规则。 - Rainbow
没有更多的规则,一切都在这里:“...左右两列具有相同的宽度,而中间列占据剩余的空间”。 - Kees Hak
1个回答

2
这里有一个“hacky”的想法,关键是要使用具有两列的网格,并占用容器宽度的一半。然后,将左右列都放在彼此上方以确保它们相等,并通过翻译的魔术来纠正重叠并获得所需内容。唯一的缺点是我们需要知道主容器的宽度。在全屏幕上检查下面的内容以获得完美的结果,因为我正在使用包括滚动条宽度的100vw。

.grid {
  display: grid;
  width:50%;
  grid-gap: 20px;
  grid-template-columns: auto minmax(0,1fr);
  margin:10px 0;
}

.col-1,
.col-3{
  background-color: #FFCCCC;
  white-space: nowrap;
  grid-column:1;
  grid-row:1;
}

.col-2 {
  background-color: #CCFFCC;
  width:200%;
}

.col-3 {
  background-color: #CCCCFF;
  transform:translateX(calc(100vw - 100%));
}

body {
  margin:0;
}
<div class="grid">
  <div class="col col-1">This is column one</div>
  <div class="col col-2">Morbi semper accumsan odio, a interdum nisl dapibus eget. Orci varius natoque penatibus et magnis </div>
  <div class="col col-3">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">This is column one</div>
  <div class="col col-2">Morbi semper </div>
  <div class="col col-3">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">This is column one too long</div>
  <div class="col col-2">Morbi semper </div>
  <div class="col col-3">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">This is column one too long</div>
  <div class="col col-2">Morbi semper accumsan odio, a interdum nisl dapibus eget. Orci varius natoque penatibus et magnis </div>
  <div class="col col-3">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">..</div>
  <div class="col col-2">Morbi semper accumsan odio, a interdum nisl dapibus eget. Orci varius natoque penatibus et magnis </div>
  <div class="col col-3">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">..</div>
  <div class="col col-2">Morbi  </div>
  <div class="col col-3">Column 3</div>
</div>

这里是一步一步的说明,以便理解技巧:

.grid {
  display: grid;
  width:50%;
  grid-gap: 20px;
  grid-template-columns: auto minmax(0,1fr);
  margin:10px 0;
}

.col-1,
.col-3{
  background-color: #FFCCCC;
  white-space: nowrap;
  grid-column:1;
  grid-row:1;
}

.col-2 {
  background-color: #CCFFCC;
}

.col-3 {
  background-color: #CCCCFF;
  opacity:0.8;
}

body {
  margin:0;
}
<div class="grid">
  <div class="col col-1">This is column one</div>
  <div class="col col-2">Morbi semper accumsan odio, a interdum nisl</div>
  <div class="col col-3">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">This is column one</div>
  <div class="col col-2" >Morbi semper accumsan odio, a interdum nisl </div>
  <div class="col col-3" style="transform:translateX(calc(100vw - 100%));">Column 3</div>
</div>

<div class="grid">
  <div class="col col-1">This is column one</div>
  <div class="col col-2" style="width:200%;">Morbi semper accumsan odio, a interdum nisls </div>
  <div class="col col-3" style="transform:translateX(calc(100vw - 100%));">Column 3</div>
</div>


我喜欢这个想法,但是它不适用,因为我无法确定哪一列将决定最大宽度。它可能是左侧的列,也可能是右侧的列。 - Kees Hak
@KeesHak 这不是问题,代码总会使两个宽度相等,然后由您决定哪一个将修复宽度。例如:https://jsfiddle.net/c938hfsk/ .. 我使右列定义了宽度,即使左列有更多内容。 - Temani Afif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接