我看了一些网上的文章,他们说html标签代表浏览器窗口,所以html等于浏览器窗口大小。如果正文大小大于 html 大小,则将显示滚动条。所以它是控制是否显示滚动条的html元素。
这确实是非常错误的。¹
CSS 2.1 规范第 9.1.1 节所说的是
当视口小于呈现文档的画布区域时,用户代理应该提供滚动机制。
然而,这似乎也不完全正确,因为通常不提供滚动来将视口移动到具有负 x 或负 y 值的画布区域上,即使内容是在那里绘制的。
我能确定的最好的是滚动条可用于将视口移动到画布区域上,这些区域具有 0 或正 x 和 y 坐标的渲染框。
不管怎样,html元素框的大小和body元素框的大小都不是特别的。它们只是在画布上呈现的框,与其他元素相同。由于溢出或绝对定位,其他元素可能会呈现在这些框之外,并且滚动机制将考虑这些元素的完整大小。
一个例子和图表可能有助于理解。考虑这个例子:
<!DOCTYPE html>
<html>
<head>
<title>Scroll limits</title>
<style>
html { padding:20px; border:1px green solid; height:80px; }
body { margin:0; border:1px black solid; height:150px; }
#div1 { position:absolute; top:-50px; height:65px; left:-50px;
width: 65px; background-color:blue; }
#div2 { position:absolute; top:200px; height:65px; left: 110%;
width: 65px; background-color:yellow; }
</style>
</head>
<body>
body
<div id="div1">div 1</div>
<div id="div2">div 2</div>
</body>
</html>
提琴手
结果是:
¹ 网上的文章大概和问题中的图片肯定来自http://phrogz.net/css/htmlvsbody.html。需要注意的是,那篇文章写于 2004 年。在 2004 年,当时的 CSS 2.1 草案所说的内容并不重要。重要的是 IE6 做了什么,这篇文章确实描述了 IE6 做了什么。