当前位置: 首页 > 面试题库 >

具有CSS网格布局的网格项目中元素的高度相等

程谭三
2023-03-14
问题内容

我在长度为4+的div内有一系列文章,没有任何四舍五入的行标记。我需要将其表示为每行3个文章(列)的表格,大概用display: grid。每篇文章都有一个页眉,一个节和一个页脚。

如何 在每行文章的内部为每个页眉实现相等的高度,为每个部分提供相等的高度以及与文章底部对齐的相等高度的页脚?可能吗 我应该使用display: table吗?

PS我需要根据屏幕宽度动态更改每行的文章数。谢谢

HTML:

body {

  width: 100%;

  max-width: 1024px;

  margin: auto;

}



.container {

  display: grid;

  grid-template-columns: repeat(3, 1fr);

}



.container article {

  display: grid;

}



article header {

  background-color: #eeeeee;

}



article section {

  background-color: #cccccc;

}



article footer {

  background-color: #dddddd;

}


<div class="container">

  <article>

    <header>

      <h2>Header</h2>

      <h2>Header</h2>

    </header>

    <section>

      <p>Content</p>

    </section>

    <footer>

      <p>Footer</p>

    </footer>

  </article>

  <article>

    <header>

      <h2>Header</h2>

    </header>

    <section>

      <p>Content</p>

      <p>Content</p>

      <p>Content</p>

      <p>Content</p>

      <p>Content</p>

    </section>

    <footer>

      <p>Footer</p>

      <p>Footer</p>

    </footer>

  </article>

  <article>

    <header>

      <h2>Header</h2>

    </header>

    <section>

      <p>Content</p>

      <p>Content</p>

      <p>Content</p>

    </section>

    <footer>

      <p>Footer</p>

    </footer>

  </article>

  <article>

    <header>

      <h2>Header</h2>

    </header>

    <section>

      <p>Content</p>

      <p>Content</p>

      <p>Content</p>

      <p>Content</p>

    </section>

    <footer>

      <p>Footer</p>

      <p>Footer</p>

    </footer>

  </article>

</div>

注意:不推荐使用JS。

grid-auto-rows: 1fr;

已被提议为重复项,事实并非如此。它将仅使物品具有相等的高度,而例如,每个物品的标题仍保持不同的大小。


问题答案:

可能吗

tldr; Yes.

这里的困难在于,每篇文章本身都是一个网格,因此
任何一篇文章都不了解另一篇文章。因此,无法
像文章标题这样的文章中的组件根据
另一文章中标题的高度进行调整。


实际上,有一种方法可以通过CSS网格实现这一目标,并且无需更改任何标记!

我们可以使用CSS“拉平”结构,以便所有文章的所有组件都只是一个CSS网格(文章容器)的一部分。

通过设置文章,甚至无需更改当前标记,这是可能的display: contents

display: contents导致元素的子元素看起来像是元素父元素的直接子元素,而忽略了元素本身。当使用CSS网格或类似布局技术时应忽略包装元素时,这很有用。

所以如果我们用 display: contents

.container article {
  display: contents;
}

现在,所有的页眉,节和页脚都成为(直接)网格(容器的-具有display:grid)网格项目,我们可以使用该grid- template-areas属性来对其进行排列。

.container {
  display: grid;
  grid-column-gap: 1em; /* horizontal gap between articles */
  grid-template-columns: repeat(3, 1fr);

  grid-template-areas: "header1 header2 header3" 
                       "section1 section2 section3"
                       "footer1 footer2 footer3"
                       "header4 header5 header6" 
                       "section4 section5 section6"
                       "footer4 footer5 footer6"
}

由于每个页眉/节/页脚恰好占据一个单元格-这迫使它们占据相同的垂直高度。因此,例如header1,header2和header3
都将具有相同的高度,而不管其内容如何。

现在,grid-area在每个单元格上设置属性。

article:nth-child(1) header {
  grid-area: header1;
}
article:nth-child(2) header {
  grid-area: header2;
}
article:nth-child(3) header {
  grid-area: header3;
}
article:nth-child(4) header {
  grid-area: header4;
}
article:nth-child(1) section {
  grid-area: section1;
}
...
article:nth-child(4) section {
  grid-area: section4;
}
article:nth-child(1) footer {
  grid-area: footer1;
}
...
article:nth-child(4) footer {
  grid-area: footer4;
}

Finally, set a vertical gap between each row of articles (starting from the
second row of articles):

article:nth-child(n + 4) header {
  margin-top: 1em;
}

Demo:

body {

  width: 100%;

  max-width: 1024px;

  margin: auto;

}



.container {

  display: grid;

  grid-column-gap: 1em;

  grid-template-columns: repeat(3, 1fr);

  grid-template-areas: "header1 header2 header3"

                      "section1 section2 section3"

                        "footer1 footer2 footer3"

                        "header4 header5 header6"

                      "section4 section5 section6"

                        "footer4 footer5 footer6"

}



.container article {

  display: contents;

}



article header {

  background-color: #eeeeee;

}



article section {

  background-color: #cccccc;

}



article footer {

  background-color: #dddddd;

}



article:nth-child(n + 4) header {

  margin-top: 1em;

}



article:nth-child(1) header {

  grid-area: header1;

}

article:nth-child(2) header {

  grid-area: header2;

}

article:nth-child(3) header {

  grid-area: header3;

}

article:nth-child(4) header {

  grid-area: header4;

}

article:nth-child(1) section {

  grid-area: section1;

}

article:nth-child(2) section {

  grid-area: section2;

}

article:nth-child(3) section {

  grid-area: section3;

}

