使用CSS网格将页脚放在视线之外 [英] Placing the footer out of view using CSS grid

查看:70
本文介绍了使用CSS网格将页脚放在视线之外的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个70像素高的标题,我要填充屏幕其余部分的主要内容,然后是70像素页脚。 我正在尝试找到最简单的隐藏页脚的方法。这与视图中的 footer 一起使用-请参见> jsfiddle 和以下代码段:

I have a header that is 70px high, the main content which I want to fill the rest of the screen and then a 70px footer. I am trying to find the most simple approach of hiding a footer. This works with the footer in view - see jsfiddle and snippet below:

* {
  margin: 0;
  padding: 0;
}

*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  display: grid;
  margin: 0px;
  grid-gap: 10px;
  height: 100vh;
  grid-template-columns: [side__nav] 250px [main] 1fr;
  grid-template-rows: [header] 70px auto [footer] 70px;
}

.header {
  grid-column: main;
  grid-row: 1;
  background: pink;
}

.side__nav {
  grid-column: side__nav;
  grid-row: 1/span 3;
  background: red;
}

.content {
  grid-column: main;
  grid-row: 2;
  background: green;
}

.footer {
  grid-column: main;
  grid-row: 3;
  background: purple;
  opacity: 0.5;
}

.a {
  grid-column: col/span 2;
  grid-row: row;
}

.b {
  grid-column: col 3/span 2;
  grid-row: row;
}

.c {
  grid-column: col/span 2;
  grid-row: row 2;
}

.d {
  grid-column: col 3/span 2;
  grid-row: row 2;
  display: grid;
  grid-gap: 10px;
  grid-template-columns: 1fr 1fr;
}

.e {
  grid-column: 1/3;
  grid-row: 1;
}

.f {
  grid-column: 1;
  grid-row: 2;
}

.g {
  grid-column: 2;
  grid-row: 2;
}

<header class="header">header</header>
<nav class="side__nav">side__nav</nav>
<content class="content">content</content>
<footer class="footer">footer</footer>

但是我想将其推离屏幕,以便可以在需要时使用按钮进行显示。我试过使用 grid-template-rows:[header] 70px calc(100vh-70px)[footer] 70px
这确实给了我我想要的效果 jsfiddle 和以下代码段:

But I want to push it off screen so I can use a button to show when needed. I have tried using grid-template-rows: [header] 70px calc(100vh - 70px) [footer] 70px which does give me the effect I want see jsfiddle and snippet below:

* {
  margin: 0;
  padding: 0;
}

*, *::before, *::after {
  box-sizing: border-box;
}

body {
  display: grid;
  margin: 0px;
  grid-gap: 10px;
  height: 100vh;
  grid-template-columns: [side__nav] 250px [main] 1fr;
  grid-template-rows: [header] 70px calc(100vh - 70px) [footer] 70px;
}

.header {
  grid-column: main;
  grid-row: 1;
  background: pink;
}

.side__nav {
  grid-column: side__nav;
  grid-row: 1/span 3;
  background: red;
}

.content {
  grid-column: main;
  grid-row: 2;
  background: green;
}

.footer {
  grid-column: main;
  grid-row: 3;
  background: purple;
  opacity: 0.5;
}

.a {
  grid-column: col/span 2;
  grid-row: row;
}

.b {
  grid-column: col 3/span 2;
  grid-row: row;
}

.c {
  grid-column: col/span 2;
  grid-row: row 2;
}

.d {
  grid-column: col 3/span 2;
  grid-row: row 2;
  display: grid;
  grid-gap: 10px;
  grid-template-columns: 1fr 1fr;
}

.e {
  grid-column: 1/3;
  grid-row: 1;
}

.f {
  grid-column: 1;
  grid-row: 2;
}

.g {
  grid-column: 2;
  grid-row: 2;
}

<header class="header">header</header>
<nav class="side__nav">side__nav</nav>
<content class="content">content</content>
<footer class="footer">footer</footer>


问题是,如果我使用 grid-gap:10px 我必须
计算出 grid-template-rows 如果我再添加
个部分,则会变得混乱。

But the problem with that is, If I use grid-gap: 10px I have to calculate that in grid-template-rows which then gets messy if I add more sections.

例如,3个部分将有2个间隔,如果我将间隔设置为10px,则总计为20px,再加上页脚的70px,即总计90px。如果有人接管了代码,他们需要知道他们需要手动将此代码添加到 grid-template-row 行中,我知道这会丢失。有人有一个简单的想法我想念吗?

For instance, 3 sections will have 2 gaps, if I set the gap as 10px, the total will be 20px, plus the 70px for the footer meaning a total of 90px. If someone takes over the code they need to know that they need to add this manually to the grid-template-row line which I know will get missed. Anyone have a simple idea that I am missing?

推荐答案

您可以删除页脚中的$ c>(将 explicit grid 行定义更改为 grid-template-rows:[header] 70px 1fr 并从 footer 中删除​​ grid-row:3 ),并设置 grid容器高度设置为 calc(100vh + 70px)并设置隐式网格行(即您的页脚高度),使用 grid-auto-rows:70px

You can remove your footer from the explicit grid (change your explicit grid row definition into grid-template-rows: [header] 70px 1fr and remove grid-row: 3 from footer) and set the grid container height to calc(100vh + 70px) and set the implicit grid row (which is your footer height) using grid-auto-rows: 70px.

