【问题标题】:Remove "Align-items" space in CSS Grid [duplicate]删除 CSS 网格中的“对齐项”空间 [重复]
【发布时间】:2018-01-23 18:11:53
【问题描述】:

我正在尝试使用 CSS Grid 作为 2d 替代方案来填充我正在创建的小型测试博客的空间。我遇到了一个关于定位的小问题。

首先,由于它是一个博客,我不太确定内容将在文章中保留多长时间。因此我不能使用设置定位来修改布局。

我目前的看法是:

但是,我希望视图看起来像:

目前,我的代码结构如下:

CSS

.articles {
    margin: 20px;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    grid-gap: 1em;
}
article {
    align-self: start;
}

HTML

<div class="articles">
    <article>lorem ipsum...</article>
    <article>lorem ipsum...</article>
    <article>lorem ipsum...</article>
</div>

由于较大的(第二)段落,似乎 align-self 正在通过删除空内容来正常工作。然而,第三段保持在其当前的静态位置,而不是移动到现在空白的位置,align-self: stretch 本来应该是。

我不太确定我可以尝试解决这个问题。

【问题讨论】:

  • @MiltoxBeyond 我明白了,也许这不适用于 CSS Grid。
  • CSS Grid 可以比 Flexbox 做得更好,所以请耐心等待,知道如何发布答案的人......如果您选择沿着这条路走,Flexbox 将需要在父级上固定高度,大多数人不希望它是动态的
  • 也只是提一下。 @TylerH,您将代码更改为 sn-p 的最后一次编辑对该问题无效。显示一个 sn-p 不会让我的问题暴露出来,并且会错误地理解我的问题是什么。请停止编辑我的帖子以帮助您取得成就,尤其是在没有完全理解问题的情况下。
  • @TylerH 是的,这是一个糟糕的 sn-p,甚至没有显示问题。
  • 对于网格元素通过列或行“拉伸”,您需要通过 CSS 告诉它们跨越这么多行或列。它不是靠自己完成的。您可能希望将 masonry javascript 库用于这种行为 :( 不是 flex 或 grid 自己这样做的

标签: html css css-grid


【解决方案1】:

CSS Grid 或 Flexbox 可能不是这样的合适选择,但 CSS 列可能是:

body {
  background: #EEE;
}

.articles {
  -webkit-column-width: 300px;
  -moz-column-width: 300px;
  column-width: 300px;
  -webkit-column-gap: 30px;
  -moz-column-gap: 30px;
  column-gap: 30px;
  width: 90%;
  max-width: 1100px;
  margin: 30px auto;
}

article {
  margin: 15px 0;
  padding: 15px;
  background: #FFF;
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.25);
  display: inline-block;
  -webkit-column-break-inside: avoid;
  -moz-column-break-inside: avoid;
  column-break-inside: avoid;
}
<div class="articles">
  <article>
    <h2>Article Title</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus odio in enim feugiat sagittis. Mauris ac nulla ac nulla volutpat scelerisque vel eu nisi. Curabitur vehicula vestibulum ligula eu condimentum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus odio in enim feugiat sagittis. Mauris ac nulla ac nulla volutpat scelerisque vel eu nisi. Curabitur vehicula vestibulum ligula eu condimentum.</p>
  </article>
  <article>
    <h2>Article Title</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus odio in enim feugiat sagittis.</p>
  </article>
  <article>
    <h2>Article Title</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus odio in enim feugiat sagittis. Mauris ac nulla ac nulla volutpat scelerisque vel eu nisi. Curabitur vehicula vestibulum ligula eu condimentum.</p>
  </article>
  <article>
    <h2>Article Title</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus odio in enim feugiat sagittis. Mauris ac nulla ac nulla volutpat scelerisque vel eu nisi. Curabitur vehicula vestibulum ligula eu condimentum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi finibus odio in enim feugiat sagittis. Mauris ac nulla ac nulla volutpat scelerisque vel eu nisi. Curabitur vehicula vestibulum ligula eu condimentum.</p>
  </article>
</div>

【讨论】:

【解决方案2】:

这在 CSS Grid 中是不可能的。在 CSS Grid 中,子元素被排列成列和行。您正在寻找的是让它们像列一样排列。可能有一种方法可以单独使用 flexbox 来实现它(如果我弄明白了,我会在此处添加它),但你真正想要的是一个有 2 列的网格,其中每列都是一个 flexbox。

这是不可能的原因是因为行高。 CSS Grid 中没有only 列的概念。当一个元素添加到没有定义行的网格时,网格将自动添加一个auto-row,其高度可以由grid-auto-rows 属性控制(对于列也是如此)。因此,在您添加第一篇文章后,您可以将其视为添加一个刚性行。

Grid 的重点在于它是一个二维布局工具,其中 Flexbox 和普通文档流主要集中在 1 维上(除了少数例外,如浮动)。您可以看到文章的高度将决定它们所在行的高度。

获得这种效果的唯一方法是为有多种尺寸以跨越多行的文章预先定义高度。

正如其他答案所说,这里最好的方法可能是 Flexbox。我不推荐 Columns,因为它有点问题和 not exactly well supported(尽管如果你使用 CSS Grid 可能对你没关系)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2018-05-23
    • 2020-03-19
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多