margin合并和塌陷的問題

這一篇來說明一下css當(dāng)中一些bug,這兩個bug出現(xiàn)在margin屬性上面乔宿,分別是margin合并和margin塌陷

margin合并

首先我們理解一下margin的正常效果蹂午,比如下面的例子,我們通過margin讓兩個元素隔開

<span class="left">我在左邊</span>
<span class="right">我在右邊</span>
.left{
    color: red;
    margin-right: 20px; 
}
.right{
    color: green;
    margin-left: 20px;
}
/* 這樣設(shè)置之后舞箍,他們之間的間距應(yīng)該是 20px + 20px = 40px */

當(dāng)然顯示出來的樣子和我們預(yù)期的是一樣的溃蔫!


正常的margin.png

那么margin合并出現(xiàn)在什么地方呢?那么我們來看一下上下布局的時候扎狱,這里的margin的情況

<div class="top">我在上面</div>
<div class="bottom">我在下面</div>
.top{
    width: 100px;
    height: 100px;
    background: red;
    margin-bottom: 100px;
}
.bottom{
    width: 100px;
    height: 100px;
    background: green;
    margin-top: 100px;
}
/*理論上我們看到的應(yīng)該是兩個div上下相隔200px*/

但是實際上和我們猜測的有點出入侧到,它們這里的div的高度是100px


合并了的margin.png

所以什么是margin合并呢?

兄弟結(jié)構(gòu)水平方向的margin正常委乌,但是垂直方向上面的margin會合并,并且這里的取到的是較大的一個荣回,一般情況下遭贸,margin合并我們可以不處理,合理安排垂直方向的margin就能達到需求效果心软。

margin塌陷

父子結(jié)構(gòu)的元素,垂直方向上的margin,會取最大那個

<div class="box">
    <div class="wrapper">
        <div class="content"></div>
    </div>
</div>
.box{
    width: 300px;
    height: 300px;
    border: 1px solid #ccc;
}
.wrapper {
    width: 100px;
    height: 100px;
    background: #000;
    margin-top: 50px;
    margin-left: 50px;
}
.content {
    margin-left: 100px;
    /*margin-top: 100px;*/
    width: 50px;
    height: 50px;
    background: orange;
}

根據(jù)上面代碼恼布,我們先將margin-top給注釋掉攒射,看一下結(jié)果


正常的margin.png

我們可以看到,我們的黃色方塊根據(jù)黑色方塊向左移動了100px猎唁,這樣可以理解咒劲,很正常,但是當(dāng)我們將注釋的代碼打開的時候,根據(jù)上面的經(jīng)驗我們應(yīng)該看到的是黃色的方塊到了黑色的方塊的對角線的下方腐魂。


塌陷的margin.png

顯然這里出現(xiàn)出乎預(yù)料的問題帐偎,就是我們的黃色的方塊帶著黑色方塊向下移動了50px,當(dāng)然這就是margin塌陷的問題了蛔屹,感覺我們的黑色的盒子在垂直方向上面好像不能夠作為margin對應(yīng)的參照物了削樊,好像頭頂是空的,這就是取名margin塌陷的原因兔毒。其實這里的margin的算法是這樣的==他們的兩個的margin會根據(jù)較大的一個取==漫贞,也就是父子在水平方向上,誰大聽誰的育叁,而且是相對有頭頂?shù)脑?

先了解一下BFC

BFC: block format context - 塊級格式化上下文迅脐,每一個盒子當(dāng)中都有一套正常的渲染規(guī)則,但是我們可以通過一些語法擂红,來觸發(fā)bfc仪际,讓這個盒子的渲染規(guī)則不一樣! 就是這個渲染規(guī)則的改變昵骤,剛好就解決了margin塌陷的問題树碱,下面是觸發(fā)bfc的語法:

  1. position: absolute;
  2. display:inline-block;
  3. float:left / right
  4. overflow: hidden;

