【问题标题】:Adjust grid height to available screen without scrollbar将网格高度调整为没有滚动条的可用屏幕
【发布时间】:2017-10-22 06:35:14
【问题描述】:

我应该使用什么网格属性来将网格完美地保持在屏幕内?

.wrapper 上使用height: 100vh; 可以调整高度,但会引入滚动条。要删除不需要的滚动条,我尝试设置 body{margin:0;} 但我希望在整个网格周围留出一个边距而不产生滚动条。我确信这是一个简单的解决方法,但请帮助我!

Codepen:https://codepen.io/reiallenramos/pen/yzroxe

html,
body {
  height: 100%;
  width: 100%;
}

body {
  background-color: lightcyan;
}

.wrapper {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(6, 1fr);
  grid-gap: 8px;
  height: 100vh;
}

.wrapper>div {
  background-color: #eee;
}

.wrapper>div:nth-child(odd) {
  background-color: #ddd;
}

.item1 {
  grid-column: 1/2;
  grid-row: 1/5;
}

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

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

.item4 {
  grid-column: 2/4;
  grid-row: 3/5;
}

.item5 {
  grid-column: 4/5;
  grid-row: 3/6;
}

.item6 {
  grid-column: 1/3;
  grid-row: 5/7;
}

.item7 {
  grid-column: 3/4;
  grid-row: 5/7;
}

.item8 {
  grid-column: 4/5;
  grid-row: 6/7;
}
<div class="wrapper">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
  <div class="item item3">3</div>
  <div class="item item4">4</div>
  <div class="item item5">5</div>
  <div class="item item6">6</div>
  <div class="item item7">7</div>
  <div class="item item8">8</div>
</div>

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    主要浏览器通常会在body 元素上设置默认边距。通常是 8px,如recommended by the W3C

    因此,当将body元素或其他容器设置为height: 100%时,会出现垂直滚动条,因为存在溢出条件:

    100% + 8px > the viewport height
    

    简单的解决方法是用你自己的覆盖浏览器的默认规则:

    body { margin: 0; }
    

    但是,在这种情况下,您需要主容器周围的间隙。你不想要滚动条。

    然后只需将margin 替换为padding,并使用box-sizing: border-box

    对于box-sizing: border-box,填充和边框(但不包括边距)被计入内容长度。

    body {
      margin: 0;
      background-color: lightcyan;
    }
    
    /* NEW */
    * {
      box-sizing: border-box;
    }
    
    .wrapper {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      grid-template-rows: repeat(6, 1fr);
      grid-gap: 8px;
      padding: 8px; /* NEW */
      height: 100vh;
    }
    
    .wrapper>div {
      background-color: #eee;
    }
    
    .wrapper>div:nth-child(odd) {
      background-color: #ddd;
    }
    
    .item1 {
      grid-column: 1/2;
      grid-row: 1/5;
    }
    
    .item2 {
      grid-column: 2/3;
      grid-row: 1/3;
    }
    
    .item3 {
      grid-column: 3/5;
      grid-row: 1/3;
    }
    
    .item4 {
      grid-column: 2/4;
      grid-row: 3/5;
    }
    
    .item5 {
      grid-column: 4/5;
      grid-row: 3/6;
    }
    
    .item6 {
      grid-column: 1/3;
      grid-row: 5/7;
    }
    
    .item7 {
      grid-column: 3/4;
      grid-row: 5/7;
    }
    
    .item8 {
      grid-column: 4/5;
      grid-row: 6/7;
    }
    <div class="wrapper">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
      <div class="item item4">4</div>
      <div class="item item5">5</div>
      <div class="item item6">6</div>
      <div class="item item7">7</div>
      <div class="item item8">8</div>
    </div>

    【讨论】:

    【解决方案2】:

    除了将 html、body 上的边距设置为 0 之外,我发现唯一可行的方法是:

    html, body {
      height: 96vh;
    }
    

    【讨论】:

    • 感谢您的想法。 96vh 在底部产生了太多的“边距”,所以我现在将使用 98vh。仍在等待其他想法
    【解决方案3】:

    您必须从 包装器中减去额外的边距

    calc(100vh - 16px)

    那就不用100%用在身上了。

    【讨论】:

    • 是 16,因为顶部和底部的默认边距为 8?谢谢你。我可以写一个公式来确定额外的边距以避免幻数。
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2017-03-10
    • 2018-08-23
    相关资源
    最近更新 更多