【问题标题】:How to arrange items in css grid with auto heights如何在具有自动高度的 CSS 网格中排列项目
【发布时间】:2021-10-25 22:54:36
【问题描述】:

我想用 CSS 网格制作一个看起来很简单的童话布局。

如上图所示,我想将 3 个项目以与图中所示完全相同的顺序放置在网格中,我不想为任何项目设置特定高度,因为每个项目根据里面的内容有不同的高度。我想将 70% 的网格水平空间分配给 item1,将 30% 分配给 item2 和 item3,item3 应该放在 item2 下方。同样,项目的高度应该是auto。我尝试了很多小时来实现这一目标,但没有成功。

问题的标记:

<div class="container">
  <div class="item1">some content in it...</div>
  <div class="item2">some Content in it...</div>
  <div class="item3">some Content in it...</div>
</div>

【问题讨论】:

  • 嗨,欢迎来到 SO。请先参观。然后阅读how to ask questions here。之后编辑问题以符合指南并提供minimal reproducible example 以获取调试详细信息。带有代码行的图片是不能接受的!!
  • 你能和我们分享一下你目前的尝试吗?
  • 他们应该如何表现?他们反应灵敏吗? item1 下方是否会有更多项目,或者您是否希望始终有 2 列分开?
  • @F.Müller,我没有提供代码,因为我认为这是一个非常简单的示例,因此不需要任何冗长的代码来显示,但我尝试通过应用网格列来排列每个项目在每个项目上,但没有这样做。另外,我现在对网格不太擅长。
  • 我想要完全相同的布局,3 个项目以相同的顺序排列不同的高度,是的,它们应该是响应式的

标签: css flexbox css-grid


【解决方案1】:

按要求解决:

您可以使用grid-template-areas 将第一项跨越多行。并在右列末尾使用一个垫片,使项目与需要的一样大。

我们可以使用 calc 来计算grip-gap。

.grid {
  display: grid;
  grid-gap: 20px;
  grid-template-columns: calc(70% - 10px) calc(30% - 10px);
  grid-template-areas: "item-1 item-2" "item-1 item-3" "item-1 spacer";
  border: 1px dashed #000;
  align-items: start;
}

.item {
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 32px;
  font-weight: bold;
}

@media screen and (max-width: 600px) {
  .grid {
    grid-template-areas: "item-2" "item-1" "item-3";
    grid-template-columns: 100%;
  }
}

.item-1 {
  grid-area: item-1;
}

.item-2 {
  grid-area: item-2;
}

.item-3 {
  grid-area: item-3;
}

.purple {
  background-color: #5B00FF;
}

.red {
  background-color: #FF0000;
}

.pink {
  background-color: #FF00FD
}

.h-500 {
  height: 500px;
}

.h-100 {
  height: 100px;
}

.h-200 {
  height: 200px;
}
<div class="grid">
  <div class="item item-1 purple h-500">Item 1</div>
  <div class="item item-2 red h-100">Item 2</div>
  <div class="item item-3 pink h-200">Item 3</div>
</div>

不同列的替代解决方案:

您可以将grid-gap 与grid-template-columns 一起使用。您必须将grid-gap 考虑到模板列的宽度这就是为什么会有这个计算。

.grid {
  display: grid;
  grid-gap: 20px;
  grid-template-columns: calc(70% - 10px) calc(30% - 10px);
  border: 1px dashed #000;
}

.col--right {
  display: flex;
  flex-flow: column nowrap;
  gap: 20px;
}

.item {
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 32px;
  font-weight: bold;
}

.purple {
  background-color: #5B00FF;
}

.red {
  background-color: #FF0000;
}

.pink {
  background-color: #FF00FD
}

.h-500 {
  height: 500px;
}

.h-100 {
  height: 100px;
}

.h-200 {
  height: 200px;
}
<div class="grid">
  <div class="col col--left">
    <div class="item purple h-500">Item 1</div>
  </div>
  <div class="col col--right">
    <div class="item red h-100">Item 2</div>
    <div class="item pink h-200">Item 3</div>
  </div>
</div>

【讨论】:

  • 感谢您的努力,但正如我在问题中所说,我想要网格容器中的 3 个项目,如问题中提供的标记所示。您创建 2 个网格项目,然后在夹点中创建 2 个列,这样很容易创建。但我想将 3 个项目以类似的顺序排列在 2 列中,如图所示。
  • 我想在网格容器中显示 3 个单独项目的原因是因为我想在桌面屏幕中使用网格将这些项目显示为网格,并在移动屏幕中使用 flexbox 垂直显示这些项目
  • 希望你现在明白我的问题
  • 为什么要切换到移动版 flexbox?您可以将项目设置为 100% 宽,以便它们显示在彼此下方。
  • @SuryanshSingh 好吧,如果将它隐藏在 DOM 中,那么它当然不会真正影响性能。但是,如果您同时拥有这两种解决方案,则需要同时渲染这两种解决方案并让 DOM 完成其工作(还需要额外的媒体查询)。嗯,这是一个非常小的影响,但仍然。你为什么要两者兼得?我的意思是它背后的数学和事件会在 DOM 或视口发生变化时触发,所以你必须做的计算越少越好。
猜你喜欢
  • 2017-09-16
  • 2020-10-02
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2013-06-27
  • 1970-01-01
相关资源
最近更新 更多