7

如果我有以下标记

<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 用于 html、body、wrapper)和(960px X 880px 用于容器)

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

(4267px X 1860px 用于 html、body、wrapper) - (960px X 1000px 用于容器)

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

30

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 种类型的值:

  • 长度- 设置固定高度(ig '200px', '50em')。仅此而已,对此我无话可说。

  • 百分比- 来自W3C 规范

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

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

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

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

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

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

滚动身体的一部分

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

对于根元素是...“html”元素的文档,其“背景颜色”的计算值为“透明”,“背景图像”的计算值为“无”,用户代理必须改为使用背景的计算值为canvas绘制背景时,该元素的第一个 ...“body”元素子元素的属性,并且不得为该子元素绘制背景。这样的背景也必须锚定在同一点,就像它们只为根元素绘制时一样。

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

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

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

于 2012-08-16T22:07:08.157 回答
1

因为如果元素相对于浏览器窗口,您永远无法将高度设置为 100%。这样做的原因是由于滚动,您的浏览器窗口可能会无限大。您必须设置一个固定的高度,或者您只需设置高度以扩展到其中的任何内容。

然而width: 100%;是完全有效的。

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

.container{
width: 100%;
}

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

祝你好运,

-布赖恩

于 2012-08-16T21:07:39.967 回答