【问题标题】:height and width on html and body elementshtml 和 body 元素的高度和宽度
【发布时间】:2012-08-13 06:55:07
【问题描述】:

如果我有以下标记

<html>
<body>
<div id="wrapper">
<div id="container">
<p>Lots of pragraphs here</p>
</div>
</div>
</body>
</html>

具有以下样式

html, body, #wrapper
{
width: 100%;
height: 100%;
}
#container
{
width: 960px;
margin: 0 auto;
}

为什么我的 html、body 和 wrapper 元素没有扩展到 FF13 中浏览器/视口的 100% 高度。在 Firebug 中查看时,html、body 和 wrapper 垂直停止在距底部一定距离的地方。容器 div 延伸到全高,因为它的高度由内容决定。

(1263px X 558px for html, body, wrapper)和(960px X 880px for container)

查看默认 100% 时,上述情况如下面的第一张图片所示。但是当我放大到最后一个 poosible 放大时,上述情况不会发生,因为下面的第二张图片显示并且 html、body、wrapper 延伸到了全高。

(4267px X 1860px for html, body, wrapper)-(960px X 1000px for container)

【问题讨论】:

  • 'wrapper' 和 'container' 不是有效的 HTML 元素:/
  • @BillyMoat:它是一个 div 而不是一个包装器元素。
  • @BillyMoat: 改错了。
  • 包装器和容器与.css上的完全一样吗?它们应该有一个“#”,将它们标识为 id。
  • 在你的真实 CSS 文件中,你的元素名称前有散列标签吗?

标签: html css height


【解决方案1】:

您的html 实际上正好延伸到视口的 100% 高度,因为这里的视口是浏览器窗口,而不是内部内容。

考虑一下(jsfiddle):

<div id="div1">
    <div  id="div2">
        <div  id="div3">
            very much content
        </div>
    </div>
</div>

#div1 {
    height:300px;
    overflow-y:scroll;
    border: 1px solid black;
}
#div2 {
    height:100%;
}
#div3 {
    height:600px;
}

div1 这里的高度是 300px 并且是滚动的。当您滚动内容时,您只需移动内部 div,但高度保持不变,即 300px。将 height:100% 设置为 html 时会发生完全相同的情况。您的浏览器高度保持不变。

当您缩小视口时,您并没有滚动,因此内部内容的高度小于视口的高度。

简而言之,html {height:100%} 与父母的高度有关,而不是与内部内容的高度有关


更新:

您可以为块元素的高度指定 3 种类型的值:

  • length - 设置固定高度(例如“200px”、“50em”)。仅此而已,对此我无话可说。

  • 百分比 - 来自W3C spec

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

  • auto - 高度取决于其他属性的值。 (一般在内部内容的高度上:文本、其他内联元素、块元素等)

当浏览器显示您的页面时发生了什么:

  1. 它为&lt;html&gt; 得到height: 100%。这意味着生成的高度是根据包含块(initial containing block,即browser window 在这种情况下)的生成框(在这种情况下为html-元素)的高度计算的。假设1024px
  2. 那么height: 100% 需要&lt;body&gt;。它会将body 的高度设置为html 的已计算高度,即1024px
  3. 然后浏览器将height:auto 应用到#wrapper,然后是#container&lt;p&gt;。我不知道它究竟是如何做到的,但可以假设它推迟了高度设置(以及分别依赖于该高度设置的所有其他样式,即背景、边框等)并继续处理内部内容。
  4. 下一点是文本内容。浏览器采用指定的或它自己的相关属性,即default styles,如字体系列、字体大小和文本高度。
  5. 之后,它会将高度设置为&lt;p&gt;-元素,因此&lt;p&gt; 将向下延伸以包含所有内容(在这种情况下为文本)。 #container#wrapper 也是如此。

如果碰巧#wrapper 的高度大于主体的高度(约定为1024 px),则应将overflow 应用于body。那是visible,这是默认设置。然后将overflow: visible 应用于html。然后浏览器显示整个window 的滚动。老实说,我不知道这是否由 W3C 规范指定,但可以假设是。