margin塌陷的解決方案

  1. 給父級元素变秦,上面的黑色盒子成榜,加一個頭頂,直接使用border-top來處理蹦玫,但是這樣會帶來更多的問題赎婚,多了的border像素影響也是不小的。
  2. 使用overflow:hidden樱溉;來觸發(fā)bfc來解決挣输,overflow:hidden;自己也有自己的含義福贞,溢出部分隱藏撩嚼,這個方法有個缺點就是,假如我們有使用js來更換子元素的位置的時候挖帘,一旦出了盒子完丽,就不能顯示了
  3. 其他觸發(fā)bfc的方法
    如上的方案我們根據(jù)實際情況來選擇,比如假如父級元素剛好就要加邊框拇舀,那么我們就剛好可以選擇第一種方法逻族,根據(jù)需求合理的選擇。

使用bfc來處理margin合并骄崩,高端一下

其實我們可以使用bfc來處理margin合并的情況聘鳞,給兩個元素或者其中一個元素加上一個父級元素薄辅,并讓父級元素觸發(fā)bfc

<div class="box">
    <div class="top"></div>
</div>
<div class="box">
    <div class="bottom"></div>
</div>
.box{
    overflow: hidden;
}
.top {
    width: 100px;
    height: 100px;
    background-color: red;
    margin-bottom: 100px; 
}
.bottom {
    width: 100px;
    height: 100px;
    background-color: green;
    margin-top: 100px;
}

處理好的結(jié)果:


bfc解決margin合并.png

但是這種方法是不推薦的,主動去改變html結(jié)構(gòu)是很不理想的做法8橥础3げ蟆!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸡典,一起剝皮案震驚了整個濱河市源请,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彻况,老刑警劉巖谁尸,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纽甘,居然都是意外死亡良蛮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門悍赢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來决瞳,“玉大人,你說我怎么就攤上這事左权∑ず” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵赏迟,是天一觀的道長屡贺。 經(jīng)常有香客問我,道長锌杀,這世上最難降的妖魔是什么甩栈? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮糕再,結(jié)果婚禮上量没,老公的妹妹穿的比我還像新娘。我一直安慰自己突想,他們只是感情好殴蹄,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒿柳,像睡著了一般饶套。 火紅的嫁衣襯著肌膚如雪漩蟆。 梳的紋絲不亂的頭發(fā)上垒探,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音怠李,去河邊找鬼圾叼。 笑死蛤克,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夷蚊。 我是一名探鬼主播构挤,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惕鼓!你這毒婦竟也來了筋现?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箱歧,失蹤者是張志新(化名)和其女友劉穎矾飞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呀邢,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡洒沦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了价淌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申眼。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝉衣,靈堂內(nèi)的尸體忽然破棺而出括尸,到底是詐尸還是另有隱情,我是刑警寧澤买乃,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布姻氨,位于F島的核電站,受9級特大地震影響剪验,放射性物質(zhì)發(fā)生泄漏肴焊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一功戚、第九天 我趴在偏房一處隱蔽的房頂上張望娶眷。 院中可真熱鬧,春花似錦啸臀、人聲如沸届宠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌注。三九已至,卻和暖如春灯萍,著一層夾襖步出監(jiān)牢的瞬間轧铁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工旦棉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留齿风,地道東北人药薯。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像救斑,于是被迫代替她去往敵國和親童本。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 在什么場景下會出現(xiàn)外邊距合并鄙煤?如何合并?如何不讓相鄰元素外邊距合并茶袒?給個父子外邊距合并的范例 外邊距合并:外...
    進擊的阿群閱讀 912評論 1 2
  • 1. 前言 前端圈有個“固莞眨”:在面試時,問個css的position屬性能刷掉一半人薪寓,其中不乏工作四五年的同學(xué)亡资。在...
    YjWorld閱讀 4,453評論 5 15
  • 1.在什么場景下會出現(xiàn)外邊距合并母谎?如何合并瘦黑?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 概念:在CSS當(dāng)...
    饑人谷_任磊閱讀 651評論 0 3
  • 一甲葬、在什么場景下會出現(xiàn)外邊距合并?如何合并懈贺?如何不讓相鄰元素外邊距合并经窖?給個父子外邊距合并的范例 在CSS當(dāng)中,相...
    dengpan閱讀 575評論 0 0
  • 杯里的紅酒漾著微波 夜已經(jīng)深了 落寞和孤寂吞噬著每一寸白骨 拾杯傾飲而盡 昨夜共我歡愉的人 如狼似的卷走了所有 惟...
    六兩三余三閱讀 217評論 0 0