JS的盒子模型

一。JS盒子模型指的是通過JS中提供的一系列的屬性和方法,獲取頁面中元素的樣式信息值

<script type="text/javascript">  
    var box = document.getElementById("box");  
    console.dir(box);  
</script>

#box(有很多自己的私有屬性)-> HTMLDivElement.prototype -> HTMLElement.prototype -> Element.prototype -> Node.prototype -> 

EventTarget.prototype -> Object.prototype

以下面這個盒子作爲例子瞭解一下JS中的盒子模型:

內容的寬度和高度:我們設置的 width / height 這兩個樣式就是內容的寬和高;如果沒有設置height的值,容器的高度會更具裏面內容多少自己進行適應,這樣獲取的值就是真實內容的高;如果固定的高度了,無論內容的多了還是少了,其實我們的內容的高度都是設定的那個值

真實內容的寬度和高度:這個代指的是實際內容的寬高(和我們設置的height沒有必然的聯繫),例如:我們設置的高度爲200px,如果內容有溢出,那麼真實內容的高度就是把溢出內容的高度也要加進來的


(當前元素的幾個私有的屬性)

1.client系列

-> clientWidth / clientHeight : 內容的寬度 /  高度 + 左右 / 上下填充padding

-> clientLeft / clientTop : 左 邊框的寬度 / 上邊框的高度   (border [ Left / Top ] Width)



2.offset系列

-> offsetWidth / offsetHeight :  clientWidth / clientHeight  + 左右 / 上下邊框border

-> offsetParent:當前元素的富集參照物

-> offsetLeft / offsetTop:當前元素的外邊框距離富集參照物的內邊框的偏移量



3.scroll系列

-> scrollWidth / scrollHeight :和我們的clientWidth / clientHeight 一模一樣(前提是:容器中的內容沒有溢出的情況下)

-> 如果容器中的內容有溢出,我們獲取的結果是如下規則:

scrollWidth :真實內容的寬度(包含溢出) + 左填充padding-left

scrollHeight:真實內容的高度(包含溢出) + 上填充padding-top

-> 獲取到的結果都是“約等於”的值,因爲:同一個瀏覽器,我們是否設置overflow: hidden; 對於最終的結果石油影響的,在不同的瀏覽器中我們取到的結果也是不同的

-> scrollLeft / scrollTop:滾動條捲去的寬度 /  高度



二。關於JS合作司模型屬性取值的問題

我們通過這13個屬性值獲取到的結果永遠不可能出現小數,都是整數;瀏覽器獲取結果的時候,在原來真實結果的基礎上進行四捨五入


三。關於操作瀏覽器本身的盒子模型信息

-> clientWidth / clientHeight 是當前瀏覽器可視窗口的寬度和高度(一屏幕的寬度和高度)

-> scrollWidth / scrollHeight 是當前頁面的真實寬度和高度(所有屏加起來的寬度和高度,但是是一個約等於的值)

-> 我們不管哪些屬性,也不管是什麼瀏覽器,也不管是獲取還是設置,想要兼容的話,就需要寫兩套

document.documentElement[attr] || document.body[attr]  -> 必須document.documentElement在前面

-> 例如:

[獲取]    

document.documentElement.clientWidth || document.body.clientWidth

[設置也需要寫兩套]

document.documentElement.clientWidth = 0;

document.body.clientWidth = 0;


爲了方便,編寫一個關於操作瀏覽器盒子模型的方法win

如果只傳遞了attr沒有傳遞value,默認的意思就是“獲取”

如果兩個參數都傳遞了,意思就是“設置”

不嚴謹的說,這就是有關於“類的重載”,同一個方法,通過傳遞參數的不同實現了不同的功能

<script type="text/javascript">  
    var box = document.getElementById("box");  
    console.dir(box);  
    function win(attr,value) {  
        if(typeof value === "undefined"){//->沒有傳遞value值=“獲取”  
            return document.documentElement[attr] || document.body[attr];  
        }  
        //“設置”  
        document.documentElement[attr] = value;  
        document.body[attr] = value;  
    }  
</script>


發佈了32 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章