因此,当您滚动窗口时,您的 htmlbody 会像所有其他元素一样移动。这与任何其他元素的行为相同(就像我在上面发布的 jsfiddle 中一样):

请注意,背景是在body 元素上设置的,但它延伸到整个canvas,即远远超出body 元素本身。这是为了您担心在 body 上设置 bg-property 的可能必要性。这 100% 符合W3C spec 的规定(删减):

对于根元素是...“html”元素的文档,“背景颜色”的计算值为“透明”,“背景图像”的计算值为“无”,用户代理必须改为使用计算值为 canvas 绘制背景时,该元素的第一个 ... "body" 元素子元素的背景属性,并且不得为该子元素绘制背景。此类背景也必须锚定在与仅为根元素绘制时相同的位置。

当您缩小页面时,浏览器会重新计算所有尺寸。比方说,每点击一次Ctrl + -,页面就会缩小,例如缩小 20%。然后你所有的文字都被缩小了,因为它的高度取决于字体大小,它受Ctrl + -点击的影响,相应地&lt;p&gt;#container#wrapper都被缩小了,因为它们的高度取决于在text 的高度上。但是bodyhtml 的高度都取决于window 的高度,它不受Ctrl + - 点击的影响。这就是为什么你最终得到这个:

在这种情况下,宽度和高度行为没有区别。您看不到与水平尺寸相同的问题,仅仅是因为您为#container 设置了width: 960px;,结果证明它小于浏览器窗口的宽度,因此不会发生溢出。如果#container 的宽度超过主体的宽度,您会看到:

这都是正常的预期行为,这里没有什么需要解决的。

【讨论】:

  • 那么如何解决这个问题。如果我为 div#wrapper (在您的情况下为 div#3)提供背景颜色,则背景颜色(例如红色)仅延伸到 html 和 body 的相同高度(在您的情况下为 div#1 和 div#2)并且这会导致背景颜色不会延伸到整个高度,并且在缩小时只有一部分是红色的,而在底部的一些部分是白色/透明的(html 和正文的颜色)。
  • @Jawad,您可以将背景附加到您的内容的某些包装器中,因此它会相应地扩展。此外,您可能想要使用所谓的sticky footer,因此如果没有足够的内容(如您的第二张图片),页脚将位于窗口底部。看到这个stackoverflow.com/questions/11606856/…
  • 我对粘性页脚了如指掌。检查我的个人资料。我不是在问那个。我也不希望 html {height: 100%} 具有内部内容的高度。它与内部内容无关(在我的例子中是 div#container)。我希望 html、body 和 div#wrapper 的高度为 100%,因为它的宽度为 100%。如果它与父级的高度有关,则 div#wrapper 的父级是 body,body 的父级是 html,而 html 的父级是浏览器窗口/视口。给定包装器上的背景(红色)和 html 上设置的 100% 高度,body 和 div#wrapper 会导致此问题。
  • 您不需要在自己的答案中使用@。仅当您评论其他人的答案时。
  • html、body 和 div#wrapper 的高度都是 100%,因为它们的宽度是 100%。这里的问题是内容的高度大于窗口的高度。尝试设置#container {width: 6000px;},你会看到相同的,但现在是水平尺寸。如果您需要添加一些背景,则只能在这种情况下添加一些包装器,可以根据您的需要设置min-widthmin-height
【解决方案2】:

因为如果元素是相对于浏览器窗口的,则永远不能将高度设置为 100%。这样做的原因是由于滚动,您的浏览器窗口可能会无限大。你必须设置一个固定的高度,或者你只需​​要设置高度来扩展它里面的任何东西。

但是width: 100%; 完全有效。

您还需要使用有效的 html 标签。我要做的是,而不是使用 ,我会在你的 css 中创建一个类。类名以句点开头来声明。

.container{
width: 100%;
}

<div class="container"></div>

祝你好运,

-布赖恩

【讨论】:

  • 因为你在缩小的时候没有滚动,简单
  • @caligula:是的,很简单。用@给cmets。
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多