【问题标题】:100vh adding space at the bottom from anterior sibling100vh 在底部从前兄弟添加空间
【发布时间】:2016-05-05 19:04:07
【问题描述】:

我正在尝试制作一个非常简单的页面,但我正在努力寻找布局的解决方案。

我想要实现的是一个简单的标题,下面是一些内容(我不知道它的实际高度,但可能不会覆盖视口的整个高度),并带有一个完整的背景封面图像剩余高度。

我尝试在要保存内容的容器上使用 100vh,但正如您在代码笔中看到的那样:http://codepen.io/renttless/pen/vGvzRj,它会创建一个滚动条,其大小显然与前一个兄弟的大小相同,这将是标题。

代码如下:

  <body>
  <div class="containerTest">
    <header>
      <nav>
        <ul>
          <li>Home</li>
          <li>Who are we</li>
          <li>Our work</li>
          <li>Contact</li>
        </ul>
      </nav>
    </header>

    <section class="sectionTest">
     <div class="backgroundTest">
       <h1>I'm a full size h1</h1>
       <p>I'm some paragraph</p>


 </div>
    </section>
  </div>

CSS:

    html,body{
  height: 100%;
}
.sectionTest .backgroundTest{
    background-color:red;
    height:100vh;
}

【问题讨论】:

  • 那么.sectionTest的高度应该是&lt;viewport height&gt; - &lt;header height&gt;还是100vh - &lt;header height&gt;
  • 如何计算?这是预期的行为吗?还是 100vh 实际上是整个屏幕的视口?
  • 这是意料之中的。如果您的视口高度为 1000 像素且标题为 100 像素,那么您将在放置时获得一个滚动条,并且标题后的元素等于浏览器视口的高度。所以你得到100px (header) + 1000px (content after header) = 1100px 并出现滚动条,因为你所有的内容的高度都大于视口的高度。如果您的标题有一个设定的高度,您可以尝试使用calc() 并从视口高度中减去标题height: calc( 100vh - 100px );
  • 完全正确。内容超过100vh的容器高度怎么办?因为它没有展开。
  • 我没有关注。你想要的结果是什么?如果您的内容占用了比视口更多的空间,您将隐藏溢出或提供滚动条。滚动条出现的位置取决于您。像现在一样在视口上,或者你可以在包含内容的元素上有一个滚动条。

标签: html css viewport-units


【解决方案1】:

如果您在标题中添加背景并将 100vh 移动到 html 元素,它将解决您的问题

    html{
        background-color:red;
        height:100vh;
    }
    header{
      background: white;
    }
    body, header ul{
      margin: 0;
    }
  <body>
  <div class="containerTest">
    <header>
      <nav>
        <ul>
          <li>Home</li>
          <li>Who are we</li>
          <li>Our work</li>
          <li>Contact</li>
        </ul>
      </nav>
    </header>

    <section class="sectionTest">
     <div class="backgroundTest">
       <h1>I'm a full size h1</h1>
       <p>I'm some paragraph</p>


 </div>
    </section>
  </div>

【讨论】:

  • 我可能错了,但我认为这种方法的问题在于,如果他使用背景图像,那么背景图像的顶部就会被裁剪。对于纯色或带有图案(至少有一些)的背景图像,这将工作得很好。
【解决方案2】:

这很痛苦。也许尝试使用 flexbox 方法。这是example

<div class="box">
  <div class="row header">
    <header>
      <nav>
        <ul>
          <li>Home</li>
          <li>Who are we</li>
          <li>Our work</li>
          <li>Contact</li>
        </ul>
      </nav>
    </header>
  </div>
  <div class="row content">
       <h1>I'm a full size h1</h1>
       <p>I'm some paragraph</p>
  </div>
</div>

CSS:

html,
body {
  height: 100%;
  margin: 0
}

.box {
  display: flex;
  flex-flow: column;
  height: 100%;
}

.box .row {
  border: 1px dotted grey;
  flex: 0 1 30px;
}

.box .row.header {
  flex: 0 1 auto;
  background-color: red;
}

.box .row.content {
  flex: 1 1 auto;
  background-color: green;
}

【讨论】:

  • 感谢您的回复。但我只需要标题下方的内容有一个应该覆盖剩余高度的背景。我按照你的建议做了,然后将 100vh 添加到 backgroundTest 一个背景颜色,但结果与上面相同。
  • @user2430929 我进行了编辑以更好地回答您的问题。
猜你喜欢
  • 2020-05-06
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多