为什么网格间隙会导致溢出?

Dam*_*ati 13 css css3 css-grid

为什么我在以下代码段中的X轴上有溢出?

一旦我grid-gap: 10px.body网格容器上应用溢出就会生成.

div:not(.header):not(.body):not(.row) {
  border: 1px solid grey;
}

.header {
  margin-top: 20px;
  display: grid;
  grid-gap: 10px;
  grid-template-areas: "header-left header-right-up" "header-left header-right-down";
  grid-template-rows: 40px 40px;
  grid-template-columns: minmax(50px, 200px) auto;
}

.header-left {
  grid-area: header-left;
}

.header-right-up {
  grid-area: header-right-up;
}

.header-right-down {
  grid-area: header-right-down;
}

.body {
  margin-top: 20px;
  display: grid;
  grid-template-columns: 25% 50% 25%;
  grid-auto-rows: 80px; 
  grid-gap: 10px;
}

.row-left {
}

.row-center {
}

.row-right {
}
Run Code Online (Sandbox Code Playgroud)
<div class="header">
  <div class="header-left">image</div>
  <div class="header-right-up">content</div>
  <div class="header-right-down">long content</div>
</div>

<div class="body">
    <div class="row-left"></div>
    <div class="row-center"></div>
    <div class="row-right"></div>

    <div class="row-left"></div>
    <div class="row-center"></div>
    <div class="row-right"></div>

    <div class="row-left"></div>
    <div class="row-center"></div>
    <div class="row-right"></div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

https://codepen.io/anon/pen/WdJExz?editors=1100

Mic*_*l_B 32

你有一个3列网格容器(.body):

grid-template-columns: 25% 50% 25%
Run Code Online (Sandbox Code Playgroud)

这些列的总宽度为100%.

然后,您将在列(和行)之间添加装订线:

grid-gap: 10px
Run Code Online (Sandbox Code Playgroud)

这是简写​​:

grid-column-gap: 10px;
grid-row-gap: 10px;
Run Code Online (Sandbox Code Playgroud)

因此,当您将所有宽度相加时:

25% + 50% + 25% + 10px + 10px
Run Code Online (Sandbox Code Playgroud)

更简单地说:

100% + 20px > 100%, which results in an overflow condition
Run Code Online (Sandbox Code Playgroud)

(注意:grid-*-gap属性仅适用于网格项之间 - 从不在项目和容器之间.这就是我们计算两个网格间隙而不是四个网格间隙的原因.)

作为解决方案,请尝试使用fr仅适用于可用空间的单位,而不是百分比单位.这意味着在应用任何长度fr计算长度.grid-gap

grid-template-columns: 1fr 2fr 1fr
Run Code Online (Sandbox Code Playgroud)

div:not(.header):not(.body):not(.row) {
  border: 1px solid grey;
}

.header {
  margin-top: 20px;
  display: grid;
  grid-gap: 10px;
  grid-template-areas: "header-left header-right-up" "header-left header-right-down";
  grid-template-rows: 40px 40px;
  grid-template-columns: minmax(50px, 200px) auto;
}

.header-left {
  grid-area: header-left;
}

.header-right-up {
  grid-area: header-right-up;
}

.header-right-down {
  grid-area: header-right-down;
}

.body {
  margin-top: 20px;
  display: grid;
  grid-template-columns: 1fr 2fr 1fr; /* ADJUSTMENT */
  grid-auto-rows: 80px;
  grid-gap: 10px;
}

.row-left {}

.row-center {}

.row-right {}
Run Code Online (Sandbox Code Playgroud)
<div class="header">
  <div class="header-left">image</div>
  <div class="header-right-up">content</div>
  <div class="header-right-down">long content</div>
</div>

<div class="body">
  <div class="row-left"></div>
  <div class="row-center"></div>
  <div class="row-right"></div>

  <div class="row-left"></div>
  <div class="row-center"></div>
  <div class="row-right"></div>

  <div class="row-left"></div>
  <div class="row-center"></div>
  <div class="row-right"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

修改后的codepen演示

更多细节:CSS网格布局中百分比和fr单位之间的差异

  • 另一件需要提及的重要事情是,使用 fr 单位并不总是等于具有相同大小的单元格,例如 50% 50% 可能并不总是一半/一半。这取决于细胞内的内容。为了防止内容溢出或单元格扩展以适应内容,您必须使用 minmax(0, 1fr) 技巧。更多这里:https://css-irl.info/debugging-css-grid-part-2-what-the-fraction/ (2认同)
  • 仅供参考 - 他们刚刚添加了“gap”,并声明“grid-gap”是规范 WD 中“gap”的“简写”。 (2认同)

Val*_*nev 12

如果您想使用百分比或其他一些单位,还有另一种解决方案。该minmax()函数的使用将允许列缩小以适应父容器,而不会导致溢出

解决方案如下所示:

grid-template-columns: minmax(auto, 25%) minmax(auto, 50%) minmax(auto, 25%);
gap: 10px;
Run Code Online (Sandbox Code Playgroud)

更多关于这里minmax()功能。