window的大小和滚动
2025年1月10日大约 2 分钟
窗口的宽高
documentELement.clientWidth:获取窗口可视区域宽度(不包括滚动条)documentElement.clientHeight:获取窗口可视区域高度(不包括滚动条)window.innerWidth:获取窗口可视区域宽度(包括滚动条)window.innerHeight:获取窗口可视区域高度(包括滚动条)
为了可靠的获取完整的最大高度,应该去下面这些属性的最大值,以避免过于老旧浏览器的兼容问题
let scrollHeight = Math.max(
  document.body.scrollHeight, document.documentElement.scrollHeight,
  document.body.offsetHeight, document.documentElement.offsetHeight,
  document.body.clientHeight, document.documentElement.clientHeight
)
console.log('Full document height, with scrolled out part: ' + scrollHeight);获取当前滚动
window.scrollX、window.scrollY用来获取滚动偏移量
window.pageXOffset、window.scrollYOffset分别是前两个的别名
console.log(window.scrollX, window.pageXOffset)
console.log(window.scrollY, window.pageYOffset)滚动方法
scrollBy(x,y)
将页面滚动至 相对于当前位置的
(x, y)位置,例如,scrollBy(0,10)会将页面向下滚动10px。
window.scrollBy(0, 10)scrollTo(pageX,pageY)
将页面滚动至 绝对坐标,使得可见部分的左上角具有相对于文档左上角的坐标
(pageX, pageY)。就像设置了scrollLeft/scrollTop一样,要滚动到最开始,我们可以使用scrollTo(0,0)
window.scrollTo(pageX, pageY)scrollIntoView(top)
对
elem.scrollIntoView(top)的调用将滚动页面以使elem可见
- 如果 
top=true(默认值),页面滚动,使elem出现在窗口顶部。元素的上边缘将与窗口顶部对齐。 - 如果 
top=false,页面滚动,使elem出现在窗口底部。元素的底部边缘将与窗口底部对齐 
<button onclick="this.scrollIntoView()">this.scrollIntoView()</button>
<button onclick="this.scrollIntoView(false)">this.scrollIntoView(false)</button>禁止/恢复 滚动
- 可以使用相同的技术来冻结其他元素的滚动,而不仅仅是 
document.body - 缺点是会使滚动条消失。如果滚动条占用了一些空间,它原本占用的空间就会空出来,那么内容就会“跳”进去以填充它 
- 可以在 
document.body中滚动条原来的位置处通过添加padding,来替代滚动条,这样这个问题就解决了。保持了滚动条冻结前后文档内容宽度相同 
 - 可以在 
 
// 禁止滚动
document.body.style.overflow = 'hidden'
// 恢复滚动
document.body.style.overflow = ''elementFromPoint(x, y)
返回在窗口坐标
(x, y)处嵌套最多的元素
- 只对在可见区域内的坐标 
(x,y)起作用,对于在窗口之外的坐标,elementFromPoint返回null 
let elem = document.elementFromPoint(x, y)
// 例:高亮显示并输出现在位于窗口中间的元素的标签
let centerX = document.documentElement.clientWidth / 2;
let centerY = document.documentElement.clientHeight / 2;
let elem = document.elementFromPoint(centerX, centerY);
elem.style.background = "red";
alert(elem.tagName);注意
- 可以通过更改 
scrollTop/scrollLeft来滚动常规元素,可以使用document.documentElement.scrollTop/scrollLeft对页面进行相同的操作( Safari 除外,而应该使用document.body.scrollTop/Left代替 )