我在一个页面上有多个div,每个都配置为display: gridgrid-template-columns: auto auto auto.我希望每个网格共享相同的列宽,除了使用自动适应行为而不是硬编码像素宽度或使用1fr 1fr 1fr.

换句话说,我希望实现这一点:

Grids with shared column layout but placed/styled independently

其中,每列增长到在两个网格上测量的最大内容宽度(请注意,绿色线条只是为了说明共享宽度布局),而不是这样:

Auto-fitted columns are totally independent between the two grids

其中每个网格的列宽仅基于其自己的子单元格.

我正在寻找的是WPF GridSharedSizeGroup的类似功能,对于那些熟悉的人来说,或者是一个解决办法.基本上,我希望两个栅格都被视为一个自动安装的柱,但仍然是单独的div,可以独立放置和设置样式.

尽管我相当肯定不存在,但仅使用css的解决方案将是理想的.我使用Java脚本没有问题,但即使是一个Java脚本解决方案,我也无法完全放弃grid并重新发明它.

无论哪种方式,我都需要一些可伸缩的东西(也就是说,我不想手动设置任何像素宽度,也不想要一个只适用于特定布局场景的特别解决方案).

这个是可能的吗?

推荐答案

确保所有项目都在同一网格中.使内容位于网格内,但跨所有网格列轨道展开.

<div style="display: grid; grid-template-columns: repeat(3, auto);">
  <div>Auto</div>
  <div>Auto</div>
  <div>Auto</div>
  <div>AAAAAAAAAAAAAAAAAAAAAA</div>
  <div>BB</div>
  <div>CCCCCCCCC</div>
  <div>AAAAA</div>
  <div>BBBBBBBBBBBBBBBBB</div>
  <div>CCCCCCCCCCCCC</div>
  <div>AAA</div>
  <div>BBBBBBB</div>
  <div>CCCCCCCCCCCCCCCCCC</div>

  <div style="grid-column: 1 / -1; padding: 2em; text-align: center">Other content</div>

  <div>Auto</div>
  <div>Auto</div>
  <div>Auto</div>
  <div>AAAA</div>
  <div>BBBBBBB</div>
  <div>CCCCCCCCC</div>
  <div>AAAAAAAAA</div>
  <div>BB</div>
  <div>CCCCCCCCC</div>
  <div>AAAAAAAAAAAA</div>
  <div>BBBBBBB</div>
  <div>CCCCC</div>
</div>

根据 comments 进行编辑

您需要使用JavaScript"同步"网格列轨道.在这里,我使用第一个表第一行的前三个元素来检测网格列轨道宽度,然后将它们作为值grid-template-columns传递给第二个网格.

document.querySelector('.js-grid-to').style.gridTemplateColumns =
  [...document.querySelector('.js-grid-from').children]
    .slice(0, 3)
    .map((element) => `${element.getBoundingClientRect().width}px`)
    .join(' ');
<div class="js-grid-from" style="display: grid; grid-template-columns: repeat(3, auto);">
  <div>Auto</div>
  <div>Auto</div>
  <div>Auto</div>
  <div>AAAAAAAAAAAAAAAAAAAAAA</div>
  <div>BB</div>
  <div>CCCCCCCCC</div>
  <div>AAAAA</div>
  <div>BBBBBBBBBBBBBBBBB</div>
  <div>CCCCCCCCCCCCC</div>
  <div>AAA</div>
  <div>BBBBBBB</div>
  <div>CCCCCCCCCCCCCCCCCC</div>
</div>

<div style="padding: 2em; text-align: center">Other content</div>

<div class="js-grid-to" style="display: grid">
  <div>Auto</div>
  <div>Auto</div>
  <div>Auto</div>
  <div>AAAA</div>
  <div>BBBBBBB</div>
  <div>CCCCCCCCC</div>
  <div>AAAAAAAAA</div>
  <div>BB</div>
  <div>CCCCCCCCC</div>
  <div>AAAAAAAAAAAA</div>
  <div>BBBBBBB</div>
  <div>CCCCC</div>
</div>

Css相关问答推荐

使用location:stickly将元素固定到其父容器的顶部

JavaFX如何在Tableview中使用默认和自定义的列标题CSS样式?

Vue3日期 Select 器:禁用向左和向右箭头

Vuetify 抽屉标签溢出/z-index

使 MUI 自动完成打断长词以适合布局

如何更改导航栏标题中链接的文本 colored颜色 和导航丸中的链接(在shiny 的应用程序中)?

Vue.js 变量中的动态类变量

没有 colored颜色 Select 器的 JavaFX colored颜色 Select 器

如果父项的不透明度小于 1,则背景过滤器不适用

CSS网格使sibling 项目拉伸

边界半径不起作用

中心表单提交按钮 HTML / CSS

以原始大小的 50% 显示图像

调用转发到 JSP 的 Servlet 时,浏览器无法访问/查找相关资源,如 CSS、图像和链接

CSS - 悬停穿过元素以激活悬停在被覆盖的元素上

当子元素水平溢出时,为什么忽略父元素的右填充?

将 Fixed div 设置为父容器的 100% 宽度

通过 JavaScript 更改 CSS 伪元素样式

CSS:悬停一个元素,多个元素的效果?

可见性:隐藏 vs 显示:无 vs 不透明度:0