JS常用API手冊7-定位

oDiv.clientWidth, oDiv.clientHeight

兼容性:全兼容
內容區域的寬度、高度,不包括邊框[裸的寬度和高度]
content_width+padding_left+padding_right, content_height+padding_top+padding_bottom
注:

  • 返回的寬度和高度[此值比較準確, CSS中給定值后才有效]
  • 返回的是屏幕上可以看到的大小,有滾動條比實際值小

oDiv.scrollWidth, oDiv.scrollHeight

兼容性:IE8+,Opera11+
返回的是實際的寬度和高度[包括隱藏的部分]
滾動的高度+可視區域的高度
注:

  • 沒有隱藏部分,等價于clientWidth, clientHeight
  • 有滾動條時,scrollHeight = scrollTop + clientHeight

oDiv.offsetWidth, oDiv.offsetHeight

兼容性:全兼容
所占實際的大小(不受內部子元素大小的影響,只和本身元素大小的設定有關)
width + padding + border
悟:可以計算滾動條的寬度offsetWidth - border*2 - clientWidth

# 獲取滾動條的寬度
function getScrollbarWidth(){
    var el = document.createElement('p');
    styles = {
        width:'100px',
        height:'100px',
        overflowY:'scroll'
    };
    for(var i in styles){
        el.style[i] = styles[i];
    }
    document.body.appendChild(el);
    var scrollbarWidth = el.offsetWidth - el.clientWidth;
    el.remove();
    return scrollbarWidth;
}

窗口視口的大小

獲取window窗體的內部寬度,不包括用戶界面元素,比如窗框
W3C:window.innerWidth, window.innerHeight[IE9+][只讀]
注:不包括地址欄等,只是顯示內容的視口的高度

可視區域的高度

window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight

clientWidth/clientHeight

[不包括滾動條][在頁面中所占的寬度除去滾動條的寬度]
包括padding+content

# IE
document.documentElement.clientWidth
document.documentElement.clientHeight

# IE7之前的版本
document.body.clientWidth,document.body.clientHeight

oDiv.clientLeft/oDiv.clientTop

兼容性:全兼容
左邊框的寬度,上邊框的寬度
注:只能是左邊和上邊的寬度
內容區域相對于元素左上角的位置,即border_left_width, border_top_width

oDiv.offsetLeft/oDiv.offsetTop

兼容性:全兼容

  • 表示相對于最近的祖先定位元素(CSS position 屬性被設置為 relative、absolute 或 fixed 的元素)的左右偏移值
  • position不是static的元素
    說明:
  1. 返回距離父元素左邊和高度的距離
  2. 必須設置了定位才能計算[即offsetParent]
  3. 包括margin + 父元素的padding + 父元素的borderWidth[完全屬于自己的部分距離完全屬于父元素的部分]
    注:offsetParent取最近的那個父級元素
  • 在IE6/7中
    offsetLeft = (offsetParent的padding-left) + (當前元素的margin-left)
  • 在IE8/9/10及Chrome中
    X offsetLeft = (offsetParent的margin-left) + (offsetParent的border寬度) + (offsetParent的padding-left) + (當前元素的margin-left)X就是距離offsetParent邊框的 距離

oDiv.scrollLeft/oDiv.scrollTop

兼容性:[全兼容][可讀可寫]
釋義:當元素其中的內容超出其寬高的時候,元素被卷起的高度和寬度[指的是擁有滾動條的元素而非子元素]
注:有滾動條的元素的滾動距離
eg: outer, inner,只有outer的這個屬性才有意義

jQuery部分

.position()
相對于offsetParent的當前坐標值

{
    left:相對于offsetParent元素左側的距離,
    top :相對于offsetParent元素頂部的距離
}

.scrollLeft() || .scrollTop()

釋義1:相對于水平滾動條左邊的距離,滾動條居左或元素不能滾動,值為0
釋義2:相對于垂直滾動條頂部的距離,滾動條居頂或元素不能滾動,值為0

clientX, clientY

兼容性:全兼容
釋義:相對于瀏覽器(可視區域左上角0,0)的坐標
返回發生時鼠標在視口中的坐標
鼠標相對于window的偏移
IOS上=pageX,pageY

ayerX, layerY/offsetX, offsetY

兼容性:很糟糕
返回發生時鼠標相對于目標對象的坐標
Opera支持addEventListener,但不支持layerX, layerY
bug解釋:
在IE7以及以下瀏覽器下,只有當當前目標元素為offsetParent是才計算坐標值,否則,它就會拿當前目標元素的offsetParent來計算。還有,當發現元素應用了position: relative后,IE會去尋找下一個offsetParent來計算offsetY,但又不是offsetX。是的,讀兩次,很蛋疼吧!

pageX/pageY(W3C)

兼容性:IE9+
返回的是相對于頁面的坐標
鼠標相對于document的坐標

# 拖動實例思路
# 元素必須有定位屬性
mousedown

#記錄元素左上角位置
var startLeft = layerX/offsetX
var startTop = layerY/offsetY
# mousemove
# mouseup