请参见下面的香草CSS演示

* {
  margin: 0;
  padding: 0;
}

*, *::before, *::after {
  box-sizing: border-box;
}

body {
  display: grid;
  margin: 0px;
  grid-gap: 10px;
  height: calc(100vh + 70px); /* adding footer height */
  grid-template-columns: [side__nav] 250px [main] 1fr;
  grid-template-rows: [header] 70px 1fr; /* removed footer from here */
  grid-auto-rows: 70px; /* implicit grid height - footer height */
}

.header {
  grid-column: main;
  grid-row: 1;
  background: pink;
}

.side__nav {
  grid-column: side__nav;
  grid-row: 1/span 3;
  background: red;
}

.content {
  grid-column: main;
  grid-row: 2;
  background: green;
}

.footer {
  grid-column: main;
  /*grid-row: 3;*/
  background: purple;
  opacity: 0.5;
}

.a {
  grid-column: col/span 2;
  grid-row: row;
}

.b {
  grid-column: col 3/span 2;
  grid-row: row;
}

.c {
  grid-column: col/span 2;
  grid-row: row 2;
}

.d {
  grid-column: col 3/span 2;
  grid-row: row 2;
  display: grid;
  grid-gap: 10px;
  grid-template-columns: 1fr 1fr;
}

.e {
  grid-column: 1/3;
  grid-row: 1;
}

.f {
  grid-column: 1;
  grid-row: 2;
}

.g {
  grid-column: 2;
  grid-row: 2;
}

<header class="header">header</header>
<nav class="side__nav">side__nav</nav>
<content class="content">content</content>
<footer class="footer">footer</footer>

但同样,您必须做当将新部分添加到网格时,这些混乱计算更动态的选择是保留一个网格项(以下示例中的零宽 adjuster 元素)用于设置布局高度:

But again you'll have to do those messy calculations when new sections are added to the grid. A more dynamic option is to keep a grid item (zero-width adjuster element in demo below) just for setting the layout height:


  • 放在第一列中,并且跨越前两行

    已设置高度:100vh 并以 z索引向后推:-1 ,以便不影响布局。

    has height: 100vh set and pushed behind with z-index: -1 so that it doesn't affect the layout.

    请参见下面的演示:

    * {
      margin: 0;
      padding: 0;
    }
    
    *, *::before, *::after {
      box-sizing: border-box;
    }
    
    body {
      display: grid;
      margin: 0px;
      grid-gap: 10px;
      grid-template-columns: [side__nav] 250px [main] 1fr;
      grid-template-rows: [header] 70px 1fr; /* removed footer from here */
      grid-auto-rows: 70px; /* implicit grid height - footer height */
    }
    
    .header {
      grid-column: main;
      grid-row: 1;
      background: pink;
    }
    
    .side__nav {
      grid-column: side__nav;
      grid-row: 1/span 3;
      background: red;
    }
    
    .content {
      grid-column: main;
      grid-row: 2;
      background: green;
    }
    
    .footer {
      grid-column: main;
      /*grid-row: 3;*/
      background: purple;
      opacity: 0.5;
    }
    
    .a {
      grid-column: col/span 2;
      grid-row: row;
    }
    
    .b {
      grid-column: col 3/span 2;
      grid-row: row;
    }
    
    .c {
      grid-column: col/span 2;
      grid-row: row 2;
    }
    
    .d {
      grid-column: col 3/span 2;
      grid-row: row 2;
      display: grid;
      grid-gap: 10px;
      grid-template-columns: 1fr 1fr;
    }
    
    .e {
      grid-column: 1/3;
      grid-row: 1;
    }
    
    .f {
      grid-column: 1;
      grid-row: 2;
    }
    
    .g {
      grid-column: 2;
      grid-row: 2;
    }
    
    .adjuster { /* grid items spanning two rows with explicit height set */
      width: 0;
      position: relative;
      z-index: -1;
      grid-column: 1;
      grid-row: 1 / span 2;
      height: 100vh;
    }
    
    section { /* new sections added*/
      background: cadetblue;
    }

    <header class="header">header</header>
    <nav class="side__nav">side__nav</nav>
    <content class="content">content</content>
    <footer class="footer">footer</footer>
    <!-- height adjuster for viewport -->
    <span class="adjuster"></span>
    <!-- other page sections below -->
    <section></section>
    <section></section>

    p>

    来自MDN的隐式显式网格的摘录:

    Excerpts on implicit and explicit grids from MDN:


    隐式和显式网格(MDN)

    如果您在定义的gr id-或由于
    的内容量,需要更多的网格轨迹-然后,网格会在隐式网格中创建
    行和列。默认情况下,这些曲目的大小将自动设置为
    ,导致它们的大小基于其中的内容

    If you place something outside of the defined grid—or due to the amount of content, more grid tracks are needed—then the grid creates rows and columns in the implicit grid. These tracks will be auto-sized by default, resulting in their size being based on the content that is inside them.

    您还可以使用 grid-auto-rows grid-auto-columns 中创建的轨道定义一个设置大小c $ c>属性。

    You can also define a set size for tracks created in the implicit grid with the grid-auto-rows and grid-auto-columns properties.






    您可以详细了解显式和隐式网格自动添加CSS网格不需要的列

    这篇关于使用CSS网格将页脚放在视线之外的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