2012-07-26 113 views
5

我一直認爲CSS邊緣背後的基礎理論非常簡單。邊距爲10px的div會在該元素周圍創建10px的坐墊。當兩個div並排放置時,兩者的邊距均爲10px,這會導致div的間距爲20px;這兩個元素都有一個10px的邊距,這導致元素之間的距離爲20px。這似乎是正確的,而且我一直認爲這是事實。一個簡單的CSS邊距問題

但是,我最近發現,如果不是兩個div並排放置,而是將一個放在另一個下面,那麼兩個元素之間的距離現在只有10px。其他div發出的10px頁邊距發生了什麼變化?爲什麼並排和垂直堆疊不一致?

邊距本質上是說「不要在我的x像素內放置任何東西」。通過「任何事物」,這是否包括其他元素的利潤率?在並排的情況下,答案似乎是肯定的,保證金說「不要把任何東西,包括你自己的保證金,放在我的x像素以內」。在垂直的情況下,它似乎允許後者?

請某人能澄清,所以我可以把它放在牀上,繼續我的夜晚:)

+0

你能提供一個例子嗎?我不認爲我曾親眼目睹過這種行爲。 – Zeta 2012-07-26 19:05:52

+1

代碼的一個例子會對HTML和CSS都有幫助。 – 2012-07-26 19:06:38

+1

可能的重複:http://stackoverflow.com/questions/3906640/css-margins-overlap-problem – DACrosby 2012-07-26 19:08:44

回答

1

它有讓他們旁邊堆到彼此時,他們inlineinline-block它改變了他們的財產做而不會將邊際合併在一起(這是正常的,但是不直觀的行爲)。當他們在默認display:block財產

http://jsfiddle.net/xeCZJ/3/

邊距崩潰。您可以使用inline-block使它們按照您的預期運行,但您必須用br或含有元素的寬度手動控制換行符。

或者您可以使用填充而不是邊距。

+0

您的'display:inline'和'display:block'的邊距在輸出中看起來是相同的高度。我沒有看到你說的區別。我也嘗試過,'display:inline'似乎沒有保證金的工作(如你所說,需要填充)。 http://jsfiddle.net/Z2nUN/2/ – DACrosby 2012-07-26 19:19:31

+0

看看'block'和'inline-block'之間的區別與換行符(簡單的例子:http://jsfiddle.net/xeCZJ/4/)''內聯塊「不會摺疊頁邊距,但是你必須強迫它以某種方式下到下一行。對於'inline',沒有垂直邊距,但可以告訴水平距離是40px,而不是20px。 – brentonstrine 2012-07-26 19:20:54

+0

http://jsfiddle.net/Z2nUN/4/不夠公平,'display:inline-block'似乎將兩個邊距加在一起並且不會摺疊它們。 – DACrosby 2012-07-26 19:23:18

1

看起來像display:inline忽略所有頂部/底部邊距,display:block允許邊距摺疊,並且display:inline-block將它們加在一起以獲得大量邊距。結帳這個jsFiddle例如:http://jsfiddle.net/Z2nUN/4/

<p>Some content</p> 
<p>some more content</p> 
<p class="wideMargin">some more extra content</p> 
<p class="narrowMargin">less extra content</p> 
<p>Some content</p> 
<p>some more content</p> 
<p class="wideMargin">some more extra content</p> 
<p class="narrowMargin">less extra content</p> 

<hr /> 
<div class="allBlock"> 
<p>Some content</p> 
<p>some more content</p> 
<p class="wideMargin">some more extra content</p> 
<p class="narrowMargin">less extra content</p> 
</div> 

<hr /> 
<div class="allInlineBlock"> 
<p>Some content</p> 
<p>some more content</p> 
<p class="wideMargin">some more extra content</p> 
<p class="narrowMargin">less extra content</p> 
<p>Some content</p> 
<p>some more content</p> 
<p class="wideMargin">some more extra content</p> 
<p class="narrowMargin">less extra content</p> 
</div>​ 


p{ margin:10px; background:#ccc; display:inline;} 
.wideMargin{ margin:30px;} 
.narrowMargin{ 0px; } 
.allBlock p{ display:block;} 
.allInlineBlock p{ display:inline-block;}​ 

永遠不會注意到這一點。我猜,今天我學會了。

編輯:添加顯示:塊和inline-block的

1

看來你找到了自己的答案:倒塌的利潤率是CSS2.1 recommendationCSS3 working draft的一部分。後者取決於block-progression,默認爲'tb'(上 - 下)。這將導致只有頂部/底部邊距崩潰。爲了瓦解左/右頁邊距,一個將不得不使用block-progression:lrblock-progression:rl

  • 一個框的左邊距,如果利潤率比鄰與其父盒B的左邊距崩潰B是'r1'或'lr'。
  • 如果邊距相鄰且B爲'rl'或'lr',則框A的右邊緣與其父框B的右邊緣摺疊。

可惜block-progression不在newest working draft,是不太可能通過任何瀏覽器來實現。自2007年以來,CSS3盒子模塊尚未更新,因此不清楚何時能夠得到明確的答案。

+0

感謝您的輸入。我在這裏學到了一些東西。 – Alex 2012-07-26 19:46:45

+0

作爲一個方面說明,我其實更喜歡一個他們不會崩潰的世界。這對我來說似乎更符合邏輯,並且在規劃佈局時更易於可視化。防止摺疊頂部 - >底部的選項似乎更適合將它們摺疊到左側 - >右側的選項 – Alex 2012-07-26 19:50:46

+0

@Alex:如果您使用計劃佈局,則使用絕對或相對定位而不是邊距通常更好,尤其是因爲絕對定位元素的保證金永遠不會崩潰。 – Zeta 2012-07-26 20:02:21