外邊距摺疊指的是毗鄰的兩個或多個外邊距 (margin) 會合併成一個外邊距,本文詳細的介紹了一下css外邊距摺疊的實現,分爲3種狀況,很是具備實用價值,須要的朋友能夠參考下css
前文前端
這是的一個經典的老問題,由於以前恰好有讀者朋友問到,順便整理一下。瀏覽器
從一個簡單例子提及ide
先看一個簡單示例:學習
`<``style``>` `.slide1 div {` `margin:10px 0;` `}` `</``style``>` `<``div` `class``=``"slide1"``>` `<``h3``>第1種外邊距摺疊:兄弟元素</``h3``>` `<``p``>文本上下間距10px</``p``>` `<``p``>文本上下間距10px</``p``>` `</``div``>`
看這個例子中的兩個p
標籤,根據樣式定義:第一個p
的margin-bottom
和第二個p
的margin-top
都是10px,那實際距離應該等於20px纔對,可是用瀏覽器查看一下能夠發現,最終的邊距是10px
。 這個例子就是外邊距摺疊:塊級元素的上外邊距和下外邊距有時會合並(或摺疊)爲一個外邊距。spa
分類狀況code
外邊距摺疊有3種基本狀況:開發
先不急着記憶,首先,前文的例子中就是第一種狀況--相鄰的兩個元素之間發生的外邊距摺疊。rem
第二種和第三種狀況以下:it
`<``style``>` `.father {` `background-color: green;` `}` `.child {` `margin-top: 50px;` `background-color: red;` `height: 300px;` `}` `.slide3 {` `margin: 10px 0;` `}` `</``style``>` `<``h3``>第2種外邊距摺疊:父元素和首個子元素</``h3``>` `<``div` `class``=``"slide2 father"``>` `<!-- 父元素是綠色 -->` `<``div` `class``=``"slide2 child"``>` `<!-- 子元素是紅色 -->` `</``div``>` `</``div``>` `<``h3``>第3種外邊距摺疊:空的塊級元素</``h3``>` `<``div` `class``=``"slide3"``></``div``>` }//歡迎加入全棧開發交流划水交流圈:582735936 ]//面向划水1-3年前端人員 } //幫助突破划水瓶頸,提高思惟能力
他們的圖像也分別如圖:
狀況2: 子元素的外邊距會「轉移」到父元素的外面
狀況3:該元素的上下外邊距會摺疊
好了,到這裏咱們不妨來看看這幾種狀況的共同點(建議畫一下他們的盒模型,我懶就不畫了-_-),能夠發現發生外邊距摺疊的共同緣由:margin之間直接接觸,沒有阻隔。
如何理解直接接觸?很簡單:
<p>
標籤的垂直方向margin
是直接接觸的;padding
,border
都爲0,因此margin
和它的子元素也是直接接觸的。(這個例子畫出盒模型就很好理解)padding
,border
也是0)各類狀況下摺疊的結果
摺疊後的邊距如何計算,這個能夠簡單驗證下:
如何防止外邊距摺疊
前文說到,發生外邊距摺疊的緣由是,外邊距直接接觸,所以防止摺疊的方式就是,阻隔這個直接接觸,組合的方法包括:
border padding
非0,或者有inline
元素隔開,好比父元素里加一行文字也能夠(能夠直接在狀況2嘗試)display:table
等(BFC
不熟悉的同窗先查查,我後面補上)小結
還得補充一下,前面討論的是基本狀況,在基本狀況下還能夠進行組合,好比多個相鄰元素之間;多層後代元素嵌套等等,弄明白基本原理,其餘狀況只要寫寫小的demo驗證下就很好理解了。而後是慣例:若是內容有錯誤的地方歡迎指出(以爲看着不理解不舒服想吐槽也徹底沒問題);
以上就是本文的所有內容,但願對你們的學習有所幫助,