【问题标题】:Fixed header in CSS Grid修复了 CSS Grid 中的标题
【发布时间】:2018-08-21 20:32:18
【问题描述】:

我刚刚开始摆弄 CSS Grid,我很好奇如何创建一个固定的标题。我应该创建一个两行网格,其中第一行是标题,第二行是内容的另一个网格吗?或者有没有更简单的方法来解决这个问题?

我为网格中的 div 添加了高度以启用滚动。

这是我为测试设置的 HTML/CSS:

html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed,
    figure, figcaption, footer, header, hgroup,
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video {
    	margin: 0;
    	padding: 0;
    	border: 0;
    	font-size: 100%;
    	font: inherit;
    	vertical-align: baseline;
    }
    /* HTML5 display-role reset for older browsers */
    article, aside, details, figcaption, figure,
    footer, header, hgroup, menu, nav, section {
    	display: block;
    }
    body {
    	line-height: 1;
    }
    ol, ul {
    	list-style: none;
    }
    blockquote, q {
    	quotes: none;
    }
    blockquote:before, blockquote:after,
    q:before, q:after {
    	content: '';
    	content: none;
    }
    table {
    	border-collapse: collapse;
    	border-spacing: 0;
    }
    
    /* DEFAULTS */

    body {
      color: white;
    }
    
    /* SETTING UP THE GRID LAYOUT */
    
    .wrapper {
      display: grid;
      grid-template-columns: repeat(12, [col-start] 1fr);
      grid-template-rows: 10vh 1fr;
    }
    
    .header {
      grid-column: col-start / span 12;
      background-color: black;
    }
    
    .jumbotron {
      grid-column: col-start / span 12;
      height: 30vh;
      background-color: yellow;
    }
    
    .content-one-left {
      grid-column: col-start / span 6;
      height: 30vh;
      background-color: red;
    }
    
    .content-one-right {
      grid-column: col-start 7 / span 6;
      height: 30vh;
      background-color: blue;
    }
    
    .content-two-left {
      grid-column: col-start / span 6;
      height: 30vh;
      background-color: blue;
    }
    
    .content-two-right {
      grid-column: col-start 7 / span 6;
      height: 30vh;
      background-color: red;
    }
    
    .footer {
      grid-column: col-start / span 12;
      height: 10vh;
      background-color: black;
    }
<div class="wrapper">

  <div class="header">
    <p> Header </p>
  </div>

  <div class="jumbotron">
    <p> Jumbotron </p>
  </div>

  <div class="content-one-left">
    <p> Content 1 Left </p>
  </div>

  <div class="content-one-right">
    <p> Content 1 Right </p>
  </div>

  <div class="content-two-left">
    <p> Content 2 Left </p>
  </div>

  <div class="content-two-right">
    <p> Content 2 Right </p>
  </div>

  <div class="footer">
    <p> Footer </p>
  </div>

</div>

