You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CSS Grid实现左右轨道等宽、取最大min-content,中间占剩余空间?

实现左右等宽且遵循最大min-content的三列Grid布局

需求说明

需要构建一个三列Grid布局,满足以下要求:

  • 左右两侧轨道宽度完全相等
  • 左右轨道的最小宽度取两者内容中较大的min-content值
  • 中间轨道始终占据剩余空间

现有方案的问题

之前尝试的两种写法都无法满足需求:

  • 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,导致两侧宽度不等

解决方案

通过CSS变量+JS计算结合Grid布局实现需求:先计算左右元素的宽度最大值,将其设为左右轨道的最小宽度,剩余空间由两侧轨道平分。

完整代码

CSS

nav {
  display: grid;
  /* 左右轨道最小宽度为计算出的最大值,剩余空间平分 */
  grid-template-columns: minmax(var(--min-edge-width), 1fr) auto minmax(var(--min-edge-width), 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;
}

ul li {
  padding: 8px 16px;
  white-space: nowrap;
}

ul li:not(:last-child) {
  border-inline-end: 1px solid black;
}

.edge {
  padding: 8px;
  white-space: nowrap;
}

.right {
  justify-self: end;
}

HTML

<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>

JavaScript

// 计算左右元素的宽度,取最大值作为轨道最小宽度
const leftEl = document.querySelector('.left');
const rightEl = document.querySelector('.right');
const maxEdgeWidth = Math.max(leftEl.offsetWidth, rightEl.offsetWidth);
document.querySelector('nav').style.setProperty('--min-edge-width', `${maxEdgeWidth}px`);

// 窗口大小变化时重新计算,保持布局适配
window.addEventListener('resize', () => {
  const newMaxWidth = Math.max(leftEl.offsetWidth, rightEl.offsetWidth);
  document.querySelector('nav').style.setProperty('--min-edge-width', `${newMaxWidth}px`);
});

效果说明

  • 左右轨道宽度始终相等,且不会小于两侧元素中较宽的那个的内容宽度
  • 窗口宽度足够时,剩余空间由左右轨道平分
  • 中间轨道保持自身内容宽度,空间不足时可横向滚动

内容的提问来源于stack exchange,提问作者t.schoel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:52:10