成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

技術分享 如何獲取Dom元素的X/Y坐標

開發 前端
本文和大家一起學習一下如何獲取Dom元素的X/Y坐標,當今已有很多的JS框架封裝了獲取Dom元素的坐標的方法,我們可以直接使用。

當今已有很多的JS框架封裝了獲取Dom元素的坐標的方法,我們可以直接使用,而這里我更多的是希望透過這些方法,看到原始的獲取坐標方式以及如何處理跨瀏覽器問題。

獲取Dom元素的X/Y坐標

現在Web頁面的交互方式越來越多樣化,其中拖放頁面元素也是一種很常見的操作。在這類操作當中有兩個主要問題需要解決,一個是事件的注冊方式,一般處理拖放元素的事件順序是:捕獲鼠標正鍵按下——注冊鼠標移動事件——捕獲鼠標正鍵抬起——注銷鼠標移動事件;另一個問題就是拖放元素的位置,即X/Y坐標。這里我主要來講述后面的問題:如何獲取一個Dom元素的坐標。

當今已有很多的JS框架封裝了獲取Dom元素的坐標的方法,我們可以直接使用,而這里我更多的是希望透過這些方法,看到原始的獲取坐標方式以及如何處理跨瀏覽器問題。

首先認識一下getBoundingClientRect方法,標準語法為:

  1. oRect=object.getBoundingClientRect();  
  2.  

Dom節點調用該方法可返回一個ClientRect類型的對象,該對象有四個屬性值:top、left、right、bottom,表示了該節點相對于可視瀏覽器可視區域的左上角位置的坐標,看圖就能好理解:

坐標說明圖1

DOM元素坐標說明圖1

補充一下,如果當前的元素已經超出可視區域,依然按照可視區域的左上角位置的坐標來計算,如圖2

坐標說明圖2

DOM元素坐標說明圖2

這樣就可以簡單的獲取Dom元素在可視區里的X/Y坐標(通過left和top屬性)。最后在計算上頁面滾動條的偏移量就可以計算出元素在整個頁面中的X/Y坐標了。頁面滾動偏移量的計算在不同瀏覽器下有所不同,不過我們可以借鑒YUI里面方法,設計一個通用的方式:

  1. scrollLeft=Math.max(document.documentElement.scrollLeft,  
  2.  
  3. document.body.scrollLeft);  
  4.  
  5. scrollTop=Math.max(document.documentElement.scrollTop,  
  6.  
  7. document.body.scrollTop);  

在W3C標準下document.body.scrollTop和document.body.scrollLeft都為0,所以采用了上面兼容的方式獲取頁面滾動條的偏移量。#p#

◆將ClientRect對象的left、top屬性分別加上scrollLeft和scrollTop,就能獲取Dom元素的X/Y坐標了。但對于IE8之前的IE版本在很多情況,下面要對這個值進行一些調整,有三種情況,下面來分別看一下:

1.IE6的標準模式下不需要調整;

2.所有怪異模式下為取document的當前borderLeftWidth和borderTopWidth值做調整,分別加在X/Y坐標值上;

3.其他的情況都分別在X/Y坐標值上加上2;

這樣就可以獲取最后準確的X/Y坐標了。

如果所有的瀏覽器都能如此就好了,可惜有些瀏覽器(FF2、Safari)不支持getBoundingClientRect方法。需要通過一級級查找和計算offsetParent來獲取X/Y坐標值。這里首先介紹什么是元素的offsetParent屬性。

◆offsetParent屬性是距離調用offsetParent的元素最近的(在包含層次中最靠近的),并且是已進行過CSS定位的與容器元素。首先說明一下CSS定位,是指對元素設置position屬性為absolute、relative或fixed(IE6除外),還有一個問題是元素在table元素中時會有不同的情況。下面是我的一些歸納,不全之處望大家指出:

1.元素不在table元素中,且元素及其所有上級元素都未進行CSS定位時,這個元素的offsetParent屬性為根元素(Body);

2.元素本身沒進行CSS定位,而出現在table中或有上級元素進行了CSS定位,那么當向上先達到TD元素時該元素的offsetParent屬性為TD元素;當向上先達到進行了CSS定位的上級元素時該元素的offsetParent屬性為該上級元素;

3.無論元素在不在table中,只要元素本身進行了CSS定位,有上級元素進行了CSS定位的則元素的offsetParent屬性為該上級元素,沒有上級素進行了CSS定位的則元素的offsetParent屬性為根元素;

知道了offsetParent屬性的含義,就可以通過offsetParent屬性來一級級的計算X/Y坐標了。一種比較簡單的while循環:

  1. varnode;/*求坐標的元素*/  
  2. varxy=[];/*保存XY坐標*/  
  3. while((nodenode=node.offsetParent)){  
  4. xy[0]+=node.offsetLeft;  
  5. xy[1]+=node.offsetTop];  

