元素和鼠標事件的距離屬性

js中有很多“距離”,為了不會混淆這里總結(jié)一下其中部分距離

本文包括元素屬性相關(guān)的距離和鼠標事件中的距離厕九,廢話不多說革屠,進入正文

先補充一下镊讼,本文的測試環(huán)境如下:

Chrome Dev 54.0.2840.71
Firefox 49.0
Opera 41.0
Safari 10.1
IE 11题翻。

前四者運行在macOS Sierra 10.12上揩徊,IE11運行在搭載windows10 1607的虛擬機上

元素屬性中的各種“距離”

元素屬性中的距離有以下6對:

scrollLeft: 設(shè)置或獲取位于對象左邊界和窗口中可見內(nèi)容的最左端之間的距離
scrollTop: 設(shè)置或獲取位于對象最頂端和窗口中可見內(nèi)容的最頂端之間的距離

offsetHeight: 獲得對象的可視區(qū)域的高度,包括邊框
offsetWidth: 獲得對象的可視區(qū)域的寬度嵌赠,包括邊框

clientHeight: 獲得對象邊框內(nèi)部分的高度
clientWidth: 獲得對象邊框內(nèi)部分的寬度

offsetLeft: 獲取對象相對于版面或由offsetParent屬性指定的父坐標的計算左側(cè)位置
offsetTop: 獲取對象相對于版面或由offsetTop屬性指定的父坐標的計算頂端位置

clientTop: 獲取對象頂部邊框?qū)挾?br> clientLeft: 獲取對象左側(cè)邊框?qū)挾?/p>

scrollWidth: 獲取對象的滾動寬度
scrollHeight: 獲取對象的滾動高度靴拱。

上面提到了offsetParent屬性,其實當前div相對誰定位猾普,這個屬性就是誰。根據(jù)position值不同本谜,有以下2種情況

  • 當父輩元素都沒有relative屬性時初家,無論當前元素的position是absolute,relative,fixed或fixed溜在,offsetParent都是body元素

  • 父輩元素有relative屬性時陌知,無論當前元素的position是absolute,relative掖肋,fixed或fixed仆葡,offsetParent是具有relative屬性的最近父元素

分不清楚? 看下圖

盒子相關(guān)的距離

這個里面可以清晰的看到上方的前4對志笼,和他們之間的關(guān)系沿盅。

關(guān)于jQuery的元素距離屬性,文章最后整理了他們和DOM屬性之間的關(guān)系纫溃。

第一個值得強調(diào)的是腰涧,上面的這個例子中的div的box-sizing屬性是默認的content-box, 它的offsetHeight,clientHeight紊浩,clientWidth和offsetWidth有如下關(guān)系:

clientHeight = height + paddingTopWidth + paddingBottomWidth;
clientWidth = width + paddingLeftWidth + paddingRightWidth;

offsetHeight = clientHeight + borderTopWidth + borderBottomWidth;
offsetWidth = clientWidth + borderLeftWidth + borderRightWidth;

如果box-sizing屬性是border-box,那么窖铡,它們的關(guān)系將如下(ie6 ie7默認是這樣的):

offsetHeight = height;
offsetWidth = width;

clientHeight = height - borderTopWidth - borderBottomWidth;
clientWidth = width - borderLeftWidth - borderRightWidth;

第二個值得強調(diào)的是,這個例子中坊谁,由于它的父元素沒有設(shè)置position:relative费彼,所以圖中這個div利用position:absolute;相對文檔定位,如果給他添加一個具有position:relative屬性的父div口芍,那么offsetLeft和offsetTop就是下圖這樣:

相對距離

不過無論它怎么的定位箍铲,哪怕是position:relative或fixed,它的計算關(guān)系也不會發(fā)生變化阶界,依然是:

offsetLeft = left + marginLeft;
offsetTop = top + marginTop;

講了這么多虹钮,那么scrollWidth和scrollHeight呢?scrollWidth和scrollHeight在不同瀏覽器里面并不一致膘融,如下圖(從左到右依次是Chrome, Firefox, Opera, Safari, IE11)

屬性值兼容性對比

其實仔細研究這個里面的不同芙粱,會發(fā)現(xiàn)在不同的瀏覽器div的offsetLeft、offsetTop這兩個值的屬性并不完全相同氧映。當div里面的內(nèi)容溢出時春畔,只有IE保留了padding的全部值,chrome岛都、opera和safari會忽略padding-right的值視其為0律姨,firefox會同時忽略padding-right和padding-bottom,如下圖

效果對比

在各個瀏覽器中臼疫,對于滾動條本身的渲染也不一樣择份。它們會在計算scrollWidth和scrollHeight時排除各自的滾動條寬度。除了上述的不同烫堤,實際發(fā)現(xiàn)每個瀏覽器中scrollLeft和scrollTop的最大值也不一樣荣赶,甚至差距極大凤价,由于scrollLeft和scrollTop隨滾動事件發(fā)生而輸出,博主就上述例子的最大值記錄如下:

maximum value chrome Firefox opera safari IE11
scrollLeft 330 160 827 330 217
scrollTop 230 210 485 230 330

實際上就是由于這些元素屬性在不同瀏覽器中的差異導(dǎo)致scrollWidth和scrollHeight的不同拔创,具體使用應(yīng)格外注意利诺。不過博主看過一些資料表示這兩個屬性和offsetParent有關(guān),通過實際編程發(fā)現(xiàn)它們和offsetParent無關(guān)剩燥,這里不展開描述了慢逾,因為低版本瀏覽器,尤其ie7 ie6的實現(xiàn)方式可能會比較奇葩灭红。

