【问题标题】:How to create a CSS Grid Layout box that spans 2 columns and 2 rows?如何创建跨越 2 列和 2 行的 CSS 网格布局框?
【发布时间】:2017-11-08 03:49:05
【问题描述】:

我已经按照最新的 CSS Grid 规范创建了一个网格布局,但还不是完全熟悉它。我正在尝试创建以下布局,而不必为每个网格子项定义网格区域。

codepen

body {
  max-width: 1024px;
  margin: 10px auto;
}

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-template-areas: "a a b" "a a c" "d e f";
}

.grid__thing {
  background-color: rebeccapurple;
}

.a {
  grid-area: a;
}

.b {
  grid-area: b;
}

.c {
  grid-area: c;
}

.d {
  grid-area: d;
}

.e {
  grid-area: e;
}

.f {
  grid-area: f;
}

img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
<div class="grid">
  <div class="grid__thing a">
    <img src="https://placehold.it/1360x880" alt="" />
  </div>
  <div class="grid__thing b">
    <img src="https://placehold.it/660x405" alt="" />
  </div>
  <div class="grid__thing c">
    <img src="https://placehold.it/660x405" alt="" />
  </div>
  <div class="grid__thing d">
    <img src="https://placehold.it/660x405" alt="" />
  </div>
  <div class="grid__thing e">
    <img src="https://placehold.it/1327x817" alt="" />
  </div>
  <div class="grid__thing f">
    <img src="https://placehold.it/1327x817" alt="" />
  </div>
</div>

理想情况下,我希望能够在网格父项中设置所有网格大小调整属性,然后只在网格项 A 中定义属性以跨越 2 列和行。

当前指定每个网格区域并附加一个独特的类,如下所示:

.grid {
    display: grid;
    grid-gap: 10px;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows:  1fr 1fr 1fr;
    grid-template-areas: "a a b"
                         "a a c"
                         "d e f";
.a {
    grid-area: a;
}
.b {
    grid-area: b;
}
.c {
    grid-area: c;
}
.d {
    grid-area: d;
}
.e {
    grid-area: e;
}
.f {
    grid-area: f;
}

想做这样的事情,这样我就不必为每个网格项目创建一个唯一的 CSS 类:

.grid {
    display: grid;
    grid-gap: 10px;
    grid-template-columns: 1fr 1fr 1fr;
    grid-template-rows:  1fr 1fr 1fr;
    grid-template-areas: "a a b"
                         "a a c"
                         "d e f";
}
.a {
    // The only unique selector, so this is the only thing that
    // should be given unique styling
}

【问题讨论】:

    标签: html css grid-layout css-grid


    【解决方案1】:

    如果您不想为每个网格项定义网格区域,则不要使用 grid-template-areas 属性,因为它要求您为每个网格项定义名称。

    相反,只需在容器上使用 grid-template-columnsgrid-template-rows

    然后使用 grid-columngrid-row 将 2x2 大小应用于第一个网格项。

    grid-container {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      grid-template-rows: repeat(3, 100px);
      grid-gap: 10px;
    }
    
    grid_item:first-child {
      grid-column: 1 / 3; /* span from grid column line 1 to 3 (i.e., span 2 columns) */
      grid-row: 1 / 3;    /* same concept, but for rows */
    }
    
    /* non-essential decorative styles */
    grid_item {
      background-color: aqua;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 1.5em;
    }
    <grid-container>
      <grid_item>A</grid_item>
      <grid_item>B</grid_item>
      <grid_item>C</grid_item>
      <grid_item>D</grid_item>
      <grid_item>E</grid_item>
      <grid_item>F</grid_item>
    </grid-container>

    codepen demo

    【讨论】:

    • 很好的答案,但我理解的问题略有不同。但是,可能我错了。
    【解决方案2】:

    这似乎是一个愚蠢的答案......

    按照你的计划去做。删除无用的类。

    还是我错过了什么?

    body {
      max-width: 1024px;
      margin: 10px auto;
    }
    
    .grid {
      display: grid;
      grid-gap: 10px;
      grid-template-columns: 1fr 1fr 1fr;
      grid-template-rows: 1fr 1fr 1fr;
      grid-template-areas: "a a" "a a";
    }
    
    .grid__thing {
      background-color: rebeccapurple;
    }
    
    .a {
      grid-area: a;
    }
    
    img {
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
    <div class="grid">
      <div class="grid__thing a">
        <img src="https://placehold.it/1360x880" alt="" />
      </div>
      <div class="grid__thing">
        <img src="https://placehold.it/660x405" alt="" />
      </div>
      <div class="grid__thing">
        <img src="https://placehold.it/660x405" alt="" />
      </div>
      <div class="grid__thing">
        <img src="https://placehold.it/660x405" alt="" />
      </div>
      <div class="grid__thing">
        <img src="https://placehold.it/1327x817" alt="" />
      </div>
      <div class="grid__thing">
        <img src="https://placehold.it/1327x817" alt="" />
      </div>
    </div>

    【讨论】:

    • 尴尬!是的,就是这样。
    • 好吧,很高兴它对你有帮助:-)
    • 那么您只使用grid-template-areas 来调整和定位元素.a。其他元素基于auto-placement algorithm 对齐,而不是grid-template-areas。如果您决定重新组织布局,使用grid-template-areas,所有元素都将被忽略,.a 除外。
    • 如果你不想重新组织你的布局,上面的答案是有效的,但它似乎有点低效,因为字母 b-f 是无用的、无意义的和任意的。您可以将这些字母替换为任何内容,布局不会发生任何变化。
    • @Michael_B 是的,你是对的。我已经修好了。事实是,我并不真的相信这是 OP 所要求的......并且只是发布以确保
    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2017-07-03
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多