欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript獲取元素尺寸和大小操作總結(jié)

 更新時(shí)間:2015年02月27日 11:26:58   投稿:hebedich  
本文總結(jié)了使用JavaScript獲取指定元素大小、位置的幾種方式。如果你用的是JQuery,則獲取元素大小是非常簡(jiǎn)單的。但是我們還是有必要知道如何通過(guò)原生JavaScript來(lái)獲取,需要的朋友可以參考下

一、獲取元素的行內(nèi)樣式

復(fù)制代碼 代碼如下:

var obj = document.getElementById("test");
alert(obj.height + "\n" + obj.width);
// 200px 200px typeof=string只是將style屬性中的值顯示出來(lái)

二、獲取計(jì)算后的樣式

復(fù)制代碼 代碼如下:

var obj = document.getElementById("test");
var style = null;
if (window.getComputedStyle) {
    style = window.getComputedStyle(obj, null);    // 非IE
} else {
    style = obj.currentStyle;  // IE
}
alert("width=" + style.width + "\nheight=" + style.height);

注意:如果不設(shè)置元素的寬度和高度,那么在非IE瀏覽器下返回默認(rèn)的寬度和高度。在IE下面返回auto字符串

三、獲取<link>和<style>標(biāo)簽寫入的樣式

復(fù)制代碼 代碼如下:

var obj = document.styleSheets[0]; // [object StyleSheetList] 樣式表的個(gè)數(shù)<link>var rule = null;// [object CSSRule]
if (obj.cssRules){
    rule = obj.cssRules[0];  // 非IE [object CSSRuleList]
} else {
    rule = obj.rules[0];     // IE [object CSSRuleList]
}
alert(rule.style.width);

cssRules(或rules)只能獲取到內(nèi)聯(lián)和鏈接樣式的寬和高,不能獲取到行內(nèi)和計(jì)算后的樣式。

總結(jié):以上的三種CSS獲取元素大小的方法,只能獲取元素的CSS大小,卻無(wú)法獲取元素本身實(shí)際的大小。比如加上了內(nèi)邊距、滾動(dòng)條、邊框之類的。

四、獲取元素的實(shí)際大小

1. clientWidth和clientHeight
    這組屬性可以獲取元素可視區(qū)的大小,可以得到元素內(nèi)容及內(nèi)邊距所占據(jù)的空間大小。返回了元素大小,但沒(méi)有單位,默認(rèn)單位是px,如果你強(qiáng)行設(shè)置了單位,比如100em之類,它還是會(huì)返回px的大小。(CSS獲取的話,是照著你設(shè)置的樣式獲取)。對(duì)于元素的實(shí)際大小,clientWidth和clientHeight理解方式如下:
    a. 增加邊框,無(wú)變化;
    b. 增加外邊距,無(wú)變化;
    c. 增加滾動(dòng)條,最終值等于原本大小減去滾動(dòng)條的大?。?br />     d. 增加內(nèi)邊距,最終值等于原本大小加上內(nèi)邊距的大??;

復(fù)制代碼 代碼如下:

<div id="test"></div>
#test{
    background-color: green;
    width: 200px;
    height: 200px;
    border: solid 5px red;  /* 對(duì)應(yīng)a理解,結(jié)果:200,200 */
    margin: 10px;  /* 對(duì)應(yīng)b理解,結(jié)果:200,200*/
    padding: 20px;  /* 對(duì)應(yīng)c理解,結(jié)果:240,240*/
    overflow: scroll;  /* 對(duì)應(yīng)d理解,結(jié)果:223,223,223=200(css大?。?40(兩邊內(nèi)邊距)-17(滾動(dòng)條寬度)*/
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.clientWidth + "," + obj.clientHeight);
};

注意:如果說(shuō)沒(méi)有設(shè)置任何CSS的寬和高度,那么非IE瀏覽器會(huì)算上滾動(dòng)條和內(nèi)邊距的計(jì)算后的大小,而IE瀏覽器則返回0(IE8已修復(fù))。

