CSS 100%高度,带填充/边距

使用HTML / CSS,如何制作宽度和/或高度为其父元素的100%并且仍然具有适当填充或边距的元素?

所谓“适当的”我的意思是,如果我的父元素是200px高大的,我指定height = 100%padding = 5px我所期望的,我应该得到一个190px高的元素与border = 5px所有各方,很好地集中在父元素。

现在,我知道这不是标准盒模型指定它应该如何工作的方式(尽管我想确切地知道为什么),所以显而易见的答案不起作用:

#myDiv {
    width: 100%
    height: 100%;
    padding: 5px;
}

但是在我看来,必须有某种方法可以为任意大小的父级可靠地产生这种效果。有人知道完成此任务(看似简单)的方法吗?

哦,根据记录,我对IE兼容性不是很感兴趣,因此(希望)可以使事情变得容易一些。

编辑:由于要求一个示例,这是我能想到的最简单的一个示例:

<html style="height: 100%">
    <body style="height: 100%">
        <div style="background-color: black; height: 100%; padding: 25px"></div>
    </body>
</html>

然后面临的挑战是使黑框显示出来,在所有边缘上填充25个像素,而页面不会足够大以至于需要滚动条。

猪猪小宇宙2020/03/16 10:30:44
  <style type="text/css">
.stretchedToMargin {
    position:absolute;
    width:100%;
    height:100%;

}
</style>
泡芙GO2020/03/16 10:30:44

div边框,而不是页面主体页边距

另一个解决方案-我只希望页面边缘周围有一个简单的边框,当内容小于该值时,我希望高度为100%。

边界框不起作用,对于这种简单的需求,固定的位置似乎是错误的。

我最终在容器中添加了边框,而不是依赖页面主体的边缘-看起来像这样:

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

.container {
    width: 100%;
    min-height: 100%;
    border: 8px solid #564333;
}
西门Jim2020/03/16 10:30:44

弗兰克(Frank)的例子让我有些困惑-在我的情况下,它不起作用,因为我对定位不够了解。重要的是要注意,父容器元素需要具有非静态位置(他提到了这个,但是我忽略了它,而在他的示例中没有)。

这是一个示例,其中给定填充和边框的子项使用绝对定位填充父项的100%。父级使用相对定位以便在保持正常流程的同时为孩子的位置提供参考点-下一个元素“更多内容”不受影响:

#box {
    position: relative;
    height: 300px;
    width: 600px;
}

#box p {
    position: absolute;
    border-style: dashed;
    padding: 1em;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}
<div id="box">
  <p>100% height and width!</p>
</div>
<div id="more-content">
</div>

快速学习CSS定位的有用链接

ProGO2020/03/16 10:30:44

另一种解决方案是使用display:table,它具有不同的框模型行为。

您可以为父级设置高度和宽度,并添加填充而不扩展它。这个孩子的身高和宽度减去填充物为100%。

吉宾

另一种选择是使用盒大小属性。两者唯一的问题是它们在IE7中不起作用。

Gil梅2020/03/16 10:30:44

另一种解决方案:您可以将百分比单位用于边距和大小。例如:

.fullWidthPlusMargin {
    width: 98%;
    margin: 1%;
}

这里的主要问题是,边距将随着父元素的大小而略微增加/减少。大概您希望的功能是使边距保持恒定,并且子元素增大/缩小以填充间距的变化。因此,根据您需要显示屏的紧度,这可能会出现问题。(我也会选择较小的利润率,例如0.3%)。

小哥达蒙2020/03/16 10:30:44

使用flexbox的解决方案(适用于IE11):(或在jsfiddle上查看

<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;">
    <div style="background-color: black; flex: 1; margin: 25px;"></div>
  </body>
</html>

对于实际问题CSS重置不一定很重要。)

重要的部分是flex: 1(与display: flex父母一起)。有趣的是,我所知道的关于Flex属性如何工作的最合理的解释来自于本机文档,因此无论如何我都引用它