【问题讨论】:

    标签: html css css-position css-grid


    【解决方案1】:

    一旦您将网格容器的子项设置为 position: fixed,它就会从文档流中移除并且不再参与网格布局 (see section 9.2 of the grid spec)。

    因此,如果您希望将元素固定到视口,则从网格容器中移除它是有意义的。如果是表头,只需将其放在网格容器上方即可。

    如果您仍然希望标题是一个网格,那不是问题。固定元素可以是网格容器。它们只是不适合作为网格项目。

    codepen demo

    html,
    body,
    div,
    span,
    applet,
    object,
    iframe,
    h1,
    h2,
    h3,
    h4,
    h5,
    h6,
    p,
    blockquote,
    pre,
    a,
    abbr,
    acronym,
    address,
    big,
    cite,
    code,
    del,
    dfn,
    em,
    img,
    ins,
    kbd,
    q,
    s,
    samp,
    small,
    strike,
    strong,
    sub,
    sup,
    tt,
    var,
    b,
    u,
    i,
    center,
    dl,
    dt,
    dd,
    ol,
    ul,
    li,
    fieldset,
    form,
    label,
    legend,
    table,
    caption,
    tbody,
    tfoot,
    thead,
    tr,
    th,
    td,
    article,
    aside,
    canvas,
    details,
    embed,
    figure,
    figcaption,
    footer,
    header,
    hgroup,
    menu,
    nav,
    output,
    ruby,
    section,
    summary,
    time,
    mark,
    audio,
    video {
      margin: 0;
      padding: 0;
      border: 0;
      font-size: 100%;
      font: inherit;
      vertical-align: baseline;
    }
    
    
    /* HTML5 display-role reset for older browsers */
    
    article,
    aside,
    details,
    figcaption,
    figure,
    footer,
    header,
    hgroup,
    menu,
    nav,
    section {
      display: block;
    }
    
    body {
      line-height: 1;
    }
    
    ol,
    ul {
      list-style: none;
    }
    
    blockquote,
    q {
      quotes: none;
    }
    
    blockquote:before,
    blockquote:after,
    q:before,
    q:after {
      content: '';
      content: none;
    }
    
    table {
      border-collapse: collapse;
      border-spacing: 0;
    }
    
    
    /* DEFAULTS */
    
    body {
      color: white;
    }
    
    
    /* SETTING UP THE GRID LAYOUT */
    
    .wrapper {
      display: grid;
      grid-template-columns: repeat(12, [col-start] 1fr);
      grid-template-rows: 1fr;
      height: 90vh;
      overflow: auto;
    }
    
    .header {
      height: 10vh;
      background-color: black;
    }
    
    .jumbotron {
      grid-column: col-start / span 12;
      height: 30vh;
      background-color: yellow;
    }
    
    .content-one-left {
      grid-column: col-start / span 6;
      height: 30vh;
      background-color: red;
    }
    
    .content-one-right {
      grid-column: col-start 7 / span 6;
      height: 30vh;
      background-color: blue;
    }
    
    .content-two-left {
      grid-column: col-start / span 6;
      height: 30vh;
      background-color: blue;
    }
    
    .content-two-right {
      grid-column: col-start 7 / span 6;
      height: 30vh;
      background-color: red;
    }
    
    .footer {
      grid-column: col-start / span 12;
      height: 10vh;
      background-color: black;
    }
    <div class="header">
      <p> Header </p>
    </div>
    
    <div class="wrapper">
    
    
    
      <div class="jumbotron">
        <p> Jumbotron </p>
      </div>
    
      <div class="content-one-left">
        <p> Content 1 Left </p>
      </div>
    
      <div class="content-one-right">
        <p> Content 1 Right </p>
      </div>
    
      <div class="content-two-left">
        <p> Content 2 Left </p>
      </div>
    
      <div class="content-two-right">
        <p> Content 2 Right </p>
      </div>
    
      <div class="footer">
        <p> Footer </p>
      </div>
    
    </div>

    【讨论】:

    • 我不确定是否有办法在我已经创建的网格中执行此操作,但这是有道理的。感谢您的详尽回复!
    • 那么这样我们就不得不使用媒体查询来调整标题了,对吧?
    【解决方案2】:
    .header{
        position: fixed;
        left:0;
        right:0;
        top:0;
    }
    

    使用位置固定的标题它肯定会工作。

    【讨论】:

    • 如果你需要元素来拉伸整个视口,这个 sn-p 可以工作。
    【解决方案3】:

    2018年可以使用position: sticky

    header {
      position: sticky;
      top: 0;
    }
    

    Here is a JSFiddle 演示它。

    Browser support - 它适用于 header 元素(在 Chrome 和 Edge 中测试)。

    【讨论】:

      【解决方案4】:

      使用.wrapper {margin-top; 80px; position:relative;}.header {position:fixed; height: 80px; z-index: 10;}.wrapper 中的网格定义将在固定标题下方流动。为了更好地衡量,请将.header 的规则集放在顶部,.wrapper 之前。

      /* Globals */
      
      body {
        color: white;
      }
      
      
      /* Grid Layout - Not necessarily display:inline-grid; */
      
      .header {
        top: 0px;
        height: 80px;
        background-color: black;
        position: fixed;
        left: 2vw;
        right: 2vw;
        z-index: 10;
        overflow: hidden;
        }
      
      .wrapper {
        position: relative;
        left: 10vw;
        width: 80vw;
        top: 20px;
        margin-top: 80px;
        display: -ms-inline-grid;
        display: -moz-inline-grid;
        display: inline-grid;
        grid-template-columns: repeat(12, [col-start] 1fr);
        grid-template-rows: 1fr; 
        overflow: auto;
      }
      
      .jumbotron {
        grid-column: col-start / span 12;
        height: 30vh;
        background-color: yellow;
      }
      
      .content-one-left {
        grid-column: col-start / span 6;
        height: 30vh;
        background-color: red;
      }
      
      .content-one-right {
        grid-column: col-start 7 / span 6;
        height: 30vh;
        background-color: blue;
      }
      
      .content-two-left {
        grid-column: col-start / span 6;
        height: 30vh;
        background-color: blue;
      }
      
      .content-two-right {
        grid-column: col-start 7 / span 6;
        height: 30vh;
        background-color: red;
      }
      
      .footer {
        grid-column: col-start / span 12;
        height: 10vh;
        background-color: black;
      }
      <div class="header">
        <p> Header </p>
      </div>
      
      <div class="wrapper">
      
      
      
        <div class="jumbotron">
          <p> Jumbotron </p>
        </div>
      
        <div class="content-one-left">
          <p> Content 1 Left </p>
        </div>
      
        <div class="content-one-right">
          <p> Content 1 Right </p>
        </div>
      
        <div class="content-two-left">
          <p> Content 2 Left </p>
        </div>
      
        <div class="content-two-right">
          <p> Content 2 Right </p>
        </div>
      
        <div class="footer">
          <p> Footer </p>
        </div>
      
      </div>

      【讨论】:

        【解决方案5】:
        .header-container {
            position: sticky;
            position: -webkit-sticky; /* For macOS/iOS Safari */
            top : 0;
        }
        

        【讨论】:

          【解决方案6】:

          诀窍是创建一个将溢出设置为自动的父内容容器 固定高度(触发溢出),然后将您的内容添加到其子项中。

          body {
            margin: 0;
          }
          
          .page {
            display: grid;
            grid-template-rows: 55px calc(100vh - 55px); /* height limitation on second row */
            grid-template-areas: "header" 
                                 "content";
          }
          
          .header {
            grid-area: header;
            background-color: darkgray;
          }
          
          .content {
            grid-area: content;
            background-color: grey;
            overflow: auto;  /* overflow condition on parent */
          }
          
          article {
            height: 500px;  /* height set on child; triggers scroll */
          }
          <div class='page'>
              <div class='header'>Header</div>
              <div class='content'>
                  <article>
                      <h1>title</h1>
                  </article>
                  <article>
                      <h1>title</h1>
                  </article>
              </div>
          </div>

          参考:Original source

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-26
            • 2019-07-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-28
            • 1970-01-01
            相关资源
            最近更新 更多