本文主題:css
什麼是 CSS 盒模型?相信大部分人都能答出這個問題來,那就是 標準模型 + IE 模型html
標準模型:面試
IE 模型segmentfault
很明顯瀏覽器
width
和 height
指的是內容區域的寬度和高度。增長內邊距、邊框和外邊距不會影響內容區域的尺寸,可是會增長元素框的總尺寸。width
和 height
指的是content
+border
+padding
box-sizing: content-box;
box-sizing: border-box;
dom.style.width/height
: 只能取出內聯樣式的寬和高 eg: <div id="aa" style="width: 200px"></div>
dom.currentStyle.width/height
獲取即時計算的樣式,可是隻有 IE 支持,要想支持其餘瀏覽器,能夠經過下面的方式window.getComputedStyle(dom).width
: 兼容性更好dom.getBoundingClientRect().width/height
: 這個較少用,主要是要來計算在頁面中的絕對位置什麼是邊距重疊呢?dom
邊界重疊是指兩個或多個盒子(可能相鄰也可能嵌套)的相鄰邊界(其間沒有任何非空內容、補白、邊框)重合在一塊兒而造成一個單一邊界。佈局
<style> .parent { background: #e7a1c5; } .parent .child { background: #c8cdf5; height: 100px; margin-top: 10px; } </style>
<section class="parent">
<article class="child"></article>
</section>
複製代碼
覺得期待的效果:spa
而實際上效果以下:3d
在這裏父元素的高度不是 110px,而是 100px,在這裏發生了高度坍塌。code
緣由是若是塊元素的 margin-top
與它的第一個子元素的 margin-top
之間沒有 border
、padding
、inline
content
、 clearance
來分隔,或者塊元素的 margin-bottom 與它的最後一個子元素的 margin-bottom 之間沒有 border
、padding
、inline
content
、height
、min-height
、 max-height
分隔,那麼外邊距會塌陷。子元素多餘的外邊距會被父元素的外邊距截斷。
<style> #margin { background: #e7a1c5; overflow: hidden; width: 300px; } #margin > p { background: #c8cdf5; margin: 20px auto 30px; } </style>
<section id="margin">
<p>1</p>
<p>2</p>
<p>3</p>
</section>
複製代碼
能夠看到 1 和 2,2 和 3 之間的間距不是 50px,發生了邊距重疊是取了它們之間的最大值 30px。
假設有一個空元素,它有外邊距,可是沒有邊框或填充。在這種狀況下,上外邊距與下外邊距就碰到了一塊兒,它們會發生合併:
解決上述問題的其中一個辦法就是建立 BFC。BFC 的全稱爲 Block Formatting Context
,即塊級格式化上下文。
父子元素的邊界重疊得解決方案: 在父元素上加上 overflow:hidden;使其成爲 BFC。
.parent {
background: #e7a1c5;
overflow: hidden;
}
複製代碼
兄弟元素的邊界重疊,在第二個子元素建立一個 BFC 上下文:
<section id="margin">
<p>1</p>
<div style="overflow:hidden;">
<p>2</p>
</div>
<p>3</p>
</section>
複製代碼
<style> #float { background: #fec68b; } #float .float { float: left; } </style>
<section id="float">
<div class="float">我是浮動元素</div>
</section>
複製代碼
父元素#float
的高度爲 0,解決方案爲爲父元素#float
建立 BFC,這樣浮動子元素的高度也會參與到父元素的高度計算:
#float {
background: #fec68b;
overflow: hidden; /*這裏也能夠用float:left*/
}
複製代碼
<section id="layout">
<style> #layout { background: red; } #layout .left { float: left; width: 100px; height: 100px; background: pink; } #layout .right { height: 110px; background: #ccc; } </style>
<!--左邊寬度固定,右邊自適應-->
<div class="left">左</div>
<div class="right">右</div>
</section>
複製代碼
在這裏設置右邊的高度高於左邊,能夠看到左邊超出的部分跑到右邊去了,這是因爲因爲浮動框不在文檔的普通流中,因此文檔的普通流中的塊框表現得就像浮動框不存在同樣致使的。
解決方案爲給右側元素建立一個 BFC,原理是 BFC 不會與 float 元素髮生重疊。
#layout .right {
height: 110px;
background: #ccc;
overflow: auto;
}
複製代碼
參考 邊距重疊與 BFC