CSS 100% height with padding/margin
这让我疯狂了好几天了,但实际上这是我在过去几年中一直存在的问题:使用HTML / CSS我怎样才能制作出具有宽度和/或宽度的元素高度是它的父元素的100%,仍然有适当的填充或边距?
通过"正确"我的意思是如果我的父元素是
现在,我知道那不是标准盒子模型指定它应该如何工作(虽然我想知道为什么,确切地说......),所以明显的答案不起作用:
1 2 3 4 5 | #myDiv { width: 100% height: 100%; padding: 5px; } |
但在我看来,必须有一些方法可以为任意大小的父母可靠地产生这种效果。有谁知道完成这个(看似简单)任务的方法?
哦,为了记录,我对IE兼容性并不十分感兴趣,所以应该(希望)让事情变得更容易一些。
编辑:自从一个例子被要求,这是我能想到的最简单的一个:
1 2 3 4 5 | <html style="height: 100%"> <body style="height: 100%"> </body> </html> |
接下来的挑战是让黑盒子在所有边缘都显示25像素的填充,而页面不会变得足够大以至于需要滚动条。
我学习了如何阅读"PRO HTML和CSS设计模式"这些东西。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | .stretchedToMargin { display: block; position:absolute; height:auto; bottom:0; top:0; left:0; right:0; margin-top:20px; margin-bottom:20px; margin-right:80px; margin-left:80px; background-color: green; } |
1 | Hello, world |
Nooshu的评论小提琴
CSS3中有一个新属性可用于更改框模型计算宽度/高度的方式,它称为框大小。
通过使用值"border-box"设置此属性,当您添加填充或边框时,它会使您应用它的任何元素都不会拉伸。如果你定义100px宽度和10px填充的东西,它仍然是100px宽。
1 | box-sizing: border-box; |
请参阅此处获取浏览器支持它不适用于IE7及更低版本,但我相信Dean Edward的IE7.js增加了对它的支持。请享用 :)
解决方案是根本不使用高度和宽度!使用顶部,左侧,右侧,底部连接内部框,然后添加边距。
1 | .box {margin:8px; position:absolute; top:0; left:0; right:0; bottom:0} |
1 | This will show three nested boxes. Try resizing browser to see they remain nested properly. |
更好的方法是使用calc()属性。所以你的情况看起来像:
1 2 3 4 5 | #myDiv { width: calc(100% - 5px); height: calc(100% - 5px); padding: 5px; } |
简单,干净,没有解决方法。只要确保你不要忘记值和操作符之间的空格(例如(100%-5px)会破坏语法。享受!
根据w3c规格,高度指的是可视区域的高度,例如在1280x1024像素分辨率监视器上100%高度= 1024像素。
min-height指页面的总高度,包括内容,因此在内容大于1024px min-height的页面上:100%将拉伸以包含所有内容。
另一个问题是在大多数现代浏览器中,填充和边框被添加到高度和宽度,除了ie6(ie6实际上是非常合乎逻辑但不符合规范)。这称为盒子模型。所以,如果你指定
1 2 | min-height: 100%; padding: 5px; |
它实际上会给你100%+ 5px + 5px的高度。要解决这个问题,你需要一个包装容器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <style> .FullHeight { height: auto !important; /* ie 6 will ignore this */ height: 100%; /* ie 6 will use this instead of min-height */ min-height: 100%; /* ie 6 will ignore this */ } .Padded { padding: 5px; } </style> Hello i am padded. </div |
1.全高
1 2 3 4 5 6 7 8 9 | body { margin: 0; } .container { min-height: 100vh; padding: 50px; box-sizing: border-box; background: silver; } |
1 | Hello world. |
2.全高
1 2 3 4 5 6 7 8 | body { margin: 0; } .container { min-height: calc(100vh - 100px); margin: 50px; background: silver; } |
1 | Hello world. |
3.全高
1 2 3 4 5 6 7 8 9 | body { margin: 0; } .container { min-height: 100vh; border: 50px solid pink; box-sizing: border-box; background: silver; } |
1 | Hello world. |
这是CSS的彻头彻尾的愚蠢之一 - 我还没有理解推理(如果有人知道,请解释)。
100%表示容器高度的100% - 添加任何边距,边框和填充。因此,实际上不可能获得填充其父级并且具有边距,边框或填充的容器。
另请注意,浏览器之间的设置高度也是众所周知的不一致。
自从我发布之后我学到的另一件事是,百分比是相对于容器的长度,即它的宽度,使得百分比对于高度更加无价值。
如今,vh和vw视口单元更有用,但对顶级容器以外的任何东西都不是特别有用。
另一种解决方案是使用display:table,它具有不同的盒子模型行为。
您可以为父级设置高度和宽度,并添加填充而不扩展它。孩子有100%的身高和宽度减去填充物。
JSBIN
另一种选择是使用盒子大小的属性。只有两者的问题是它们在IE7中不起作用。
另一种解决方案:您可以使用百分比单位作为边距和尺寸。例如:
1 2 3 4 | .fullWidthPlusMargin { width: 98%; margin: 1%; } |
这里的主要问题是边距将随着父元素的大小而略微增加/减少。据推测,您希望的功能是边距保持不变,子元素增长/缩小以填充间距变化。因此,根据您需要显示器的紧张程度,这可能会有问题。 (我也会选择较小的保证金,比如0.3%)。
使用flexbox的解决方案(在IE11上工作):(或在jsfiddle上查看)
1 2 3 4 5 6 7 8 9 10 11 | <html> <style> html, body { height: 100%; /* fix for IE11, not needed for chrome/ff */ margin: 0; /* CSS-reset for chrome */ } </style> <body style="display: flex;"> </body> </html> |
(CSS重置对于实际问题不一定重要。)
重要的部分是
(...) flex: 1, which tells a component to fill all available space, shared evenly amongst other components with the same parent
弗兰克的例子让我有点困惑 - 它在我的情况下不起作用,因为我还不太了解定位。重要的是要注意父容器元素需要具有非静态位置(他提到了这一点,但我忽略了它,并且它不在他的例子中)。
这是一个示例,其中子项 - 给定填充和边框 - 使用绝对定位来填充父项100%。父母使用相对定位,以便在保持正常流程的同时为孩子的位置提供参考点 - 下一个元素"more-content"不受影响:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #box { position: relative; height: 300px; width: 600px; } #box p { position: absolute; border-style: dashed; padding: 1em; top: 0; right: 0; bottom: 0; left: 0; } |
1 2 3 | <p> 100% height and width! </p> |
快速学习CSS定位的有用链接
div周围的边框,而不是页面边距
另一个解决方案 - 我只是想在页面边缘有一个简单的边框,当内容小于那个时我想要100%的高度。
边框不起作用,固定的定位对于这样一个简单的需求似乎是错误的。
我最后添加了一个边框到我的容器,而不是依赖于页面正文的边缘 - 它看起来像这样:
1 2 3 4 5 6 7 8 9 10 | body, html { height: 100%; margin: 0; } .container { width: 100%; min-height: 100%; border: 8px solid #564333; } |
1 2 3 4 5 6 7 8 | <style type="text/css"> .stretchedToMargin { position:absolute; width:100%; height:100%; } </style> |