部分摘錄自阮一峯老師博客:
一張網頁的所有面積,就是它的大小。一般狀況下,網頁的大小由內容和CSS樣式表決定。
瀏覽器窗口的大小,則是指在瀏覽器窗口中看到的那部分網頁面積,又叫作viewport(視口)。
注意事項瀏覽器
const getViewport = () =>{ return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } }
若是網頁內容可以在瀏覽器窗口中所有顯示,不出現滾動條,那麼網頁的clientWidth和scrollWidth應該相等。可是實際上,不一樣瀏覽器有不一樣的處理,這兩個值未必相等。因此,咱們須要取它們之中較大的那個值
const getPageArea = () =>{ return { width: Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth), height: Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight) } }
指該元素的左上角相對於整張網頁左上角的座標。這個絕對位置要經過計算才能獲得。
不斷累加offsetParent的offsetTop和offsetLeft屬性函數
因爲在表格和iframe中,offsetParent對象未必等於父容器,因此上面的函數對於表格和iframe中的元素不適用。this
function getElementLeft(element){ var actualLeft = element.offsetLeft; var current = element.offsetParent; while (current !== null){ actualLeft += current.offsetLeft; current = current.offsetParent; } return actualLeft; } function getElementTop(element){ var actualTop = element.offsetTop; var current = element.offsetParent; while (current !== null){ actualTop += current.offsetTop; current = current.offsetParent; } return actualTop; }
利用getBoundingClientRect
方法code
此方法其中包含了left、right、top、bottom四個屬性,分別對應了該元素的左上角和右下角相對於瀏覽器窗口(viewport)左上角的距離.(其實也就是網頁元素的相對位置)對象
var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft; var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
網頁元素的相對位置,指該元素左上角相對於瀏覽器窗口左上角的座標。
有了絕對位置之後,得到相對位置就很容易了,只要將絕對座標減去頁面的滾動條滾動的距離就能夠了 也就是減去document.documentElement.scrollLeft|scrollTop
事件
//快捷方法 var X= this.getBoundingClientRect().left; var Y =this.getBoundingClientRect().top;
返回當前頁面的滾動位置。請使用pageXOffset和pageYOffset, 若是已定義,不然使用scrollLeft和scrollTop。你能夠省略el來使用窗口的默認值。pageXOffset是scrollY的別名(event.pageX是鼠標活動事件的屬性)element
const getScrollPosition = (el = window) =>{ return ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); } // getScrollPosition() -> {x: 0, y: 200}
const scrollToTop = () =>{ const distance = document.documentElement.scrollTop if(distance > 0){ window.requestAnimationFrame(scrollToTop) window.scrollTo(0, distance - distance/8) } }