article:nth-child(4) section {

  grid-area: section4;

}

article:nth-child(1) footer {

  grid-area: footer1;

}

article:nth-child(2) footer {

  grid-area: footer2;

}

article:nth-child(3) footer {

  grid-area: footer3;

}

article:nth-child(4) footer {

  grid-area: footer4;

}


<div class="container">

    <article>

        <header>

            <h2>Header</h2>

            <h2>Header</h2>

        </header>

        <section>

            <p>Content</p>

        </section>

        <footer>

            <p>Footer</p>

        </footer>

    </article>

    <article>

        <header>

            <h2>Header</h2>

        </header>

        <section>

            <p>Content</p>

            <p>Content</p>

            <p>Content</p>

            <p>Content</p>

            <p>Content</p>

        </section>

        <footer>

            <p>Footer</p>

            <p>Footer</p>

        </footer>

    </article>

    <article>

        <header>

            <h2>Header</h2>

        </header>

        <section>

            <p>Content</p>

            <p>Content</p>

            <p>Content</p>

        </section>

        <footer>

            <p>Footer</p>

        </footer>

    </article>

    <article>

        <header>

            <h2>Header</h2>

        </header>

        <section>

            <p>Content</p>

            <p>Content</p>

            <p>Content</p>

            <p>Content</p>

        </section>

        <footer>

            <p>Footer</p>

            <p>Footer</p>

        </footer>

    </article>

</div>

Codepen Demo)

当然,除了使用grid-template-areas+ grid-area属性,我们还可以使用grid-row+ grid-column属性来实现相同的结果-Codepen

注意:我确实意识到上面的内容很冗长,也不是最佳的解决方案-但我的意思是可能的。另外,我们可以使用
SASS循环使该代码更简洁,更可配置。

如果有某种方法可以重复使用某个模式,则可能会很好,grid- template-areas例如:

伪代码(不合法):

grid-template-areas: repeat("header1 header2 header3" 
                           "section1 section2 section3"
                           "footer1 footer2 footer3")

…然后,我们可以 使用nth-child设置网格区域,从而获得一种更具动态性的解决方案,该解决方案适用于n商品
解决方案:

article:nth-child(3n + 1) header {
  grid-area: header1;
}

等等。。。但是我现在不认为这是可能的(或者也许没有必要,因为子电网

NB:

Grid Layout Module Level 2引入了Subgrids,这将使此问题更易于解决,而无需使用display: contents

Should I use display: table?

对于您需要的布局- display:table不会有太大帮助。首先,您必须完全重组标记,以将文章组件按文章分组在一起,然后必须四处寻找样式,使表格看起来像“文章”,但即使如此-表格也没有包装,所以您d需要将每三篇文章都包装到一个单独的表中。…即使可能,也确实是一团糟且难以维护。



 类似资料:
  • 问题内容: 我认为使用Flexbox无法实现这一点,因为每一行只能是适合其元素的最小高度,但是可以使用更新的CSS Grid来实现吗? 明确地说,我希望网格中所有行的所有元素的高度相等,而不仅仅是每行。基本上,最高的“单元格”应规定所有单元格的高度,而不仅仅是其行中的单元格。 问题答案: 简短答案 如果目标是创建具有相等高度的行的网格,而网格中最高的单元格将设置所有行的高度,那么这是一种快速简单的

  • 我认为使用Flexbox是不可能实现这一点的,因为每一行只能是适合其元素所需的最小高度,但使用较新的CSS网格可以实现这一点吗? 明确地说,我希望网格中的所有元素在所有行上的高度相等,而不仅仅是每一行。基本上,最高的“单元格”应该指示所有单元格的高度,而不仅仅是其行中的单元格。

  • 问题内容: 我想使我的网站使用CSS网格系统,但似乎无法正常工作。这是我的代码: 问题答案: 使用该属性时,字符串值必须具有相同的列数。 您可以使用句点或句点的不间断行来表示一个空单元格(规范参考)。 从网格规范: [7.3。 命名区域:属性] 所有字符串的列数必须相同,否则声明无效。 如果命名的网格区域跨越多个网格单元,但是这些单元不形成单个填充矩形,则声明无效。 在此模块的将来版本中,可能会允

  • 我正在学习如何使用Java Swing中的GridBagLayout。。。 在这个例子中,我想在每一行中放置4个元素,正如您在我的代码中看到的那样: 正如您在代码中看到的那样。 在第0行中,我想放置一个JLabel 在第1行中,我想放一个带有图标的JLabel 在第2行中,我想放置一个JTextField 在第3行中,我想在右侧放置一个JTextfield和JTextfield 最后在第4行,我想

  • 我想创建一个网格布局与响应方块。 我觉得我应该可以这样做与CSS网格布局,但有麻烦设置高度每个正方形等于宽度。 在每一个方块之间设置一条阴沟也有困难。 我用Flexbox会更好吗? 目前我的HTML看起来像这样,但将是动态的,所以更多的方块可能会被添加。当然,它需要具有响应性,因此理想情况下使用媒体查询将其折叠为一列。 使用css网格,这是我所得到的 我能够用flexbox做得更远一些,并且能够使

  • 每一个网格项目都有一个矩形的网格区域,这个网格区域定义了该网格项的包含块,对齐属性(justify-self 和 align-self)确定其实际位置。 网格项占用的单元格也会影响网格的行和列的大小,参看网格尺寸(Grid Sizing)。 网格区域在网格内的位置通过1个网格位置和1个网格跨度属性来定义: grid position 表示网格项在网格中的位置。该属性可以是确定的(被显式定义)或自动