鼠標事件中的各種“距離”

鼠標事件很多侣滩,不過每個事件中關(guān)于距離的屬性含義是一樣的,這里用mousemove來講解比伏,具體的內(nèi)容會在不久之后寫到了js事件部分講解胜卤。
鼠標實現(xiàn)對于現(xiàn)在的瀏覽器來說,實現(xiàn)都是一樣的了赁项,下面例子都在Chorme中實現(xiàn)葛躏。

鼠標事件有以下6對:

event.clientX:相對瀏覽器左上角的水平坐標
event.clientY:相對瀏覽器左上角的垂直坐標

event.offsetX:相對于事件源(event.target||event.srcElement)左上角水平偏移
event.offsetY:相對于事件源(event.target||event.srcElement)左上角垂直偏移

event.pageX:相對于document左上角的水平坐標
event.pageY:相對于document左上角的垂直坐標

event.layerX:相對于offsetParent左上角的水平偏移
event.layerY:相對于offsetParent左上角的水平偏移

event.movementX:相對于前一次事件中screenX的偏移
event.movementY:相對于前一次事件中screenY的偏移

event.screenX:相對于屏幕左上角的水平坐標
event.screenY:相對于屏幕左上角的垂直坐標

x:和pageX一樣,用于兼容IE8及以前瀏覽器
y:和pageY一樣悠菜,用于兼容IE8及以前瀏覽器

總之舰攒,還是先看圖

鼠標事件中的距離

<small>*這個圖中,黑色實線邊框表示瀏覽器可視區(qū)域部分悔醋,外層藍色虛線框表示整個DOM部分,整個圖為電腦屏幕</small>

圖里面怎么沒有movementX和movementY?因為這個事件的值和上一個事件有關(guān)摩窃,關(guān)系如下:

currentEvent.movementX = currentEvent.screenX - previousEvent.screenX
currentEvent.movementY = currentEvent.screenY - previousEvent.screenY

值得注意的時offsetX和offsetY,他表示鼠標到事件源padding左上角的的偏移芬骄,這里mousemove事件注冊在window上猾愿,所以位置如圖所示。

當瀏覽器的水平滾動條滑動以后账阻,pageX和clientX就不同了蒂秘。同理,當瀏覽器的垂直滾動條滑動以后淘太,pageY和clientY就不同了,但它們始終存在以下關(guān)系:

event.pageX = event.clientX + body.scrollLeft;
event.pageY = event.clientY + body.scrollTop;

鼠標事件中的距離比元素中的簡單一些姻僧,具體的使用放在之后寫的事件部分。

jQuery中元素距離屬性

var $div = $("#div");

$div.width(); //元素寬度蒲牧,不包括padding和border
$div.height(); //元素高度撇贺,不包括padding和border

$div.innerWidth(); //元素內(nèi)寬度,包括padding冰抢,不包括border
$div.innerHeight(); //元素內(nèi)高度松嘶,包括padding,不包括border

$div.outerWidth(); //元素可見寬度挎扰,包括padding和border
$div.outerHeight(); //元素可見高度翠订,包括padding和border

$div.outerWidth(true); //元素全部寬度缓升,包括padding、border和margin
$div.outerHeight(true); //元素全部高度蕴轨,包括padding、border和margin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骇吭,一起剝皮案震驚了整個濱河市橙弱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燥狰,老刑警劉巖棘脐,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異龙致,居然都是意外死亡蛀缝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門目代,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈梁,“玉大人,你說我怎么就攤上這事榛了≡谘龋” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵霜大,是天一觀的道長构哺。 經(jīng)常有香客問我,道長战坤,這世上最難降的妖魔是什么曙强? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮途茫,結(jié)果婚禮上碟嘴,老公的妹妹穿的比我還像新娘。我一直安慰自己慈省,他們只是感情好臀防,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著边败,像睡著了一般袱衷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笑窜,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天致燥,我揣著相機與錄音,去河邊找鬼排截。 笑死嫌蚤,一個胖子當著我的面吹牛辐益,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脱吱,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼智政,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箱蝠?” 一聲冷哼從身側(cè)響起续捂,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宦搬,沒想到半個月后牙瓢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡间校,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年矾克,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憔足。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡胁附,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出四瘫,到底是詐尸還是另有隱情汉嗽,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布找蜜,位于F島的核電站饼暑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洗做。R本人自食惡果不足惜弓叛,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诚纸。 院中可真熱鬧撰筷,春花似錦、人聲如沸畦徘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽井辆。三九已至关筒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杯缺,已是汗流浹背蒸播。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袍榆。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓胀屿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親包雀。 傳聞我的和親對象是個殘疾皇子宿崭,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 13,761評論 1 92
  • Window和document對象的區(qū)別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,211評論 0 5
  • web下的高度、位置 屏幕琅摩、瀏覽器、頁面的高度寬度 NARUTOne 相信各位web開發(fā)獅們锭硼,在項目中為了搭建漂亮...
    迷緣火葉閱讀 3,701評論 0 1
  • 原文鏈接 http://blog.poetries.top/2016/12/13/js-props聲明:本文根據(jù)慕...
    程序員poetry閱讀 3,297評論 1 44
  • 我始終相信房资,人活在世,必經(jīng)幸福與苦難檀头,嘗盡酸甜苦辣轰异。生活,意義在何暑始?以我這活了20年的生命即在有生之年搭独,好好地活著...
    余音hai繞梁閱讀 371評論 0 0