在一个包含三条轨道的网格行中,我希望左右轨道大小完全相等,同时保留两者中较大的 min-content 值,并且让中间轨道占据剩余空间,无论其内容大小如何。以下 HTML+CSS 代码演示了这个问题:
nav {
display: grid;
grid-template-columns: 1fr auto 1fr;
/* grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); */
background: green;
align-items: center;
overflow: hidden;
}
.box {
box-sizing: border-box;
overflow: hidden;
}
.scroll-container {
position: relative;
}
ul {
display: flex;
border: 1px solid black;
border-radius: 4px;
list-style: none;
padding: 0;
overflow-x: auto;
position: relative;
li {
padding: 8px 16px;
white-space: nowrap;
&:not(:last-child) {
border-inline-end: 1px solid black;
}
}
}
.edge {
padding: 8px;
white-space: nowrap;
}
.right {
justify-self: end;
}
<nav>
<div class="box edge left">
<h3 class="title">Super Cool App</h3>
</div>
<div class="box centre">
<div class="scroll-container">
<ul class="links">
<li>First Link Item</li>
<li>Second Link Item</li>
<li>Third Link Item</li>
<li>Fourth Link Item</li>
<li>Fifth Link Item</li>
<li>Sixth Link Item</li>
<li>Seventh Link Item</li>
<li>Eighth Link Item</li>
<li>Ninth Link Item</li>
<li>Tenth Link Item</li>
</ul>
</div>
</div>
<div class="box edge right">
<button>X</button>
</div>
</nav>
grid-template-columns: 1fr auto 1fr;
某种程度上很好地描述了我想要实现的目标,但却行不通。相反,正如其他人在其他地方提到的1fr
那样minmax(auto, 1fr)
,边缘轨道的宽度会减小到 0,而中间轨道会占据整个空间。类似于 的方法grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr);
虽然效果会稍微好一些,但也不是我想要的,因为它会将边缘减小到min-content
,而每个边缘的宽度都不同,也就是说,它们的宽度不会相等。
简短回答:不,没有一些妥协就无法做到这一点。
您的要求没有意义,您希望所有三列都填充“剩余空间”,这是无法计算的,因为您没有指定“占用空间”。
基本上,您希望给出任何占用空间的感觉,以便浏览器可以计算出为其他空间提供多少空间。
选项 1:限制中间部分的长度,并围绕该长度进行设计。两侧边缘将强制大小相同。
选项 2:限制中间可以增长的距离并将边缘最小化到内容,只有当中间不需要空间时,边缘才会匹配大小,但所有内容始终可见。
选项3:定义边缘的尺寸。中间部分将占用边缘未占用的剩余空间。
选项 4:将所有内容放在 flex 参数上。相对大小将始终保持不变。
可能还有其他语法可以实现类似的结果,例如涉及 col-span 等,但这些基本上是您逻辑构建网格的选项。
将左侧元素扩展到最大值,并使用 Javascript 获取左侧元素的宽度并添加到右侧元素。
JavaScript 用于更改宽度。您可以修改并添加事件监听器来监听调整大小事件。
我认为仅使用 CSS 不可能做到这一点。
但即使有,我也不会用那种设计。我不会试图让左右两侧的宽度相等。如果左右两侧的轨道都恰到好处地设置,看起来会更好——这样中心轨道和两个边缘轨道之间的间隙就会相等。只需使用带有 的弹性盒子即可
justify-content: space-between
。