从第一天开始,这对我来说一直是个谜。它仍然是。现在是揭示它的时候了。所以我创建了一个test page,其中包含div
,您可以更改这些范围。以及显示相关属性值的信息面板。为简单起见,我们只需使用Chrome。
默认body
页边距为8px
。 html
的背景为蓝色,body
为绿色,div
为红色。在这里,我们可以看到html
的{{1}}等于offsetHeight
,就像它只是包围body.offsetHeight + 2 * body.margin
一样。但是body
== html.clientHeight
,好像它被拉伸以填充视口。
现在让我们添加水平滚动条(使window.innerHeight
的宽度为div
),并向右滚动一点:
1000px
和html
向左移动。 body
的{{1}}更改与body
同步,就好像它拥有滚动条一样。由于添加了滚动条,scrollLeft
的{{1}}发生了变化。
让我们反过来做(垂直滚动条):
现在两个window.pageXOffset
的范围都已更改(html
和clientHeight
)。这表明它不拥有滚动条。
最后,使用两个滚动条:
嗯,此时事情对我来说或多或少clear。至少只要我们只考虑Chrome。但是还有一些我想知道的事情。
为什么html
的{{1}}可能会少于offsetWidth
?有没有更好的解释而不是“就是这样”?
为什么clientWidth
的{{1}} / html
会在滚动页面时发生变化?它不拥有滚动条,是吗?
此外还会有一些摘要。
答案 0 :(得分:2)
因此,在视口(窗口)中显示了一个画布。在画布上,我们有clientHeight
元素,其中包含offsetHeight
。他们大多像body
,但有一些怪癖:
默认情况下,沿着X轴scrollLeft
元素(scrollTop
)伸展以适合视口。可能不是怪癖。视口是html
的容器。而作为一个普通的body
,它默认适合容器宽度(不包括滚动条)。
div
的高度与适合html
元素一样大。但由于某种原因,它的width: auto
等于视口高度减去滚动条。就像它伸展以适应沿Y轴的视口一样。
html
的{{1}} / div
属性镜像视口的html
/ body
clientHeight
的上边距不会因body
的
scrollLeft
没有显示拉伸到视口底边的迹象,除非您有例如设置了scrollTop
属性的绝对定位元素。从pageXOffset
值判断,pageYOffset
作为一个元素,相对于默认情况下呈现绝对定位的元素(除非层次结构中有其他绝对定位的元素)
使用Firefox,区别在于body
的{{1}} / html
属性镜像了视口的body
/ bottom
。
这一切只是我对所看到的内容的解释。如果有人要纠正我,或者加上我的发现,我会很高兴。