2013-10-31 77 views
130

是否有辦法完全禁用邊界摺疊?我發現的唯一解決方案(通過名稱「uncollapsing」)需要使用1px邊框或1px填充。我覺得這是不可接受的:無關的像素使計算複雜化,沒有理由。有沒有更合理的方法來禁用這個邊緣摺疊?如何禁用邊緣摺疊?

+2

使用Flex或網格佈局,其中利潤率倒塌不存在:HTTPS: //stackoverflow.com/a/46496701/3597276 –

+0

時,只需提供元素值'保證金bottom'但留下'保證金top'爲0 –

回答

177

主要有兩種類型的保證金崩潰:在相鄰元件之間

  • 摺疊利潤率
  • 摺疊父和子元素

之間的利潤使用填充或邊框將防止崩潰只在後一種情況。此外,overflow與應用於父級的默認值(visible)不同的值將防止崩潰。因此,overflow: autooverflow: hidden都具有相同的效果。也許使用hidden時唯一的區別是隱藏內容的意想不到的後果,如果父母具有固定的高度。

,一旦應用於父其它性能,可以幫助解決這個問題是:

  • float: left/right
  • position: absolute
  • display: inline-block

你可以在這裏測試他們都: http://jsfiddle.net/XB9wX/1/

我應該補充說,像往常一樣,Internet Explorer是個例外。更具體地說,在爲父元素指定某種佈局時,IE 7邊距不會摺疊,例如width

來源:SitePoint的文章Collapsing Margins

+0

注意,填充也會影響到這一點,如果它不是零值 –

+3

需要注意的是'溢出:auto'可能會出現滾動條的父元素,而不是讓溢出內容溢出按'溢出:visible'。 – Leo

+0

'overflow:auto'在Chrome v44中似乎不起作用。 – tkane2000

19

overflow:hidden可以防止塌陷餘量,但它不是免費的副作用 - 即它...隱藏溢出。

除了這個以及你所提到的,你只需要學習它們,並在今天學習,當他們真正有用(每3到5年)。

+0

已經把我的答案INT o社區wiki。我想我已經在第二段的最後兩行中提到了你提到的副作用:_或許使用隱藏的唯一區別是隱藏內容的意想不到的結果,如果父對象具有固定的height_。但如果您覺得需要進一步澄清,請隨時參與。謝謝。 – hqcasanova

+4

'overflow:auto'很好用來防止隱藏溢出,並且仍然可以防止收縮邊距。 – Gavin

42

您也可以使用這個好老微clearfix。

#container:before, #container:after{ 
    content: ' '; 
    display: table; 
} 

見更新小提琴:基於http://jsfiddle.net/XB9wX/97/

+0

已將我的答案轉化爲社區wiki。請隨意用您的答案來擴展它。謝謝。 – hqcasanova

+3

我不明白這一點,當我查看示例中的利潤正在崩潰(只有div的,而不是20像素之間10px的垂直空間) – Andy

+1

這有助於僅去除兄弟姐妹,所有已應用此clearfix之間的崩潰。我已經舉了一個例子來證明這一點:http://jsfiddle.net/dpyuyg07/ ---即使這不是全部。它只會消除源自應用修復程序的元素的子元素的利潤率的崩潰。如果你想補充容器本身的利潤率仍然會崩潰,可以在這個叉子上可見保證金:http://jsfiddle.net/oew7qsjx/ – NicBright

8

每一個WebKit瀏覽器應該支持的屬性-webkit餘裕崩潰。還有一些子屬性只能將其設置爲頂部或底部邊距。您可以將值設爲collapse(默認值),放棄(如果存在相鄰邊距,則將邊距設置爲0),並將其分隔(防止邊距摺疊)。

我測試過這個版本適用於2014版Chrome和Safari。不幸的是,我不認爲這會在IE中被支持,因爲它不是基於webkit。

閱讀Apple's Safari CSS Reference有完整的解釋。

如果您檢查Mozilla's CSS webkit extensions page,它們將這些屬性列爲專有,並建議不要使用它們。這是因爲他們很可能不會很快進入標準CSS,只有基於webkit的瀏覽器纔會支持它們。

+0

這很好,因爲它可以幫助我們消除Safari和Chrome處理邊距時的不一致性。 – bjudson

28

一個巧妙的方法來禁用保證金崩潰不具有視覺衝擊力,因爲據我所知,在父的填充設置爲0.1px

.parentClass { 
    padding: 0.1px; 
} 

