邊距合并、BFC

1.在什么場景下會出現外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例。

<li>外邊距合并指的是,當兩個垂直外邊距相遇時,它們將形成一個外邊距。
合并后的外邊距的高度等于兩個發生合并的外邊距的高度中的較大者。當兩個外邊距都是正數時,取兩者之中的較大者;當兩個外邊距都是負數時,取兩者之間絕對值較大者;當兩個外邊距一正一負時,取的是兩者的和。
<li>邊距合并出現的原因:
以由幾個段落組成的典型文本頁面為例。第一個段落上面的空間等于段落的上外邊距。如果沒有外邊距合并,后續所有段落之間的外邊距都將是相鄰上外邊距和下外邊距的和。這意味著段落之間的空間是頁面頂部的兩倍。如果發生外邊距合并,段落之間的上外邊距和下外邊距就合并在一起,這樣各處的距離就一致了。


在元素之間為父子關系,兄弟關系時,相鄰的邊距就會合并,甚至,元素自身的邊距也會合并:
假設有一個空元素,它有外邊距,但是沒有邊框或填充。在這種情況下,上外邊距與下外邊距就碰到了一起,它們會發生合并:


父子邊距合并:

<head>
<style type="text/css">
* {
  margin:0;
  padding:0;
  border:0;
}
#outer {
  width:300px;
  height:300px;
  background-color:red;
  margin-top:20px;
}
#inner {
  width:50px;
  height:50px;
  background-color:blue;
  margin-top:10px;
}
</style>
</head>
<body>
<div id="outer">
  <div id="inner">
  </div>
</div>
</body>
</html>```

![](http://upload-images.jianshu.io/upload_images/2399926-3e97c720be90a00b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
outer和inner在此情況下同用一個外邊距。
<li>只有普通文檔流中塊框的垂直外邊距才會發生外邊距合并。行內框、浮動框或絕對定位之間的外邊距不會合并。
<li>如果想要避免外邊距合并效果,可以采用“隔開”兩個元素的方式,在兩個元素間加邊框,或者采用在兩者間加一個元素,添加一個浮動效果等方法隔開兩個元素,當處于父子關系時,可以在外層元素加上padding來造成分隔效果,還有一種方式,使元素區塊形成BFC,同樣可以達到這種效果。
***
##2.去除inline-block內縫隙有哪幾種常見方法?

####inline-block是什么:

inline-block 即內聯塊,在CSS的元素分類中可以分成三種:行內元素或者內聯元素、塊級元素、以及內聯塊元素。

####內聯塊元素具有了內聯元素以及塊級元素的特性:

1.元素之間可以水平排列 
1.可以當做一個塊級元素來設置各種的屬性,例如:width、height、padding等。
####inline-block兼容性

1.inline level的元素
對于內聯元素(inline element),所有主流瀏覽器都支持直接設置display 的value值為inline-block來將其定義為內聯塊。
2.block level的元素
IE7及以下瀏覽器對塊級元素(block element)的支持并不完全,它們只支持用display:inline-block去定義一個inline level的元素為內聯塊。
####inline-block內縫隙:
例:

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<style>
.demo span {
background-color: yellow;
}</style>
</head>
<body>
<div class="demo">
<span>我是例子</span>
<span>我是例子</span>
<span>我是例子</span>
<span>我是例子</span>
</div>
</body>
</html>```

inline-block內縫隙

<li>出現這種情況的原因是<span>標簽之間有換行,就會默認有一個空格,如果刪除這些換行,換一種寫法的話,,縫隙就會消失:

<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>
   .demo span {
     background-color: yellow;
    }</style>
   
</head>
<body>
<div class="demo">
      <span>我是例子</span
      ><span>我是例子</span
      ><span>我是例子</span
      ><span>我是例子</span>
</div>
</body>
</html>```

![](http://upload-images.jianshu.io/upload_images/2399926-21605d9b5a3e5300.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<li>或者使用負margin的方法(一般為-4px),使用這種方式,第一個<span>也會向左移動-4px;的距離,這點需要注意:

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<style>
.demo span {
background-color: yellow;
margin:-4px;
}
</style>
</head>
<body>
<div class="demo">
<span>我是例子</span>
<span>我是例子</span>
<span>我是例子</span>
<span>我是例子</span>
</div>
</body>
</html>```
<li>添加浮動清除縫隙:

  <style>
   .demo span {
     background-color: yellow;
     float: left;
    }
  </style>```
<li>在父元素中設置font-size為零,然后重新設置容器中的元素字號:

<style>
.demo {
font-size: 0;
}
.demo span {
background-color: yellow;
font-size: 20px;
}
</style>```


3.父容器使用overflow: auto| hidden撐開高度的原理是什么?

當元素設置浮動時,元素脫離了文檔流,父元素感受不到元素的存在,容器就會產生高度塌陷的效果,使用"overflow:auto|hiffen"形成一個BFC來撐開父元素。


4.BFC是什么?如何形成BFC,有什么作用?

BFC:Block Formatting Context,當涉及到可視化布局的時候,Block Formatting Context提供了一個環境,HTML元素在這個環境中按照一定規則進行布局。一個環境中的元素不會影響到其它環境中的布局。

只要滿足下列任何一個條件,就會形成BFC:
<li>float的值不為 none
<li>position的值不為 static或者 relative
<li>display的值為 table-cell , table-caption, inline-block , flex, 或者 inline-flex中的其中一個
<li>overflow的值不為 visible

BFC的作用有以下幾個:
<li>防止外邊距合并
<li>清除浮動
<li>防止文字環繞
<li>設計頁面布局


5.以下代碼每一行的作用是什么? 為什么會產生作用? 和BFC撐開空間有什么區別?

.clearfix:after { /*在 clearfix:after 后添加一個元素 */
     content: '';  /* 元素內容為 " " ,即為空元素 */
     display: block;  /* 將元素定義為塊元素 */
     clear: both; /* 清除浮動 */
}
.clearfix { 
     *zoom: 1; /* “*”號是IE6~8的一個bug,IE6~8看到以“*”開頭的代碼,會忽略星號,執行后面的代碼。而zoom的原意是放大。它也會觸發BFC,在IE里面其實不叫BFC,叫hasLayout,只有IE中會識別這個代碼,此代碼的作用是兼容IE */
}```
這段代碼的作用是讓父元素感知到子元素的存在,從而撐開父元素。而BFC是形成一個獨立的不受影響的空間。
***
本文版權歸本人和饑人谷所有,轉載請注明來源。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容