【问题标题】:How to control the gaps between different size grid items?如何控制不同尺寸网格项之间的间隙?
【发布时间】:2019-11-13 07:32:06
【问题描述】:

在下面的布局中,我希望 A 和 B 并列,并且 D 强制的所有间隙都在 B 和 C 之间。 justify/align-content/self/items 似乎没有任何效果。网格间隙也没有。

虽然这些项目有固定的尺寸,但一般问题不是:这些项目可能有不同的宽度。当 D 比 A + B 窄时,它们是并列的,但是当 D 比 A + B 宽时,我不知道如何保持 A 和 B 并列。

.container {
  display: grid;
  grid-template-areas: "a b c" "d d e";
  width: min-content;
  background-color: lightyellow;
}

.a {
  grid-area: a;
  width: 120px;
}

.b {
  grid-area: b;
  width: 40px;
}

.c {
  grid-area: c;
  width: 80px;
}

.d {
  grid-area: d;
  width: 300px;
}

.e {
  grid-area: e;
  width: 100px;
}

.a,
.b,
.c,
.d,
.e {
  justify-self: start;
  border: solid 1px black;
  background-color: lightblue;
  height: 40px;
}
<h1>floating grid items</h1>
<div class=container>
  <div class=a>A</div>
  <div class=b>B</div>
  <div class=c>C</div>
  <div class=d>D</div>
  <div class=e>E</div>
</div>

【问题讨论】:

    标签: css css-grid


    【解决方案1】:

    考虑一个模板列,您将第一个设置为自动,第二个设置为1fr。也可以考虑inline-grid而不是设置宽度为min-content

    .container {
      display: inline-grid;
      grid-template-areas: 
        "a b c" 
        "d d e";
      grid-template-columns:auto 1fr auto;
      background-color: lightyellow;
      border:1px solid red;
    }
    
    .a {
      grid-area: a;
      width: 120px;
    }
    
    .b {
      grid-area: b;
      width: 40px;
    }
    
    .c {
      grid-area: c;
      width: 80px;
    }
    
    .d {
      grid-area: d;
      width: 300px;
    }
    
    .e {
      grid-area: e;
      width: 100px;
    }
    
    .a,
    .b,
    .c,
    .d,
    .e {
      justify-self: start;
      border: solid 1px black;
      background-color: lightblue;
      height: 40px;
    }
    <h1>floating grid items</h1>
    <div class=container>
      <div class=a>A</div>
      <div class=b>B</div>
      <div class=c>C</div>
      <div class=d>D</div>
      <div class=e>E</div>
    </div>

    或者你可以在宽度上考虑max-content并保留display:grid

    .container {
      display: grid;
      grid-template-areas: 
        "a b c" 
        "d d e";
      grid-template-columns:auto 1fr auto;
      background-color: lightyellow;
      border:1px solid red;
      width:max-content;
    }
    
    .a {
      grid-area: a;
      width: 120px;
    }
    
    .b {
      grid-area: b;
      width: 40px;
    }
    
    .c {
      grid-area: c;
      width: 80px;
    }
    
    .d {
      grid-area: d;
      width: 300px;
    }
    
    .e {
      grid-area: e;
      width: 100px;
    }
    
    .a,
    .b,
    .c,
    .d,
    .e {
      justify-self: start;
      border: solid 1px black;
      background-color: lightblue;
      height: 40px;
    }
    <h1>floating grid items</h1>
    <div class=container>
      <div class=a>A</div>
      <div class=b>B</div>
      <div class=c>C</div>
      <div class=d>D</div>
      <div class=e>E</div>
    </div>

    【讨论】:

    • 现在真的很有趣!但是,如果我将其保留为 display:grid;和宽度:最小内容;我以E重叠D结束!这真是一个惊喜!唔。您的解决方案在 E 之后有空格。我看到 grid-template-columns:auto 1fr auto;消除了这一点。看起来 1fr 只有在这种情况只发生一次时才有帮助。并且不知道为什么使用 inline-grid 是让它工作的必要条件,但它似乎是。
    • @Victoria min-content 的计算有点复杂.. 使用 inline-grid 会自动缩小以适应内容。你是对的,你可以用 auto 替换最后的 1fr 来消除差距。并没有真正注意最后的差距
    • @Victoria 检查更新,我还添加了另一个示例,其中 max-content 是您所需要的 display:grid
    • 但我只想要其中一个在一条线上,并且 inline-grid 允许多个(如果它们适合)。我想我可以将它们包装在一个
      中,但这感觉很糟糕。我想知道为什么 min-content 似乎与 1fr 产生不利的相互作用。
    • @Victoria 您错误地认为 min-content 是您所需要的。您正在寻找最大内容。解释起来有点棘手,稍后会尝试添加更多细节
    【解决方案2】:

    如果你想要水平,你可以使用grid-column-gap,如果你想要垂直间隙,你可以使用grid-row-gap

    把它放在有display: grid的元素上。

    另外我不建议使用网格。它没有得到很好的支持。您可以查看here。我建议切换到 flex。

    希望它有所帮助:)

    更新 你这样做了

    grid-template-areas: "a b c" "d d e"; 然后你输入grid-area: a; grid-area: b; grid-area: c; grid-area: d; grid-area: e; 这意味着第五个是空的。

    Next.. 显示网格将按此顺序排列项目 | | | | | |

    如果你有这样的物品

    |a|a|
    |as|a|
    

    grid 会这样显示它们

    |a |a|
    |as|a|
    

    因为它遵循项目之间的那条线。如果你想让它看起来不一样,你应该使用 flex

    查一下here

    【讨论】:

    • 视情况而定。你想支持IE吗?如果你这样做了,那就去flex吧。至少我发现制作一个支持 IE 的 flex 网站更容易如果答案对你有帮助,你能接受它,这样它也可以帮助其他人
    • 网格列间隙:0;如问题中所述,对此没有影响。或者如果可以的话,告诉我怎么做。
    • 是的。它有..但比网格少得多。我们可以避免所有这些错误。我实际上用 flex 做了一个很大的网站,它必须支持 IE。效果很好。
    • 对不起,你必须支持 IE。 Grid 在我关心的浏览器上得到了很好的支持。我的实际网格中有更多的行和列,而 flex 无法完成这项工作。这只是对该问题的简化演示。当您编辑文本时,最好向我展示一个有效的 sn-p,如果 grid-column-gap 可以工作的话。我无法做到。
    • 它不适用于您的情况。你不能那样破坏grid 布局。间隙属性只会使元素之间的间隙更大或更小。默认为 0。另外.. D 更宽,因为您有此布局grid-template-areas: "a b c" "d d e";,并且您将字母 D 分配给 grid-template-areas 中的两个 d。它占据了两者,这就是它更宽的原因。您可以通过给它写另一封信来更改它。像这样grid-template-areas: "a b c" "d e f";
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签