JavaScriptclient、offset、scroll屬性獲取元素大小及偏移

JavaScript client、offset、scroll 屬性獲取元素大小及偏移

1.元素偏移量屬性:每次訪問需要重新計算

A.offsetHeight和offsetWidth可以得到元素的寬度和高度
offetHeight(offsetWidth) = padding + height(width) + border;

B.offsetLeft和offsetTop:

a.offsetParent該元素計算offsetLeft(offsetTop)值所選的參考對象和parentNode不等價

b.該元素有定位則參考的對象為最近的帶有定位最近帶有定位的父元素沒有定位則參考他的父
元素,所以offsetParent有可能不是直接包含他的父元素

c.值是從參考元素邊框內側開始不包含border包含padding,

d.使用offsetLeft(offsetTop)結合offsetParent來計算元素在頁面的偏移量,比如計算元素
相對頁面的左偏移量

/*以下的函數在《JavaScript高級程序設計第三版》321頁*/
```
function getELementLeft(element) {
    var actualLeft = element.offsetLeft;
    var offsetParent = element.offsetParent;

    while(offsetParent !== null) {
        actualLeft += current.offsetLeft;
        offsetParent = offsetParent.offsetParent;
    }

    return actualLeft;
}
```

D.offsetLeft(offsetTop)與style.left(style.top)區別,結合以下代碼分析:

a.如果盒子沒有定位style.left獲取不到值輸出空,而offsetLeft則輸出盒子離body左內邊框
的距離

b.offet.Width返回值默認以像素為單位的數值不帶px,style.width返回字符竄帶px

c.style.left隻能取到行內的left屬性值,如果沒有指定隻會返回空字符串,offsetLeft獲
取則沒有這個限制

d.style.left可以讀寫,offsetLeft隻讀

/代碼片一/

p {
        margin: 0;
        padding: 0; 
        left: 10px;
        width: 100px;
        height: 100px;
        border: solid 1px red;
    }
.hasPosition {
    position: absolute;
    overflow: scroll;
}

是的哈是個大傢愛好是大傢愛帥哥的驕傲是更好的驕傲啥感覺多少噶絕對是噶價格多少傢阿哥大傢哈就打擊和大傢按實際薩嘎撒謊個等級撒大傢愛喝酒打架後多久啊回到傢阿嘎時間過得

是的哈是個大傢愛好是大傢愛帥哥的驕傲是更好的驕傲啥感覺多少噶絕對是噶價格多少傢阿哥大傢哈就打擊和大傢按實際薩嘎撒謊個等級撒大傢愛喝酒打架後多久啊回到傢阿嘎時間過得

<script>
var hasPosition = document.querySelector(‘.hasPosition’);
console.log(hasPosition.offsetLeft); // 20
console.log(hasPosition.style.left); // 20px
var noPosition = document.querySelector(‘.noPosition’);
console.log(noPosition.offsetLeft); // 8
console.log(noPosition.style.left); // “” 空

/*3.元素內容滾動大小*/
console.log(noPosition.scrollHeight); // 308
console.log(hasPosition.scrollHeight); // 374
</script>

2.客戶區大小:值指的是元素內容及其內邊距所占據的空間大小,不包括滾動條

A.clientWidth(clientHeight) = padding + width(height);

B.可以用來獲取視口的大小:

/* 以下的函數是對《JavaScript高級程序設計第三版》323頁函數的修改得到獲取視口的兼容性函數*/

function getViewport() {
    /*W3C瀏覽器*/
    if(window.innerWidth) {
        return {
            width: window.innerWidth;
            height: window.innerHeight;
        }
    }else if(document.compatMode == 'BackCompat') {
        /*文檔模式為標準模式*/
        return {
            width: document.documentElement.clientWidth;
            height: document.documentELement.clientHeight;
        }
    }else {
         /*文檔模式為混雜模式*/
        return {
            width: document.body.clientWidth;
            height: document.body.clientHeight;
        }
    }
}

3.元素內容滾動大小結合上面代碼片一

A.scrollWidth(scrollHeight):

a.沒有滾動條:值為元素內容的寬度(高度)

