【问题标题】:Responsive CSS Grid layout with position: fixed具有位置的响应式 CSS 网格布局:固定
【发布时间】:2018-08-09 19:50:50
【问题描述】:

我正在使用 CSS 网格布局(仍在学习)构建一个响应式模板,感谢你们中的一些人,我已经完成了大部分工作。

  • 移动(最大宽度:767px)

    • 所有内容都应出现在自己的行中
  • 平板电脑(最小宽度:768px)

    • 导航在第一行
    • 第二个和主要的
  • 桌面(最小宽度:992px)

    • 与平板电脑相同,但水平间距为 10%
  • xl 桌面(最小宽度:1920px)

    • 与桌面相同,但最大宽度为 1920 像素

问题是我正在使用header 标签为nav 左右的间距着色。无论我使用标题还是 div,只为空白空间着色似乎都不合适。 有没有办法让我在整个顶部应用position: fixed

* {
  margin: 0;
  padding: 0;
}

body {
  display: grid;
  font-family: sans-serif;
}

a {
  text-decoration: none;
  color: white;
}

header,
nav {
  background: blue;
  color: #fff;
}

nav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
}

nav span {
  margin-right: auto;
}

header {
  display: none;
}

aside {
  background: lightgreen;
}

main {
  background: pink;
}


/* mobile  */

@media (max-width: 767px) {
  body {
    grid-template-columns: 1fr;
    grid-template-rows: 1fr 1fr 1fr;
  }
  nav,
  aside,
  main {
    grid-column: 1 / 1;
    padding: 0 15px;
  }
}


/* tablets */

@media (min-width: 768px) {
  body {
    grid-template-columns: 275px 1fr;
    grid-template-rows: 1fr 1fr;
  }
  nav {
    grid-column: 1 / 4;
    grid-row: 1;
    height: 50px;
    grid-row: 1;
  }
  aside {
    grid-column: 1;
  }
  main {
    grid-column: 2;
  }
  nav,
  aside,
  main {
    padding: 0 15px;
  }
}


/* desktops */

@media (min-width: 992px) {
  body {
    grid-template-columns: 10% 275px 1fr 10%;
    grid-template-rows: 1fr 1fr;
  }
  header {
    display: block;
    grid-column: 1 / -1;
    grid-row: 1;
  }
  nav {
    grid-column: 2 / 4;
    grid-row: 1;
  }
  aside {
    grid-column: 2 / 3;
  }
  main {
    grid-column: 3 / 4;
  }
}


/* xl desktops */

@media (min-width: 1920px) {
  body {
    grid-template-columns: 1fr minmax(auto, 300px) minmax(auto, 1620px) 1fr;
    grid-template-rows: 1fr 1fr;
  }
}
<header></header>
<nav>
  <span>Logo</span>
  <a href="#">login</a>
</nav>
<aside>aside</aside>
<main>main</main>

https://jsfiddle.net/90kotz8d/1/

【问题讨论】:

  • 您在问两个问题:一个是关于间距的,另一个是关于媒体查询的。通常最好一次只关注一个问题。
  • 我已经编辑了这个问题,并将为媒体查询创建另一个问题。谢谢
  • 我发布的链接可能会回答您有关媒体查询的问题。
  • 您能否发表评论,说明为什么我以前的答案不适合您?用这种方式帮助你会更容易

标签: html css webpage css-grid


【解决方案1】:

如果我理解您的意图,您并没有真正使用页眉作为间距,您实际上是在使用它来让蓝色背景覆盖所有空间。

由于您似乎还希望徽标和登录与边界垂直对齐,我认为没有任何可行的解决方案可以使用导航来做到这一点。

所以,我能找到的唯一解决方案是使用伪元素。至少这更具语义性。我摆脱了媒体查询,因为现在它们在这里不起作用:

* {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
    grid-template-columns: 10% 275px 1fr 10%;
    grid-template-rows: 1fr 1fr;
}

.container::after {
    content: "";
    background-color: blue;
    grid-column: 1 / 5;
    grid-row: 1;
    z-index: -1;
}

a {
  text-decoration: none;
  color: white;
}


nav {
  background: blue;
  color: #fff;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
}

nav span {
  margin-right: auto;
}

header {
  display: none;
}

aside {
  background: lightgreen;
}

main {
  background: pink;
}
nav {
    grid-column: 2 / 4;
    grid-row: 1;
  }
  aside {
    grid-column: 2 / 3;
  }
  main {
    grid-column: 3 / 4;
  }
<div class="container">
<nav>
  <span>Logo</span>
  <a href="#">login</a>
</nav>
<aside>aside</aside>
<main>main</main>
</div>

【讨论】:

    【解决方案2】:

    我猜,这就是你想要的东西。我在@media (min-width: 992px) 中使用了grid-column: 1 / 8;,并在两侧添加了手动填充。我希望,如果没有这个解决方案,到目前为止,如果不使用额外的 &lt;div&gt;&lt;header&gt; 或任何其他容器,您将没有更多选择。

    * {
      margin: 0;
      padding: 0;
    }
    
    body {
      display: grid;
      font-family: sans-serif;
    }
    
    a {
      text-decoration: none;
      color: white;
    }
    
    header,
    nav {
      background: blue;
      color: #fff;
    }
    
    nav {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
    }
    
    nav span {
      margin-right: auto;
    }
    
    header {
      display: none;
    }
    
    aside {
      background: lightgreen;
    }
    
    main {
      background: pink;
    }
    
    /* mobile  */
    
    
    @media (max-width: 767px) {
      body {
        grid-template-columns: 1fr;
        grid-template-rows: 1fr 1fr 1fr;
      }
      
      nav,
      aside,
      main {
        grid-column: 1 / 1;
        padding: 0 15px;
      }
    }
    
    
    /* tablets */
    
    
    @media (min-width: 768px) {
      body {
        grid-template-columns: 275px 1fr;
        grid-template-rows: 1fr 1fr;
      }
      
      nav {
        grid-column: 1 / 4;
        grid-row: 1;
        height: 50px;
        grid-row: 1;
      }
      
      aside {
        grid-column: 1;
      }
      
      main {
        grid-column: 2;
      }
      
      nav,
      aside,
      main {
        padding: 0 15px;
      }
    }
    
    
    /* desktops */
    
    
    @media (min-width: 992px) {
      body {
        grid-template-columns: 10% 275px 1fr 10%;
        grid-template-rows: 1fr 1fr;
      }
      
      nav {
        grid-column: 1 / 8;
        grid-row: 1;
        padding-right: 11.3vw;
        padding-left: 11.3vw;
      }
      
      aside {
        grid-column: 2 / 3;
      }
      
      main {
        grid-column: 3 / 4;
      }
    }
    
    
    /* xl desktops */
    
    
    @media (min-width: 1920px) {
      body {
        grid-template-columns: 1fr minmax(auto, 300px) minmax(auto, 1620px) 1fr;
        grid-template-rows: 1fr 1fr;
      }
    }
    <nav>
      <span>Logo</span>
      <a href="#">login</a>
    </nav>
    <aside>aside</aside>
    <main>main</main>

    【讨论】:

      【解决方案3】:

      据我所知,您可能需要先添加一条规则说它是 display: block;,然后才能添加 position: fixed 规则,因为我很确定 &lt;header&gt;s 是内联元素。

      您还可以尝试添加媒体查询,链接到显示不同表格的不同样式表,使用display: tableRow;tableCelltable 值。

      希望这可行

      【讨论】:

      • &lt;header&gt; 是块级元素。
      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2017-05-11
      • 1970-01-01
      相关资源
      最近更新 更多