2. scrollWidth和scrollHeight
    這組屬性可以獲取滾動(dòng)內(nèi)容(可見(jiàn)內(nèi)容)的元素大小。返回了元素大小,默認(rèn)單位是px。如果沒(méi)有設(shè)置任何CSS的寬和高度,它會(huì)得到計(jì)算后的寬度和高度。對(duì)于元素的實(shí)際大小,scrollWidth和scrollHeight理解如下:
    1. 增加邊框,不同瀏覽器有不同解釋(下面在IE8中運(yùn)行正常,IE6運(yùn)行不正常):
a) Firefox和Opera瀏覽器會(huì)增加邊框的大小,220x220
b) IE、Chrome和Safari瀏覽器會(huì)忽略邊框大小,200x200
c) IE瀏覽器只顯示它本來(lái)內(nèi)容的高度,200x18(IE8已經(jīng)修改該問(wèn)題)
    2. 增加內(nèi)邊距,最終值會(huì)等于原本大小加上內(nèi)邊距大小,220x220,IE為220x38
    3. 增加滾動(dòng)條,最終值會(huì)等于原本大小減去滾動(dòng)條大小,184x184,IE為184x18
    4. 增加外邊據(jù),無(wú)變化。
    5. 增加內(nèi)容溢出,F(xiàn)irefox、Chrome和IE獲取實(shí)際內(nèi)容高度,Opera比前三個(gè)瀏覽器獲取的高度偏小,Safari比前三個(gè)瀏覽器獲取的高度偏大。

3. offsetWidth和offsetHeight
    這組屬性可以返回元素實(shí)際大小,包含邊框、內(nèi)邊距和滾動(dòng)條。返回了元素大小,默認(rèn)單位是px。如果沒(méi)有設(shè)置任何CSS的寬和高度,他會(huì)得到計(jì)算后的寬度和高度。對(duì)于元素的實(shí)際大小,offsetWidth和offsetHeight理解如下:
    1.增加邊框,最終值會(huì)等于原本大小加上邊框大小,為220;
    2.增加內(nèi)邊距,最終值會(huì)等于原本大小加上內(nèi)邊距大小,為220;
    3.增加外邊據(jù),無(wú)變化;
    4.增加滾動(dòng)條,無(wú)變化,不會(huì)減?。?br />     對(duì)于元素大小的獲取,一般是塊級(jí)(block)元素并且以設(shè)置了CSS大小的元素較為方便。如果是內(nèi)聯(lián)元素(inline)或者沒(méi)有設(shè)置大小的元素就尤為麻煩,所以,建議使用的時(shí)候注意。

復(fù)制代碼 代碼如下:

<div id="test">test div element</div>
#test{
    background-color: green;
    width: 200px;
    height: 200px;
    border: solid 10px red; /*結(jié)果:220,220*/
    margin: 10px; /*結(jié)果:220,220(無(wú)變化)*/
    padding: 10px; /*結(jié)果:240,240*/
    overflow:scroll; /*結(jié)果:240,240(無(wú)變化)*/
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.offsetWidth + "," + obj.offsetHeight);
};

五、獲取元素周邊大小
1. clientLeft和clientTop獲取邊框大小
    這組屬性可以獲取元素設(shè)置了左邊框和上邊框的大小。目前只提供了Left和Top這組,并沒(méi)有提供Right和Bottom。如果四條邊寬度不同的話,可以直接通過(guò)計(jì)算后的樣式獲取,或者采用以上三組獲取元素大小的減法求得。
右邊框的寬度:obj.offsetWidth-obj.clientWidth-obj.clientLeft
底邊框的寬度:obj.offsetHeight-obj.clientHeight-obj.clientTop

復(fù)制代碼 代碼如下:

<div id="test">test div element</div>
#test{
    background-color: green;
    width: 200px;
    height: 200px;
    border-top: solid 10px red;s
    border-right: solid 20px #00ff00;
    border-bottom: solid 30px blue;
    border-left: solid 40px #808080;
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.clientLeft + "," + obj.clientTop); // 40,10
};

