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

如何用CSS grid实现自动分2个等元素自动宽度列的垂直菜单

解决方案

方案1:使用CSS多列布局(最优解,无需手动计算行数)

CSS原生的columns系列属性就是专门为这类多列列表流场景设计的,完全不需要手动计算元素总数,浏览器会自动将列表项大致均分到两列,符合你所有需求。
代码示例:

ul {
  /* 固定分为2列 */
  column-count: 2;
  /* 两列之间的间距,对应你原来的grid列间距 */
  column-gap: 40px;
  padding: 0;
  list-style: none;
}

li {
  /* 行间距,对应你原来的grid行间距 */
  margin-bottom: 10px;
  /* 防止单个列表项被拆分到两列显示 */
  break-inside: avoid;
}

如果需要同时限制列的最小宽度,避免容器太窄时列被压得太窄,可以额外加column-width配置,浏览器会自动在最多2列和最小列宽之间做自适应:

ul {
  column-width: 150px;
  column-count: 2;
  column-gap: 40px;
}

方案2:Grid方案(需要极少量JS配合)

原生CSS目前暂时无法直接获取子元素的总数量来动态计算行数,如果你一定要用Grid实现,可以用少量JS动态设置行数:

const ul = document.querySelector('ul')
const liCount = ul.querySelectorAll('li').length
// 向上取整计算行数,保证两列数量大致相等
const rowCount = Math.ceil(liCount / 2)
ul.style.gridTemplateRows = `repeat(${rowCount}, 1fr)`

CSS部分保留你原来的写法即可:

ul {
  display: grid;
  gap: 10px 40px;
  grid-auto-flow: column;
}

内容的提问来源于stack exchange,提问作者user64675

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:24:01