高度未知的居中响应 div 并启用完全垂直滚动

Center responsive div with unknown height and enable full vertical scroll

我正在尝试将高度未知的 div 居中。

当视口高度小于 div 高度时,我找不到允许滚动到 div 顶部的解决方案。

HTML

<div>
  <p>This will be hidden when <br />
  window_height < div_width</p>
  <br />
  <br />
  <br />
 How to make it scroll to the top?
</div>

CSS

    body {
      background: grey;
    }
    p{
      background: green;
    }
    div {
      position: absolute;
      left: 50%;
      top: 50%;
      box-sizing: border-box;
      transform: translate(-50%, -50%);
      max-width: 500px;
      width:100%;
      height: 700px; /* Unknown*/
      padding: 20px;  
      background: red;
      color: white;
      text-align: center;
    }

http://codepen.io/Koopa/pen/GpypdX

谢谢

您无法滚动到 div 顶部的原因是 transform 属性 具有负值将 div 定位在较小的屏幕外屏幕。

在此演示中 transform 被禁用:
http://codepen.io/anon/pen/wKpMyM

此外,当您将绝对定位应用于元素时,您会将其从文档的 normal flow 中移除。这意味着它被它的容器忽略了。因此,bodyhtml 元素的高度为零。

在此演示中,body 有一个绿色边框(完全折叠):
http://codepen.io/anon/pen/RWxrod

为了使您的布局正常工作,您可以为 body 指定一个最小高度(以便它可以随 div 一起扩展),而不是使用绝对定位居中,使用 flexbox.

CSS

html { height: 100%; } /* necessary for percentage heights to work */

body {
    background: grey;
    border: 10px solid green; /* for demo purposes */
    min-height: 100%; /* allow body to expand with children */
    display: flex; /* establish flex container */
    justify-content: center; /* center div horizontally, in this case */
    align-items: center; /* center div vertically, in this case */
}

p {
  background: green;
}

div {
    /* REMOVE
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%); */

    box-sizing: border-box;
    max-width: 500px;
    width:100%;
    height: 700px; /* Unknown*/
    padding: 20px;  
    background: red;
    color: white;
    text-align: center;
}

演示版:http://codepen.io/anon/pen/OyzMvV

请注意,所有主要浏览器都支持 flexbox,except IE 8 & 9