的填充不再是0,所以壓扁贏得」 t發生了,並且填充小於0.5px,因此在視覺上它將舍入爲0.

如果需要其他填充,則僅將填充應用於不需要使用邊緣摺疊的「方向」,例如padding-top: 0.1px;

工作例如:

.noCollapse { 
 
    padding: 0.1px; 
 
} 
 

 
.parent { 
 
    background-color: red; 
 
    width: 150px; 
 
} 
 

 
.children { 
 
    margin-top: 50px; 
 

 
    background-color: lime;  
 
    width: 100px; 
 
    height: 100px; 
 
}
<h3>Border collapsing</h3> 
 
<div class="parent"> 
 
    <div class="children"> 
 
    </div> 
 
</div> 
 

 
<h3>No border collapsing</h3> 
 
<div class="parent noCollapse"> 
 
    <div class="children"> 
 
    </div> 
 
</div>

+2

這是我最喜歡的解決方案。您甚至可以將其作爲默認樣式。爲什麼不? '* {填充頂:0.1px}'。我們確定它可以在所有瀏覽器中使用嗎? –

+0

到目前爲止我的工作還算不錯,但我並沒有聲稱在大多數瀏覽器中對它進行了徹底的測試。 –

+2

非常好的解決方案,它似乎在大多數瀏覽器上按預期工作。感謝分享! – wiredolphin

5

我知道,這是一個很老的文章,但只是想說,使用父元素Flexbox的將禁用保證金坍塌其子元素。

+0

不僅對於它的子元素 - 它還防止父母和第一個和最後一個孩子之間的邊緣崩潰。 –

2

我有類似的問題,因爲家長有position設置爲相對邊緣崩潰。以下是可用於禁用邊緣摺疊的命令列表。

這裏是操場自我測試

剛剛嘗試任何parent-fix*類分配給div.container元素,或任何一類children-fix*div.margin。選擇最適合您需求的產品。

  • 保證金倒塌禁用div.absolute用紅色背景將被放置在頁面的最頂端。
  • 利潤率崩潰div.absolute將被定位在相同的Y座標爲div.margin

html, body { margin: 0; padding: 0; } 
 

 
.container { 
 
    width: 100%; 
 
    position: relative; 
 
} 
 

 
.absolute { 
 
    position: absolute; 
 
    top: 0; 
 
    left: 50px; 
 
    right: 50px; 
 
    height: 100px; 
 
    border: 5px solid #F00; 
 
    background-color: rgba(255, 0, 0, 0.5); 
 
} 
 

 
.margin { 
 
    width: 100%; 
 
    height: 20px; 
 
    background-color: #444; 
 
    margin-top: 50px; 
 
    color: #FFF; 
 
} 
 

 
/* Here are some examples on how to disable margin 
 
    collapsing from within parent (.container) */ 
 
.parent-fix1 { padding-top: 1px; } 
 
.parent-fix2 { border: 1px solid rgba(0,0,0, 0);} 
 
.parent-fix3 { overflow: auto;} 
 
.parent-fix4 { float: left;} 
 
.parent-fix5 { display: inline-block; } 
 
.parent-fix6 { position: absolute; } 
 
.parent-fix7 { display: flex; } 
 
.parent-fix8 { -webkit-margin-collapse: separate; } 
 
.parent-fix9:before { content: ' '; display: table; } 
 

 
/* Here are some examples on how to disable margin 
 
    collapsing from within children (.margin) */ 
 
.children-fix1 { float: left; } 
 
.children-fix2 { display: inline-block; }
<div class="container parent-fix1"> 
 
    <div class="margin children-fix">margin</div> 
 
    <div class="absolute"></div> 
 
</div>

這裏是jsFiddle與例如,您可以編輯

0

爲了您的您可以使用01的信息格但副作用:)

.parent { 
    display: grid 
} 
2

其實,有一個完美的作品:

顯示:彎曲;柔性方向:列;

只要你可以只支持IE10生活和高達

.container { 
 
    display: flex; 
 
    flex-direction: column; 
 
    background: #ddd; 
 
    width: 15em; 
 
} 
 

 
.square { 
 
    margin: 15px; 
 
    height: 3em; 
 
    background: yellow; 
 
}
<div class="container"> 
 
    <div class="square"></div> 
 
    <div class="square"></div> 
 
    <div class="square"></div> 
 
</div> 
 
<div class="container"> 
 
    <div class="square"></div> 
 
    <div class="square"></div> 
 
    <div class="square"></div> 
 
</div>