【问题标题】:How to make a column span full width when a second column is not there? (CSS Grid)当第二列不存在时,如何使列跨全宽? (CSS 网格)
【发布时间】:2017-09-04 05:52:28
【问题描述】:

我知道有类似的问题,但这是专门询问如何使用 CSS 网格布局来做到这一点。

所以我们有了这个基本的网格设置:

HTML(带侧边栏):

<div class="grid">

  <div class="content">
    <p>content</p>
  </div>

  <div class="sidebar">
    <p>sidebar</p>
  </div>

</div>

CSS:

.grid {
  display: grid;
  grid-template-columns: 1fr 200px;
}

要创建一个看起来像这样的布局:

| content               | sidebar |

如果页面没有侧边栏,即。 html 看起来像这样,但使用相同的 CSS:

HTML(无边栏):

<div class="grid">

  <div class="content">
    <p>content</p>
  </div>

</div>

页面布局如下(破折号表示空白)

| content               | ------- |

我知道为什么会这样,网格列仍然在grid-template-columns规则中定义。

我只是想知道如何告诉网格如果没有内容,则填充剩余空间,类似于flex-growflexbox 的工作方式。

如果没有侧边栏,所需的结果将如下所示。

| content                         |

【问题讨论】:

    标签: css css-grid


    【解决方案1】:

    不要用grid-template-columns明确定义列。

    改为隐式列,然后使用grid-auto-columns定义它们的宽度。

    当第二列 (.sidebar) 不存在时,这将允许第一列 (.content) 占用行中的所有空间。

    .grid {
      display: grid;
      grid-auto-columns: 1fr 200px;
    }
    
    .content {
      grid-column: 1;
    }
    
    .sidebar {
      grid-column: 2;
    }
    
    .grid > * {
      border: 1px dashed red; /* demo only */
    }
    <p>With side bar:</p>
    
    <div class="grid">
    
      <div class="content">
        <p>content</p>
      </div>
      
      <div class="sidebar">
        <p>sidebar</p>
      </div>
    
    </div>
    
    <p>No side bar:</p>
    
    <div class="grid">
    
      <div class="content">
        <p>content</p>
      </div>
      
    </div>

    【讨论】:

    • 这是一个很好的答案,但不幸的是,如果侧边栏
      位于内容
      之前(以及更新网格列以匹配新布局),则它不起作用。我不知道为什么会这样。
    • 因为grid-auto-columns repeats a pattern。使用1fr 200px 作为值,它将重复该模式以根据需要创建尽可能多的隐式列。如果只有一列,1fr 会占用该行的所有空间。
    • 但是,如果将值反转为 200px 1fr,则第一个隐式行是 200px 宽。这就是为什么您的布局反转无法按预期工作的原因。 jsfiddle.net/ctgzgpu8@SeanBeck
    • @Michael_B 您的小提琴示例(在上面的评论中)没有按预期工作。
    • FFx 60 (osx), Chrome 66 (osx) --- 无论有没有侧边栏,内容栏的宽度都是一样的。
    【解决方案2】:

    您可以通过使用内容大小关键字来拉近,例如:

    .grid {
      display: grid;
      grid-template-columns: 1fr fit-content(200px);
    }
    
    .sidebar {
      width: 100%;
    }
    

    fit-content 关键字将查看内容的大小并像max-content 一样工作,直到它达到您传入的值。

    实际上,您可能不需要在侧边栏上粘贴大小,因为内容可能会规定至少 200 像素的大小(例如),但您可以尝试一下。

    【讨论】:

    • 我在想设置 width: 100%;在侧边栏上可能会允许侧边栏的宽度基于网格布局值,而不是两次声明 200px。
    • 如果你愿意,就不要在上面设置任何东西。
    • 如果侧边栏中没有 200px 的内容,这是否意味着侧边栏最终可能会小于 200px 宽?
    【解决方案3】:

    我想我现在知道这个问题的确切答案了。到目前为止,答案的问题在于他们没有解释如何处理主要内容左侧的侧边栏(主要是因为我没有在原始问题中要求它)。

    <div class="grid">
    
      <nav>
        <p>navigation</p>
      </nav>
    
      <main>
        <p>content</p>
      </main>
    
      <aside>
        <p>sidebar</p>
      </aside>
    
    </div>
    

    你可以使用这个 CSS:

    .grid {
      display: grid;
      grid-template-columns: fit-content(200px) 1fr fit-content(200px);
    }
    
    nav, aside {
      width: 100%;
    }
    
    /* ensures that the content will always be placed in the correct column */
    nav { grid-column: 1; }
    main { grid-column: 2; }
    aside { grid-column: 3; }
    

    这也是网格区域的一个很好的用例

    .grid {
      display: grid;
      grid-template-columns: fit-content(200px) 1fr fit-content(200px);
      grid-template-areas: "nav content sidebar";
    }
    
    nav, aside {
      width: 100%;
    }
    
    /* ensures that the content will always be placed in the correct column */
    nav { grid-area: nav; }
    main { grid-area: content; }
    aside { grid-area: sidebar; }
    

    兼容 IE 的版本如下所示:

    .grid {
      display: -ms-grid;
      display: grid;
      -ms-grid-columns: auto 1fr auto;
      grid-template-columns: auto 1fr auto;
    }
    
    nav, aside {
      width: 100%; /* Ensures that if the content exists, it takes up max-width */
      max-width: 200px; /* Prevents the content exceeding 200px in width */
    }
    
    /* ensures that the content will always be placed in the correct column */
    nav {
      -ms-grid-column: 1;
      grid-column: 1;
    }
    
    main {
      -ms-grid-column: 2;
      grid-column: 2;
    }
    
    aside {
      -ms-grid-column: 3;
      grid-column: 3;
    }
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签