b.存在滾動條:值?暫時不知道怎麼算,在谷歌上面測試瞭看不出值的規律

c.html元素被當成是在web瀏覽器視口中滾動元素,因此帶垂直滾動條並不帶橫向滾動條的頁
面高度為:

 (1).標準模式:document.documentElement.scrollHeight;

 (2).混雜模式:document.body.scrollHeight

d.不帶滾動條的頁面大小clientWidth(clientWidth)和scrollWidth(scrollHeight)關系在不
同瀏覽器中是不同的(標準模式)IE混合模式隻需將以下的documentElemnt換成body:

 (1).這裡和視口的聯系在於沒有滾動條說明內容區域有可能的最大值為視口大小,有滾動條
 頁面的內容大小就超出視口的大小,兩者就沒有明確聯系

 (2).Firefox 中documentElement兩組屬性始終都是相等的,大小代表的是文檔內容區域的大
 小,而不是視口的大小

 (3).Opera,Safari3.1,及更高版本、Chrome中的scrollWidth(scrollHeight)等於視口的大小
 ,clientWidth(clientHeight)等於文檔內容區域的大小

 (4).IE(在標準模式)中scrollWidth(scollHeight)等於文檔區域的大小,
 clientWidth(clientWidth)等於視口的大小

B.scrollLeft(scrollTop):被隱藏在可視內容區域左邊(上邊)的像素數,通過設置該屬性值可以
改變元素的的滾動位置,比如以下函數就是設重置元素的滾動狀態回到最初的狀態

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

4.確定元素的大小

A.思路:獲得元素在相對視口的left,top,right,bottom,視口的元素坐標又是和頁面原始坐標相同,通過left(top)和right(bottom)的差值來計算元素的寬高,包含邊框

a.W3C:頁面的原始坐標是(0,0)即視口的原始坐標為(0,0)W3C提供瞭一個getBoundingC
lientRect()函數來獲取以上屬性值

b.IE8以下:頁面的原始坐標(2,2)即視口的原始坐標為(2,2),所以需要自己封裝函數來
獲取元素屬性,IE8使用以上**元素偏移屬性中的函數**getElementLeft()函數和
getElementTop()以上沒有封裝getElementLeft()一樣用來取得元素相對頁面的top或left值

c.right和bottom參考文檔在左上角的原始坐標的話,就和CSS中的right,bottom不相同,也即
是right值是從頁面的最左端算起,不是在最有端來算得

/《JavaScript高級程序設計第三版》325頁的函數/

function getBoundingClientRect(element) {

    var scrollTop = document.documentELement.scrollTop;
    var scrollLeft = document.documentELement.scrollLeft;

    if(element.getBoundingClientRect) {
        /*
        a.將left,right,top,bottom屬性組成的對象放到函數的offset屬性中,
        b.以下代碼是實現懶加載,因為在某個瀏覽器裡面我們隻需要初始化一次offset值就可以
        c.offset是用來準確獲取元素在W3C瀏覽器中頁面滾動相對視口的位置
        */
        if(typeof arguments.callee.offset != 'number') {

            /*以下是通過創建一個p實例來矯正再通過四個屬性中的top屬性來矯正*/
            var tem = document.creatElement('p');
            document.body.appendChild(temp);

            /*
            a.減去頁面scrolltop是因為頁面可能是被滾動瞭,
            b.避免頁面滾動後得重新調用該函數
            */
            arguments.callee.offset = -temp.getBoundingClientRect().top - scrolltop;
            temp = null;
        }

        var sect = element.getBoundingClientRect();
        var offset = arguments.callee.offset;

        return {
            left: rect.left + offset;
            right: rect.right + offset;
            top: rect.top + offset;
            bottom: rect.bottom + offset;
        };
    }else {
        /*以上元素偏移屬性中的函數*/
        var actualLeft = getElementLeft(element);
        var actualTop = getElementTop(element);

        return {
            left: actualLeft - srollLeft;
            right: actualLeft + element.offsetWidth - srollLeft;
            top: actualTop - srollTop;
            bottom: actualTop + element.offsetHeight - srollTop;
        }
    }
}

發佈留言