◆通過這一個循環就能累計元素每級offsetParent屬性元素的偏移量,但這個偏移量在累加的過程中沒有計算每級父元素有滾動條的情況,最后還要同getBoundingClientRect方法一樣加上頁面滾動值(這里scrollLeft和scrollTop)。現在先來累計計算元素每上級元素的滾動條情況,首先判斷元素本身是不是設置了position為fixed:

1.設置了則不用計算每上級元素的滾動條情況,但需要對Opera和其他瀏覽器做區分,Opera瀏覽器減去scrollLeft和scrollTopxy[0]-=scrollLeft;xy[1]-=scrollTop;,其他情況是加上scrollLeft和scrollTop。

  1. xy[0]+=scrollLeft;xy[1]+=scrollTop;  
  2.  

2.未設置時就需要累計計算元素每上級元素的滾動條,通過一個循環里累加:

  1. while((nodenode=node.parentNode)&&node.tagName){  
  2. scrollTop=node.scrollTop;  
  3. scrollLeft=node.scrllLeft;  
  4. if(scrollTop||scrollLeft){  
  5. xy[0]-=scrollLeft;  
  6. xy[1]-=scrollTop;  
  7. }  

最后機上頁面滾動值

  1. xy[0]+=scrollLeft;xy[1]+=scrollTop;  
  2.  

這樣最后就可以在不支持getBoundingClientRect方法的瀏覽器下獲取元素的X/Y坐標了。

總結:

如果瀏覽器支持getBoundingClientRect方法,通過該方法再加上頁面滾動條的偏移就能獲取元素的X/Y了(不同瀏覽器需要微調),如果不支持getBoundingClientRect方法,則需要通過循環該元素的每級offsetParent屬性來累計偏移量,再通過每個父級元素的滾動條來調整,最后再加上頁面滾動條的偏移來獲取元素的X/Y坐標。獲取X/Y坐標的方式還有很多,可能不盡相同,我這里主要是基于YUI里面的思想和方法。
 

【編輯推薦】

  1. JQuery創建DOM元素方法解析
  2. W3C DOM模型用法詳解
  3. JavaScript獲取HTML DOM節點元素詳解
  4. 深入了解JavaScript HTML DOM對象
  5. 解析HTML DOM Checkbox對象的屬性和方法

 

 

責任編輯:佚名 來源: ued.koubei.com
相關推薦

2010-09-13 16:46:29

JavaScriptHTML DOM節點

2021-04-09 18:01:03

前端ReactDOM

2010-10-09 10:56:50

DHTMLJS

2010-10-09 13:56:33

textareaJavascript

2024-01-15 09:23:16

框架方式原生

2023-10-30 08:35:50

水波紋效果vue

2010-09-28 13:40:52

DOM元素

2010-08-11 14:47:54

Flex樣式

2010-07-15 15:21:07

Perl線程

2010-06-02 16:09:05

SVN協議

2010-09-25 16:06:58

SQL語句

2010-07-28 12:41:18

Flex組件

2010-09-28 15:27:09

JavaScript

2013-01-09 15:27:45

DOM XSS檢測QtWebKitXSS

2021-01-11 07:51:16

DOM對象節點樹

2010-09-10 13:06:27

JavaScript

2013-04-12 12:36:13

WindowsPhon

2010-06-01 18:49:19

刪除SVN備份

2010-05-26 15:39:36

SVN服務

2017-09-27 14:46:37

Vue2.xDOM diff原理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线a视频 | 亚洲精品国产a久久久久久 午夜影院网站 | 91精品国产麻豆 | 欧美精品一区三区 | 国产精品一区网站 | 蜜桃一区二区三区 | 欧美精品一 | 成人九色| 玖玖色在线视频 | 国产精品一区2区 | 日本五月婷婷 | 九九伊人sl水蜜桃色推荐 | 久热国产在线 | 日韩av一区二区在线 | 人人爽人人爽人人片av | 久久久久久久av麻豆果冻 | a级黄色片视频 | 国产亚洲一区二区三区在线 | 9久久 | 欧美一级特黄aaa大片在线观看 | 久久久久一区二区 | 久久久www成人免费无遮挡大片 | 国产一级久久久久 | 成人黄在线观看 | 日日天天 | www.久久99| 欧美一区二区三区在线看 | 综合国产第二页 | 久草网站 | 国产97碰免费视频 | 欧美福利网站 | 超碰在线播 | 91久久国产精品 | 欧美一区二区三区在线观看视频 | 男女羞羞网站 | 国产精品久久久久久一区二区三区 | 国产精品高潮呻吟久久久久 | 精品国产91乱码一区二区三区 | 精国产品一区二区三区四季综 | 涩涩视频网站在线观看 | 91就要激情 |