2. offsetLeft和offsetTop   
    這組屬性可以獲取當(dāng)前元素相對(duì)于父元素的位置。獲取元素當(dāng)前相對(duì)于父元素的位置,最好將它設(shè)置為定位position:absolute;否則不同的瀏覽器會(huì)有不同的解釋。
a、將position設(shè)置為absolute,則所有瀏覽器返回一樣的值。如:

復(fù)制代碼 代碼如下:

<div id="test">test div element</div>
#test{
    background-color: green;
    width: 200px;
    height: 200px;
    position: absolute;
    left: 30px;
    top: 20px;
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.offsetLeft + "," + obj.offsetTop); // 30, 20
};

b、加上邊框和內(nèi)邊距不會(huì)影響它的位置,但加上外邊據(jù)會(huì)累加。

3、box.offsetParent得到父元素
    offsetParent中,如果本身父元素是<body>,非IE返回body對(duì)象,IE(IE6)返回html對(duì)象。如果兩個(gè)元素嵌套,如果上父元素沒(méi)有使用定位position:absolute,那么offsetParent將返回body對(duì)象或html對(duì)象。所以,在獲取offsetLeft和offsetTop時(shí)候,CSS定位很重要。
    如果說(shuō),在很多層次里,外層已經(jīng)定位,我們?cè)趺传@取里層的元素距離body或html元素之間的距離呢?也就是獲取任意一個(gè)元素距離頁(yè)面上的位置。那么我們可以編寫函數(shù),通過(guò)不停的向上回溯獲取累加來(lái)實(shí)現(xiàn)。

復(fù)制代碼 代碼如下:

box.offsetTop + box.offsetParent.offsetTop;     // 只有兩層的情況下
 
function offsetLeft(element){
    var left = element.offsetLeft; // 得到第一層距離
    var parent = element.offsetParent; // 得到第一個(gè)父元素
    while (parent !== null) { // 如果還有上一層父元素
        left += parent.offsetLeft; // 把本層的距離累加
        parent = parent.offsetParent; // 得到本層的父元素
    } //然后繼續(xù)循環(huán)
    return left;
}

4.scrollTop和scrollLeft
    這組屬性可以獲取滾動(dòng)條被隱藏(滾動(dòng)條上方區(qū)域)的區(qū)域大小,也可設(shè)置定位到該區(qū)域。如果要讓滾動(dòng)條滾動(dòng)到最初始的位置,那么可以寫一個(gè)函數(shù):

復(fù)制代碼 代碼如下:

function scrollStart (element) {
    if ( element.scrollTop != 0 ) {
        element.scrollTop = 0;
    }
}

5、getBoundingClientRect()
這個(gè)方法返回一個(gè)矩形對(duì)象,包含四個(gè)屬性:left、top、right和bottom。分別表示元素各邊與頁(yè)面上邊和左邊的距離。

復(fù)制代碼 代碼如下:

var box=document.getElementById('box');     // 獲取元素
alert(box.getBoundingClientRect().top);         // 元素上邊距離頁(yè)面上邊的距離
alert(box.getBoundingClientRect().right);       // 元素右邊距離頁(yè)面左邊的距離
alert(box.getBoundingClientRect().bottom);  // 元素下邊距離頁(yè)面上邊的距離
alert(box.getBoundingClientRect().left);         // 元素左邊距離頁(yè)面左邊的距離

注意:IE、Firefox3+、Opera9.5、Chrome、Safari支持,在IE中,默認(rèn)坐標(biāo)從(2,2)開(kāi)始計(jì)算,導(dǎo)致最終距離比其他瀏覽器多出兩個(gè)像素,我們需要做個(gè)兼容。

復(fù)制代碼 代碼如下:

document.documentElement.clientTop; //非IE為0,IE為2
document.documentElement.clientLeft; //非IE為0,IE為2
functiongGetRect (element) {
    var rect = element.getBoundingClientRect();
    var top = document.documentElement.clientTop;
    var left= document.documentElement.clientLeft;
    return{
        top  :   rect.top - top,
        bottom  :   rect.bottom - top,
        left  :   rect.left - left,
        right  :    rect.right - left
    }
}

