javascript 精確獲取頁(yè)面元素的位置
//取得元素x坐標(biāo)
function pageX(elem) {
return elem.offsetParent?(elem.offsetLeft+pageX(elem.offsetParent)):elem.offsetLeft;
}
//取得元素y坐標(biāo)
function pageY(elem) {
return elem.offsetParent?(elem.offsetTop+pageY(elem.offsetParent)):elem.offsetTop;
}
貌似這位大神在出這本書時(shí)比較趕,有許多紕漏,最后大神也發(fā)覺這兩個(gè)函數(shù)有問題,并沒有把它們運(yùn)用到JQuery中。由于是用累加的方式去計(jì)算,只要一個(gè)元素出現(xiàn)問題,就有可能層層被大,因此我在精確獲取樣式屬性時(shí)就摒棄這種方法。主要誤算參照大神的結(jié)論:
Handling table border offsets.
Fixed positioned elements.
Scroll offsets within another element.
Borders of overflowed parent elements.
Miscalculation of absolutely positioned elements.

隨著新銳瀏覽器都支持IE的getBoundingClientRect方法,我們得以用更簡(jiǎn)單更快捷更安全的方法來定位頁(yè)面元素。getBoundingClientRect返回的是一個(gè)集合,分別為元素在瀏覽器可視區(qū)的四個(gè)角的坐標(biāo)。
不過它在IE的標(biāo)準(zhǔn)模式存在一個(gè)奇怪的問題,html元素是有border的,默認(rèn)是2px,并且是不可修改的;怪癖模式是沒有的。詳見http://msdn.microsoft.com/en-us/library/ms536433(VS.85).aspx
This method retrieves an object that exposes the left, top, right, and bottom coordinates of the union of rectangles relative to the client's upper-left corner. In Microsoft Internet Explorer 5, the window's upper-left is at 2,2 (pixels) with respect to the true client.
我們做一些測(cè)試(請(qǐng)分別在IE6與IE8中進(jìn)行):
1、標(biāo)準(zhǔn)模式,沒有重設(shè)html的border
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
2、標(biāo)準(zhǔn)模式,重設(shè)html的border
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
3、怪癖模式,沒有重設(shè)html的border
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
4、怪癖模式,重設(shè)html的border
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
John Resig給出的方案就是用clientTop,clientLeft作減值。以下函數(shù)就是從JQuery中摳出來,就后就用它獲取頁(yè)面元素的坐標(biāo),比offset大法安全多了。
var getCoords = function(el){
var box = el.getBoundingClientRect(),
doc = el.ownerDocument,
body = doc.body,
html = doc.documentElement,
clientTop = html.clientTop || body.clientTop || 0,
clientLeft = html.clientLeft || body.clientLeft || 0,
top = box.top + (self.pageYOffset || html.scrollTop || body.scrollTop ) - clientTop,
left = box.left + (self.pageXOffset || html.scrollLeft || body.scrollLeft) - clientLeft
return { 'top': top, 'left': left };
};
其中self.pageYOffset相當(dāng)于window.self.pageYOffset,是火狐的一個(gè)屬性,相當(dāng)于document.body.scrollTop。以下是它的定義:
Definition: The pageYOffset property is used to determine the Y coordinate of the scroll position in some browsers. This is not a reserved word so you can declare your own variable or function called pageYOffset but if you do then you will not be able to find or alter the scroll position of a window in some browsers
- JS實(shí)現(xiàn)固定在右下角可展開收縮DIV層的方法
- js固定DIV高度,超出部分自動(dòng)添加滾動(dòng)條的簡(jiǎn)單方法
- js 固定懸浮效果實(shí)現(xiàn)思路代碼
- js中的如何定位固定層的位置
- JS實(shí)現(xiàn)自動(dòng)固定頂部的懸浮菜單欄效果
- js實(shí)現(xiàn)簡(jiǎn)單的左右兩邊固定廣告效果實(shí)例
- js DIV滾動(dòng)條隨機(jī)位置的設(shè)置技巧
- js,jquery滾動(dòng)/跳轉(zhuǎn)頁(yè)面到指定位置的實(shí)現(xiàn)思路
- JS和JQUERY獲取頁(yè)面大小,滾動(dòng)條位置,元素位置(示例代碼)
- javascript 獲取頁(yè)面的高度及滾動(dòng)條的位置的代碼
- JS簡(jiǎn)單實(shí)現(xiàn)DIV相對(duì)于瀏覽器固定位置不變的方法
相關(guān)文章
基于JavaScript實(shí)現(xiàn)前端數(shù)據(jù)多條件篩選功能
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)前端數(shù)據(jù)多條件篩選功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09跨域請(qǐng)求兩種方法 jsonp和cors的實(shí)現(xiàn)
這篇文章主要介紹了跨域請(qǐng)求兩種方法 jsonp和cors的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11基于JavaScript實(shí)現(xiàn)新增內(nèi)容滾動(dòng)播放效果附完整代碼
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)新增內(nèi)容滾動(dòng)播放效果,效果非常棒,實(shí)現(xiàn)代碼簡(jiǎn)單易懂,需要的朋友可以參考下2017-08-08Javascript點(diǎn)擊其他任意地方隱藏關(guān)閉DIV實(shí)例
這篇文章主要分享一個(gè)Javascript點(diǎn)擊其他任意地方隱藏關(guān)閉DIV實(shí)例,需要的朋友可以參考下。2016-06-06JavaScript面試開發(fā)常用的知識(shí)點(diǎn)總結(jié)
這篇文章主要為大家詳細(xì)總結(jié)了JavaScript面試開發(fā)常用的知識(shí)點(diǎn),感興趣的小伙伴們可以參考一下2016-08-08Bootstrap實(shí)現(xiàn)基于carousel.js框架的輪播圖效果
這篇文章主要為大家詳細(xì)介紹了Bootstrap實(shí)現(xiàn)基于carousel.js框架的輪播圖效果,無過渡動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05