我找到了一种方法,使一个div容器占据至少一个页面的全部高度,通过设置最小高度:100%;。然而,当我添加一个嵌套的div并设置高度:100%;,它不会延伸到容器的高度。有办法解决吗?

Html, body { 高度:100%; 保证金:0; } #控制{ 最小高度:100%; 背景:粉色; } # containment-shadow-left { 高度:100%; 背景:水; } < div id = "容器" > < div id = " containment-shadow-left " > 你好世界! < / div > < / div >


当前回答

这是在@jackocnr的评论中添加的,但我错过了。对于现代浏览器,我认为这是最好的方法。

如果容器太小,它会让内部元素填充整个容器,但如果容器太大,它会扩展容器的高度。

#containment {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

#containment-shadow-left {
  flex: 1;
}

其他回答

这是一个报告的webkit (chrome/safari)错误,父母的孩子不能继承身高属性:https://bugs.webkit.org/show_bug.cgi?id=26559

显然Firefox也受到了影响(目前无法在IE中测试)

可能的解决方法:

添加位置:相对于#containment 添加位置:绝对到# include -shadow-left

当内部元素具有绝对定位时,该错误不会显示。

参见http://jsfiddle.net/xrebB/

编辑于2014年4月10日

因为我目前正在做一个项目,我确实需要具有最小高度的父容器,并且子元素继承容器的高度,所以我做了更多的研究。

首先,我不再确定当前的浏览器行为是否真的是一个错误。CSS2.1规范说:

百分比是根据高度计算的 生成框的包含块。如果包含高度 Block没有显式地指定(也就是说,它取决于内容 高度),并且该元素不是绝对定位的,值 计算为“auto”。

如果我把一个min-height放在我的容器上,我没有显式地指定它的高度——所以我的元素应该得到一个自动高度。这正是Webkit和所有其他浏览器所做的。

第二,我发现的变通方法:

如果我将容器元素设置为display:table with height:inherit,它的作用与我给它的min-height设置为100%完全相同。更重要的是,如果我将子元素设置为display:table-cell,它将完美地继承容器元素的高度——无论它是100%还是更高。

CSS:

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

#container {
  background: green;
  display: table;
  height: inherit;
  width: 100%;
}

#content {
  background: red;
  display: table-cell;
}

标记:

<div id="container">
  <div id="content">
      <p>content</p>
  </div>
</div>

见http://jsfiddle.net/xrebB/54/。

在尝试了我们的之后!chrome理解,当我设置显示值为inline block时,我希望子元素的高度为100%。顺便说一句,设置浮动会导致它。

display:inline-block

更新

这行不通。解决方案是获得parentnode offsetheight,并使用它在页面的和javascript。

<script>
    SomedivElement = document.getElementById('mydiv');
    SomedivElement.style.height = String(nvleft.parentNode.offsetHeight) + 'px';    
</script>

虽然显示:伸缩;这里已经建议,考虑使用显示:网格;现在它得到了广泛支持。默认情况下,网格的唯一子节点将完全填充其父节点。

Html, body { 高度:100%; 保证金:0; 填充:0;/*不要忘记Safari */ } #控制{ 显示:网格; 最小高度:100%; 背景:粉色; } # containment-shadow-left { 背景:水; }

我不相信这是浏览器的bug。所有的行为都是一样的——也就是说,一旦停止指定显式高度,min-height基本上就是“最后一步”了。

这似乎正是CSS 2.1规范所建议的: http://www.w3.org/TR/CSS2/visudet.html#the-height-property

该百分比是根据生成的框的包含块的高度计算的。如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位,则该值计算为'auto'。

因此,由于min-height父类没有显式的height属性设置,它默认为auto。

有一些方法可以通过使用display: table-cell或新的样式(如flexbox)来解决这个问题,如果这对您的目标用户的浏览器可行的话。在某些情况下,您还可以通过在绝对定位的内部元素上使用top和bottom属性来改变这种情况,这将为您提供100%的高度而无需指定。

另一个简单的JS解决方案,可以用来避免不简单的css或额外的标记/ hack解决方案。

function minHeight(elm, percent) {
  var windowHeight = isNaN(window.innerHeight) ? 
                     window.clientHeight : window.innerHeight;
  var height = windowHeight * percent / 100;
  elm.style.minHeight = height + 'px';
}

W/ jQuery:

function minHeight($elm, percent) {
  var windowHeight = $(window).height();
  var height = windowHeight * percent / 100;
  $elm.css('min-height', height + 'px');
}

Angular指令:

myModule.directive('minHeight', ['$window', function($window) {
  return {
    restrict: 'A',
    link: function(scope, elm, attrs) {
      var windowHeight = isNaN($window.innerHeight) ? 
               $window.clientHeight : $window.innerHeight;
      var height = windowHeight * attrs.minHeight / 100;
      elm.css('min-height', height + 'px');
    }
  };
}]);

这样用:

<div>
  <!-- height auto here -->
  <div min-height="100">
    <!-- This guy is at least 100% of window height but grows if needed -->
  </div>
</div>