(...)flex:1,它告诉组件填充所有可用空间,并与同一父组件在其他组件之间平均共享

老丝镜风2020/03/16 10:30:44

这是CSS的完全惯用语言之一-我尚未理解其推理(如果有人知道,请解释一下)。

100%表示容器高度的100%-上面添加了任何边距,边框和填充。因此,实际上不可能获得一个填充其父容器且具有边距,边框或填充的容器。

另请注意,众所周知,浏览器之间的设置高度也不一致。


自发布此书以来,我了解到的另一件事是,百分比是相对于容器的长度(即宽度)而言的,因此百分比对于高度而言甚至更不值钱了。

如今,vh和vw视口单元更有用,但对于顶层容器以外的其他任何东西仍然没有特别有用。

斯丁泡芙2020/03/16 10:30:44

1.全高 padding

body {
  margin: 0;
}
.container {
  min-height: 100vh;
  padding: 50px;
  box-sizing: border-box;
  background: silver;
}
<div class="container">Hello world.</div>

2.全高 margin

body {
  margin: 0;
}
.container {
  min-height: calc(100vh - 100px);
  margin: 50px;
  background: silver;
}
<div class="container">Hello world.</div>

3.全高搭配 border

body {
  margin: 0;
}
.container {
  min-height: 100vh;
  border: 50px solid pink;
  box-sizing: border-box;
  background: silver;
}
<div class="container">Hello world.</div>

Harry理查德2020/03/16 10:30:44

根据w3c规范,高度是指可视区域的高度,例如在1280x1024像素分辨率的显示器上100%的高度= 1024像素。

min-height是指包含内容的页面总高度,因此在内容大于1024px的页面上,min-height:100%将拉伸以包含所有内容。

然后另一个问题是,在大多数现代浏览器中,除了ie6(ie6实际上是很合逻辑的,但不符合规范)的高度和宽度上都添加了填充和边框。这称为盒子模型。因此,如果您指定

min-height: 100%;
padding: 5px; 

实际上,它会为您提供100%+ 5px + 5px的高度。为了解决这个问题,您需要一个包装容器。

<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>

<div class="FullHeight">
   <div class="Padded">
      Hello i am padded.
   </div
</div>
GO老丝LEY2020/03/16 10:30:44

CSS3有一个新属性,可用于更改框模型计算宽度/高度的方式,这称为框大小。

通过将此属性设置为“ border-box”,它使您添加边框或边框时应用的任何元素都不会拉伸。如果您定义的宽度为100px,填充为10px,则宽度仍为100px。

box-sizing: border-box;

请参阅此处以获取浏览器支持它不适用于IE7及更低版本,但是,我相信Dean Edward的IE7.js添加了对此的支持。请享用 :)

卡卡西梅Harry2020/03/16 10:30:44

更好的方法是使用calc()属性。因此,您的情况如下所示:

#myDiv {
    width: calc(100% - 5px);
    height: calc(100% - 5px);
    padding: 5px;
}

简单,干净,没有解决方法。只需确保您不要忘记值和运算符之间的空格(例如(100%-5px))就会破坏语法。

神乐Gil2020/03/16 10:30:44

解决方案是根本不使用高度和宽度!使用顶部,左侧,右侧,底部附加内部框,然后添加边距。

.box {margin:8px; position:absolute; top:0; left:0; right:0; bottom:0}
<div class="box" style="background:black">
  <div class="box" style="background:green">
    <div class="box" style="background:lightblue">
      This will show three nested boxes. Try resizing browser to see they remain nested properly.
    </div>
  </div>
</div>

JinJin村村2020/03/16 10:30:44

我阅读了“ PRO HTML和CSS设计模式 ”,了解了如何进行此类操作display:block是为默认显示的值div,但我喜欢,使其明确。容器必须是正确的类型;position属性是fixedrelative,或absolute

.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;
}
<div class="stretchedToMargin">
  Hello, world
</div>

小提琴由Nooshu的评论