【问题标题】:Aligning grid items across the entire row/column (like flex items can)在整个行/列中对齐网格项目(就像弹性项目一样)
【发布时间】:2018-10-18 10:26:19
【问题描述】:

使用弹性容器和flex-wrap: wrap 设置,您可以使用justify-content: center 将溢出的项目对齐到中心。

有没有办法使用 CSS 网格实现溢出网格项的相同行为?

我已经创建了一支笔来显示所需的 flex 行为

.container-flex {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.container-flex .item {
  width: 33.33%;
  background: green;
  border: 1px solid;
}

.container-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

.container-grid .item {
  background: red;
  border: 1px solid;
}

* {
  box-sizing: border-box;
}
<h3>Flex</h3>
<div class="container-flex">
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
</div>

<h3>Grid</h3>
<div class="container-grid">
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
  <div class="item">item</div>
</div>

https://codepen.io/JoeHastings/pen/PeEjjR

【问题讨论】:

  • 以一般的方式我会说不,因为这不是网格的用途......但对于特定情况,我们总能找到解决方法
  • Centering in CSS Grid的可能重复
  • @johnny 我不认为这是重复的,这个问题是关于在网格单元中居中文本/项目,这与处理网格项目本身的包装和居中非常不同
  • 我收回了。
  • 是什么让您认为 Flexbox 和 Grid 可以做到这一点?如果,那么为什么我们需要两者,一个就可以了。它们是两个完全不同的东西,虽然有一些共同点,有些则没有。我们两者都需要,因为没有一个解决方案可以处理所有事情。

标签: css flexbox css-grid


【解决方案1】:

不是你想要的 flex 方式。你必须精确地使用 CSS-Grid,

<h3>Grid</h3>
<div class="container-grid">
    <div class="item">item</div>
    <div class="item">item</div>
    <div class="item">item</div>
    <div class="item">item</div>
    <div class="item">item</div>
    <div class="item">item</div>
    <div class="item-mid">item</div>
</div>
.container-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
}
    .item {
        background: red;
        border: 1px solid;
    }
    .item-mid{
        background:purple;
        grid-column:2/1;
    }

还有,看这里,

Centering in CSS Grid

(这不是包装,但是)

【讨论】:

  • 令我惊讶的是 grid 无法处理这个问题,当你不知道会有多少项目但你希望任何溢出的项目居中时会有点烦人(没有得到javascript 涉及添加类)似乎 flex 和百分比宽度是这种情况下的最佳选择
  • 您可以在网格中使用 flex 或创建嵌套网格。我认为这样做的目的是使用 flex,因为它是单轴和 justify-content。
【解决方案2】:

Flex 和 Grid 是不同的动物,因此在 flex 中简单的行为可能无法很好地转化为网格。

弹性项目可以在容器中居中,因为弹性布局适用于flex lines。 flex line 是一行或一列。

当要求弹性项目在行/列中居中时,它可以访问整行的可用空间,从头到尾。

然而,在网格布局中,行和列必须与弯曲线所不具备的东西抗衡:轨道墙(a/k/a 网格线)。例如,在您的代码中有三列。这些列将轨道分成三个独立的部分,而网格项目被限制在一个部分中。

因此,网格项不能使用关键字对齐属性(例如justify-contentjustify-self)自动居中于一行,因为轨道墙会限制移动。

可以使网格区域跨越整个行/列,然后清除整个轨道,允许网格项目水平居中(justify-content: center)或垂直居中(align-self: center),但是this behavior must be explicitly defined.

为了使网格项在动态布局中居中,容器需要只有一列(即没有分隔符),或者需要使用@987654323 之类的方式将该项显式移动到中心@。否则,使用 flexbox。

【讨论】:

  • “轨道墙”是指网格轨道还是它们的排水沟?我不记得规范曾经使用过这个术语。
  • @TylerH,我在回答中尽可能多地使用简单的英语。 “轨道墙”就是我的看法。关键是在 flexbox 中唯一阻碍对齐的是兄弟项目。但在网格中,还有一个额外的障碍:难以穿透的轨道纵横交错。
  • 这就是我在过去 15 个月左右没有阅读规范的结果:-)
  • 因此,当我们想要使项目居中但每一行的高度相同时,我们仍然注定要失败,这是网格内最高项目的高度 - 因为 flex 可以很好地居中,但它确实做到了行高,网格可以做行高但不能做居中
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
相关资源
最近更新 更多