【问题标题】:Grid row won't span when set to auto设置为自动时,网格行不会跨越
【发布时间】:2020-10-21 08:29:14
【问题描述】:

我有一个两行的网格布局:

  1. 标题和
  2. 内容部分有时有两列,有时只有一列。

基本上是带有内容布局的典型标题,除了我有时想动态关闭右栏。

  • 标题的高度必须由其内容决定。好的:grid-template-rows: min-content auto;
  • 标题必须跨越一列或两列。但这失败了。我尝试了以下方法:

这仅在只有一列时才有效。如果有两列,则此行不会跨越它们。

.header {
  grid-row-start: 1;
  grid-column-start: 1;
  grid-column-end: auto;
}

.header {
  grid-row-start: 1;
  grid-column: 1 / span auto;
}

这仅在有两列时有效。 它会在屏幕上为第二列创建一个位置,即使没有。

.header {
  grid-row-start: 1;
  grid-column: 1 / span 2;
}
  • 最后,我对这两列的宽度不同这一事实感到有些困惑。可能与auto-fill 有关,但我无法真正理解这一点,是否有解决方案?

这是代码:

.header {
  grid-row-start: 1;
  grid-column-start: 1;
  grid-column-end: auto;
}

.left {
  grid-row-start: 2;
  grid-column-start: 1;
  grid-column-end: 1;
}

.right {
  grid-row-start: 2;
  grid-column-start: 2;
  grid-column-end: 2;
}

.wrapper {
    height: 100%;
    width: 100%;

    display: grid;
    grid-gap: 10px;
    grid-column: 1 / -1;
    grid-template-rows: min-content auto;
}
<div style="height: 300px;">
    <div class="wrapper">
        <div class="header" style="background-color:#006;">
            HEADER
        </div>
        <div class="left" style="background-color:#600;">
            LEFT
            Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim.
        </div>
        <div
            class="right"
            v-if="true"
            style="background-color:#060;">
            RIGHT
        </div>
    </div>
</div>

结果如下:

【问题讨论】:

  • 两件事:grid-template-columns: repeat(auto-fill, 1fr); 无效。您不能自动填充小数尺寸。如果已解决,只需在标题上添加grid-column: 1 / -1 即可使其填满行。
  • 谢谢你,但是,结果是一样的,因为列宽似乎与内容有关。尤其是网格,应该是布局优先的,对吧?
  • 列的大小不同,因为您的 grid-template-columns 指令由于无效而被完全忽略。将其设为(例如)grid-template-columns: 1fr 1fr,您将拥有两个相等的列。我知道这不是您想要有条件地添加列的内容,但为此您需要另一种解决方案。绝对不是repeat(auto-fill, 1fr)

标签: css css-grid


【解决方案1】:

正如我在 cmets 中所写,问题是 repeat(auto-fill, 1fr)This is invalid。一个简单的解决方法是分别设置两列 1fr 并有条件地让主列(例如,如果它是最后一个子列)跨越两者。

例如(使用grid-template):

.wrapper {
    height: 100%;
    width: 100%;
    color: white;

    display: grid;
    grid-template:
        "header header" min-content
        "main   aside" auto / 1fr 1fr;
    grid-gap: 10px;
}

.header {
    grid-area: header;
    background-color: #006;
}

.left {
    grid-area: main;
    background-color: #600;
}

.left:last-child {
    grid-column: 1 / -1;
}

.right {
    grid-area: aside;
    background-color:#060;
}
<h4>With two columns</h4>

<div style="height: 300px;">
    <div class="wrapper">
        <div class="header">HEADER</div>
        <div class="left">LEFT</div>
        <div class="right">RIGHT</div>
    </div>
</div>

<h4>Only one column</h4>

<div style="height: 300px;">
    <div class="wrapper">
        <div class="header">HEADER</div>
        <div class="left">LEFT</div>
    </div>
</div>

或者如果你不想使用grid-template,这也可以:

.wrapper {
    height: 100%;
    width: 100%;
    color: white;

    display: grid;
    grid-auto-columns: 1fr;
    grid-template-rows: min-content auto;
    grid-gap: 10px;
}

.header {
    grid-column: 1 / 3;
    background-color: #006;
}

.left {
    grid-column: 1 / 2;
    background-color: #600;
}

.left:last-child {
    grid-column: 1 / 3;
}

.right {
    grid-column: 2 / 3;
    background-color:#060;
}
<h4>With two columns</h4>

<div style="height: 300px;">
    <div class="wrapper">
        <div class="header">HEADER</div>
        <div class="left">LEFT</div>
        <div class="right">RIGHT</div>
    </div>
</div>

<h4>Only one column</h4>

<div style="height: 300px;">
    <div class="wrapper">
        <div class="header">HEADER</div>
        <div class="left">LEFT</div>
    </div>
</div>

【讨论】:

  • 工作出色,非常优雅。这里的要点:使用 grid-auto-columns,如果我没记错的话,grid-column-end 是“不包含”的,即。 3 表示最多 2,不包括 3。非常感谢。
  • @svenema 在这里要小心。 inclusive 在这里不是正确的想法。这些值是指网格轨迹。这些默认编号,但可以命名。例如。 grid-template-columns: [start] 1fr 1fr 1fr [some-track] 200px [end]grid-column: start / some-track.
  • 就我们的理解而言,3 指的是(在本例中为垂直)轨道 3,对吗?我们在这里没有使用任何命名的轨道,在这种情况下 grid-column: 1 / 3;应该读作第 1 到第 2 列,而不是第 3 列。正确吗?
  • @svenema 对不起,我实际上使用了错误的名称。它应该是 line 而不是 track。这是您的曲目(无论是列还是行)聚集在一起的事物。当您使用grid-column/row 时,这些值指的是那些网格线。如需更好的解释,请查看:css-tricks.com/snippets/css/complete-guide-grid
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2018-04-29
  • 2018-10-17
  • 1970-01-01
  • 2014-08-17
  • 2019-06-18
  • 2018-08-08
相关资源
最近更新 更多