注:

  • 可能會出現禁止光標,可以禁止默認事件
  • 拖動的情況比較復雜,建議用第三方腳本

跳轉到可見區域內

$("#logo_bbc")[0].scrollIntoView();
window.scrollTo(0, 0);

pageXOffset,pageYOffset

兼容性:IE9+
表示整個頁面滾動的像素值(水平方向的和垂直方向的)

window.pageXOffset
window.pageYOffset

CSS-位置

  • element.offsetParent 返回元素的偏移容器[元素的第一個祖先定位元素,用來計算offsetLeft,offsetTop(不一定與parentNode相等)]。
    注:在IE和Opera瀏覽器下,position: fixed的元素沒有offsetParent
  • element.offsetLeft 返回元素的水平偏移位置。
  • element.offsetTop 返回元素的垂直偏移位置。
  • element.scrollTop 返回元素上邊緣與視圖之間的距離。[元素被隱藏的上方的距離]
  • element.scrollLeft 返回元素左邊緣與視圖之間的距離。
  • document.documentElement.scrollTop 垂直方向滾動的值

CSS-尺寸

  • element.scrollWidth 返回元素的實際寬度。[元素內容 + 內邊距(包括滾動條)]
  • element.scrollHeight 返回元素的實際高度。
document.body.scrollWidth   document.body.scrollHeight
//給定寬高小于瀏覽器窗口
scrollWidth和scrollHeight通常是此瀏覽器窗口的寬高

//給定寬高大于瀏覽器窗口,且子元素小于給定寬高
寬高為設定的寬高+padding*2+border*2

//給定寬高大于瀏覽器窗口,且內容大于給定寬高
寬高為子元素的寬高 +body的padding[1個]+margin[1個]+border[1個]

//[無滾動軸時]
scrollWidth = clientWidth = style.width + style.padding * 2

//[有滾動軸時]
scrollWidth = 實際內容的寬度 + padding * 2
scrollHeight = 實際內容的高度 + padding * 2
  • element.clientWidth 返回元素的可見寬度。[元素內容 + 內邊距(不包括滾動條)]
  • element.clientHeight 返回元素的可見高度。
  • element.offsetHeight 返回元素的高度。[元素內容 + 內邊距 + 邊框(不包括外邊距)]
  • element.offsetWidth 返回元素的寬度。
  • element.innerWidth 返回元素內部的寬高,包括padding,不包括border
  • element.outerWidth 返回元素集合中第1個元素當前計算寬高度值,包括padding,border,選擇性的margin
    window.outerWidth表示整個瀏覽器窗體的大小,包括任務欄等[IE9+]
  • element.outerHeight
    window.outerHeight表示整個瀏覽器窗體的大小,包括地址欄,收藏欄,標簽欄,任務欄等[IE9+]

jQuery相關部分

.width() || .height()
只包含content的凈寬高,不包括margin,border,padding

.width()與.css('width')區別
.width()返回結果無單位
.css('width')的結果有單位

.innerWidth() || .innerHeight()
釋義:content + padding

.outerWidth() || .outerHeight()
釋義:content + padding + border

.outerWidth(true) || .outerHeight(true)
釋義:content + padding + border + margin

getBoundingClientRect

返回一個對象,包含top,left,right,bottom,width,height

  • width、height 元素自身寬高
  • top 元素上外邊界距窗口最上面的距離
  • right 元素右外邊界距窗口最上面的距離
  • bottom 元素下外邊界距窗口最上面的距離
  • left 元素左外邊界距窗口最上面的距離
  • width 元素自身寬(包含border,padding)
  • height 元素自身高(包含border,padding)

通常認為 <html> 元素是在 Web 瀏覽器的視口中滾動的元素(IE6 之前版本運行在混雜模式下時是 <body> 元素)因此,帶有垂直滾動條的頁面總高度就是 document.documentElement.scrollHeight

// 在沒有滾動條的情況下,元素內容的總高度
scrollHeight

// 在沒有滾動條的情況下,元素內容的總寬度
scrollWidth

// 被隱藏在內容區域左側的像素數。通過設置這個屬性可以改變元素的滾動位置
scrollLeft

// 被隱藏在內容區域上方的像素數。通過設置這個屬性可以改變元素的滾動位置
scrollTop
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,780評論 1 92
  • Window和document對象的區別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,230評論 0 5
  • 本文是針對剛學編程的小白,都是一些基礎知識,如果想了解更多深層一點的東西,歡迎移步本人博客!! 博客地址 點擊跳轉...
    西巴擼閱讀 590評論 0 2
  • 原文鏈接 http://blog.poetries.top/2016/12/13/js-props聲明:本文根據慕...
    前端進階之旅閱讀 3,312評論 1 44
  • 這幾天都在做時間調整,計劃11點睡覺,但一直都沒有做到。白天感到忙忙碌碌,但效率低下。為了更好掌控自己的時間,計劃...
    小鴉說事閱讀 230評論 0 0