滚动条距离与高度、兼容模式、可视尺寸

409 阅读1分钟

查看滚动条的距离

常规:window.pageXOffset/pageYOffset(IE9某些版本,IE8以下不支持) IE9、IE8及以下: document.body.scrollLeft/document.body.scrollTop

滚动条兼容性.png

对获取滚动条距离兼容性函数封装

function getScrollOffset() {
  if(window.pageXOffset) {
    return {
      left: window.pageXOffset,
      top: window.pageYOffset
    }
  }else {
    return {
      left: document.body.scrollLeft + document.documentElement.scrollLeft,
      top: document.body.scrollTop + document.documentElement.scrollTop 
    }
  }
}

浏览器的怪异模式和标准模式

怪异模式: BackCompat 标准模式:CSS1Compat

浏览器窗口的可视区域尺寸(不包括浏览器自己的UI栏)

常规:window.innerWidth/innerHeight

IE9/IE8及以下:

标准模式:document.documentElement.clientWidth/clientHeight

怪异模式:document.body.clientWidth/clientHeight

封装获取浏览器可视窗口尺寸函数

    function getViewportSize() {
      if(window.innerWidth) {
        return {
          width: window.innerWidth,
          height: window.innerHeight
        }
      }else {
        if(document.compatMode === 'BackCompat') {
          return {
            width: document.body.clientWidth,
            height: document.body.clientHeight
          }
        }else {
          return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight
          }
        }
      }
    }

outerWidth/outerHeight了解一下就行 getBoundingClientRect()可以获取元素的尺寸及坐标等信息,但是不实时,而且计算width和height是包括了padding值的

元素位置

offsetTop/offsetLeft(计算出来的值与父级是否定位有关,而且包含自己margin,padding,而且跟有没有设置top和left值没半毛钱关系,也就是说自身不一定要设置定位)

offsetParent返回一个有定位的父级元素

//获取元素距离最外层元素html的左边沿和上边沿的距离的函数封装
function getElementDocPosition(el) {
  var parent = el.offsetParent,
      offsetLeft = el.offsetLeft,
      offsetTop = el.offsetTop;
  while(parent) {
    offsetLeft += parent.offsetLeft;
    offsetTop += parent.offsetTop;
    parent = parent.offsetParent;
  }

  return {
    left: offsetLeft,
    top: offsetTop
  }
}

window.scroll/window.scrollTo, window.scrollBy(每次会在原基础上继续滚动距离,可以为负数)