分別加上外邊據(jù)、內(nèi)邊距、邊框和滾動(dòng)條,用于測(cè)試所有瀏覽器是否一致。

以上就是本文所述的全部?jī)?nèi)容了,希望小伙伴們能夠喜歡。

相關(guān)文章

  • TypeScript數(shù)組的定義與使用詳解

    TypeScript數(shù)組的定義與使用詳解

    數(shù)組對(duì)象是使用單獨(dú)的變量名來(lái)存儲(chǔ)一系列的值,數(shù)組非常常用,數(shù)組是具有連續(xù)存儲(chǔ)位置的相似類型元素的同質(zhì)集合。數(shù)組是用戶定義的數(shù)據(jù)類型。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),我們?cè)谄渲写鎯?chǔ)相似數(shù)據(jù)類型的元素
    2022-09-09
  • JavaScript練習(xí)小項(xiàng)目之修改div塊的顏色

    JavaScript練習(xí)小項(xiàng)目之修改div塊的顏色

    這篇文章主要給大家介紹了關(guān)于JavaScript練習(xí)小項(xiàng)目之修改div塊的顏色的相關(guān)資料,文中通過(guò)舉例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • 如何利用Typescript封裝本地存儲(chǔ)

    如何利用Typescript封裝本地存儲(chǔ)

    這篇文章主要給大家介紹了關(guān)于如何利用Typescript封裝本地存儲(chǔ)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • js處理自己不能定義二維數(shù)組的方法詳解

    js處理自己不能定義二維數(shù)組的方法詳解

    本篇文章主要是對(duì)js處理自己不能定義二維數(shù)組的方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望讀大家有所幫助
    2014-03-03
  • JS精確判斷數(shù)據(jù)類型代碼實(shí)例

    JS精確判斷數(shù)據(jù)類型代碼實(shí)例

    這篇文章主要介紹了JS精確判斷數(shù)據(jù)類型代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • JS克隆,屬性,數(shù)組,對(duì)象,函數(shù)實(shí)例分析

    JS克隆,屬性,數(shù)組,對(duì)象,函數(shù)實(shí)例分析

    這篇文章主要介紹了JS克隆,屬性,數(shù)組,對(duì)象,函數(shù),結(jié)合實(shí)例形式分析了javascript中面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)的對(duì)象、屬性、函數(shù)及數(shù)組等相關(guān)技巧,需要的朋友可以參考下
    2016-11-11
  • 詳解JS如何解決大數(shù)據(jù)下滾動(dòng)頁(yè)面卡頓問(wèn)題

    詳解JS如何解決大數(shù)據(jù)下滾動(dòng)頁(yè)面卡頓問(wèn)題

    之前遇到不分頁(yè)直接獲取到全部數(shù)據(jù),前端滾動(dòng)查看數(shù)據(jù),頁(yè)面就挺卡頓的,所以這篇文章來(lái)和大家聊聊如何解決這一問(wèn)題,感興趣的小伙伴可以了解下
    2023-07-07
  • JS攜帶參數(shù)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    JS攜帶參數(shù)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)功能

    這篇文章主要介紹了js攜帶參數(shù)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),實(shí)現(xiàn)方法也很簡(jiǎn)單,方式一是跳轉(zhuǎn)路徑攜帶參數(shù),第二種方法是通過(guò)sessionStorage傳遞,需要的朋友可以參考下
    2022-11-11
  • d3繪制基本的柱形圖的實(shí)現(xiàn)代碼

    d3繪制基本的柱形圖的實(shí)現(xiàn)代碼

    柱形圖是圖表中常見(jiàn)的一種,這篇文章主要介紹了d3繪制基本的柱形圖的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • layui固定下拉框的顯示條數(shù)(有滾動(dòng)條)的方法

    layui固定下拉框的顯示條數(shù)(有滾動(dòng)條)的方法

    今天小編就為大家分享一篇layui固定下拉框的顯示條數(shù)(有滾動(dòng)條)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09

最新評(píng)論