滚动距离

pageXoffset/pageYoffset

image.png :::info 获取页面滚动的距离
📌 这是常规的方式,但是IE8及以下版本浏览器不支持! :::

  1. window.pageXoffset
  2. window.pageYoffset

scrollLeft/scrollTop

image.png :::info 获取页面滚动的距离,该属性有两种方式访问分别是document.bodydocument.documentElement
document.documentElement.scrollLeftIE8「标准模式」下支持
document.body.scrollLeftIE8「怪异模式」下支持 :::

  1. document.documentElement.scrollLeft
  2. document.documentElement.scrollTop
  3. document.body.scrollLeft
  4. document.body.scrollTop

以下是兼容模式的写法🌴 :

  1. function getScrollOffset() {
  2. if (window.pageXOffset) {
  3. return {
  4. left: window.pageXOffset,
  5. top: window.pageYOffset,
  6. };
  7. } else {
  8. // 兼容IE8
  9. return {
  10. left: document.body.scrollLeft || document.documentElement.scrollLeft,
  11. top: document.body.scrollTop || document.documentElement.scrollTop,
  12. };
  13. }
  14. }
  15. console.log(getScrollOffset());

操作滚动条

操作滚动条的方式有三种:window.scroll(x, y);window.scrollTo(x, y);window.scrollBy(x, y);
**X****Y**这两个参数在前两个方法中表示要滚动到的坐标,在最后一个方法中表示滚动的距离。
window.scrollBy(x, y);该方法的距离是累加的,每次滚动会在已滚动的距离上加上需要设置的滚动距离

  1. window.scroll(100, 100);
  2. window.scrollTo(100, 100);
  3. window.scrollBy(100, 100);

这几个方法也都接收一个ScrollToOptions字典,除了提供偏移值,还可以通过behavior属性告诉浏览器是否平滑滚动。

  1. // 正常滚动
  2. window.scrollTo({
  3. left: 100,
  4. top: 100,
  5. behavior: 'auto'
  6. });
  7. // 平滑滚动
  8. window.scrollTo({
  9. left: 100,
  10. top: 100,
  11. behavior: 'smooth'
  12. });

文档尺寸

scrollHeight/scrollWidthimage.png

:::info 该属性获取文档全部全部的高度/宽度
同样也要兼容IE8「标准模式」和「怪异模式」 :::

  1. console.log(document.documentElement.scrollWidth || document.body.scrollWidth);

可视窗口尺寸

innerHeight/innerWidth

image.png :::info 获取客户端的视口尺寸(红色表示浏览器)
📌 这是常规的方式,但是IE8及以下版本浏览器不支持! :::

  1. window.innerHeight
  2. window.innerWidth

类似的window对象还有outerWidth/outerHeight,这一对属性计算的范围比innerHeight/innerWidth多计算了侧边栏、工具栏等宽度/高度。

clientWidth/clientHeight

image.png :::info 获取客户端的视口尺寸,该属性有两种方式访问分别是document.bodydocument.documentElement
document.documentElement.clientHeightIE8「标准模式」下支持
document.body.clientHeightIE8「怪异模式」下支持 :::

  1. document.documentELement.clientWidth
  2. document.documentELement.clientHeight
  3. document.body.clientWidth
  4. document.body.clientHeight

以下是兼容模式的写法🌴 :

  1. function getViewPortSize() {
  2. if (window.innerWidth) {
  3. return {
  4. width: window.innerWidth,
  5. heigth: window.innerHeight,
  6. };
  7. } else {
  8. return {
  9. width: document.body.clientWidth || document.documentElement.clientWidth,
  10. height: document.body.clientHeight || document.documentElement.clientHeight,
  11. }
  12. }
  13. }
  14. console.log(getViewPortSize())

偏移尺寸

offsetLeft/offsetTop

image.png :::info 获取元素距离有「定位」父级元素或者body的距离。
注意该属性只要找到有「定位」父级元素就会返回距离,如果没有「定位」父级元素则会一直找到body :::

  1. var box = document.getElementsByClassName("box")[0];
  2. box.offsetTop
  3. box.offsetLeft

获取定位的父级 offsetParent

:::info 获取元素带有「定位」的父级元素,如果找不到则一直寻找到body返回 :::

  1. var box = document.getElementsByClassName("box")[0];
  2. box.offsetParent

🌴 封装方法,不管有没有父级定位元素,都要找到距离body的距离:

  1. function getElemDocPostion(el) {
  2. var parent = el.offsetParent;
  3. var offsetLeft = el.offsetLeft;
  4. var offsetTop = el.offsetTop;
  5. while (parent) {
  6. offsetLeft += parent.offsetLeft;
  7. offsetTop += parent.offsetTop;
  8. parent = parent.offsetParent;
  9. }
  10. return {
  11. left: offsetLeft,
  12. top: offsetTop,
  13. };
  14. }
  15. console.log(getElemDocPostion(box))