前端 - margin的問題,那個老哥幫我解釋下
問題描述
<!DOCTYPE html><html lang='en'><head> <title>test</title> <style type='text/css'>* { margin: 0; padding: 0;}.a{ height:48px; background: #eee;}.b{ height:520px; background: #ff4949;}.c{ width:90%; height:300px; margin:20px auto; background: #fff;} </style></head><body><p class='a'></p><p class='b'> <p class='c'></p></p></body></html>
p.c 不是應該被紅色環繞嗎?煩請那個老哥解釋下。
問題解答
回答1:因為在BFC中,兩相鄰(兄弟或父子)、沒有邊框且沒有padding,元素的margin-top與其第一個常規文檔流的子元素的margin-top,會產生marign-collapse(外邊距折疊)。
你給b加邊框,
border: 1px solid transparent;
或者加padding,
padding: 1px 0;
都能消除。
或者,你可以給b加 overflow: hidden;。
可以參考:深入理解BFC和Margin Collapse
回答2:你在.b中添加個overflow: hidden;就可以了。
因為overflow 使用除了 visible 以外的值(hidden,auto,scroll)會觸發BFC。什么是BFC?Block Formatting Contexts (塊級格式化上下文)具有 BFC 的元素可以看作是隔離了的獨立容器,容器里面的元素不會在布局上影響到外面的元素,并且 BFC 具有普通容器沒有的一些特性,例如可以包含浮動元素,上文中的第二類清除浮動的方法(如 overflow 方法)就是觸發了浮動元素的父元素的 BFC ,使到它可以包含浮動元素,從而防止出現高度塌陷的問題。
回答3:overflow: hidden; 你把這句話加到 p.b 上。
回答4:搜一下 “子元素margin影響父元素”
回答5:這個叫外邊距重疊吧,子級元素的外邊距會影響父級元素,并且這兩的外邊距大整個容器的外邊距就以大的為準。這個時候應該選擇觸發BFC,BFC是什么前面幾位說的很清楚了,觸發BFC的情況有:
根元素
float屬性不為none;
position為absolute或fixed;
display為inline-block, table-cell, table-caption, flex, inline-flex;
overflow不為visible;
解決辦法:
如果你給父級加上overflow:hidden,或者加上透明邊框就可以解決了。
