2012-03-01 62 views
4

這是一個謎題。基本的頁面,一個元素:爲什麼嵌套的HTML元素會讓我的CSS跳轉?

http://jsfiddle.net/PZj6t/

HTML:

<div id="container"></div>​ 

CSS:

body, html { 
    height: 100%; 
    margin: 0; 
    padding: 0; 
    background-color: black; 
} 
#container { 
    position: relative; 
    margin: 0 auto; 
    width: 400px; 
    height: 100%; 
    background-color: #666; 
} 
​ 

這一個看起來我怎麼想,與#container的整齊齊平頂端。但是,當我添加一個嵌套元素:

http://jsfiddle.net/PZj6t/1/

HTML:

<div id="container"> 
    <nav id="topnav"></nav> 
</div>​ 

CSS(新):

#topnav { 
    width: 100%; 
    height: 40px; 
    margin: 30px 0; 
    background-color: red; 
} 
​ 

容器跳下來。似乎從#topnav的邊緣頂部以某種方式傳遞給容器,現在該頁面有一個我不想要的滾動條。 (我正在Chrome中進行測試。)我如何防止這種情況發生?

(作爲進一步的謎,如果我添加border: 1px solid white;到#集裝箱的CSS,跳躍消失。這將是罰款,但還增加了兩個象素值得不良滾動到頁面。)

+1

您正在爲已經100%高的項目添加保證金。改爲使用填充。 – 2012-03-01 15:40:23

+0

@Diodeus導航不是100%的高度,容器是。該容器沒有聲明的垂直邊距。 – Blazemonger 2012-03-01 15:46:31

回答

4

這是由於CSS的一個叫做邊緣摺疊的功能。如果父元素上沒有填充或邊框,則父元素及其子元素的邊距會「摺疊」爲較大的值,並且基本上應用於父元素。

對於你的情況,我建議簡單地把容器內的附加內包裝,並拋出它的一些填充來模擬你正在尋找:29.3 http://jsfiddle.net/PZj6t/3/

#inner股利或低於內的所有內容應該像您期望的那樣行事,因爲邊距只有在他們父母的邊緣時纔會崩潰(並且沒有填充或邊框)。

+0

有趣的功能 - 我知道相鄰元素的邊距崩潰了,但我從來沒有注意到它也適用於嵌套元素。在我作爲開發人員的所有年份裏,直到現在,它從未影響我的工作。 – Blazemonger 2012-03-01 16:16:50

1
display:inline-block; 

在您的導航元素出現將解決此問題。其關於邊緣摺疊的更多細節請參見here

+0

這似乎是最簡單的解決方案,儘管我必須在#topnav之後調整其他元素的邊距。 – Blazemonger 2012-03-01 15:54:59

1

Jblasco是正確的,這是一個整潔的解決方案,但:http://jsfiddle.net/PZj6t/4/

#container { 
    position: relative; 
    margin: -1px auto 0; 
    width: 400px; 
    height: 100%; 
    padding-top:1px; 
    background-color: #666; 
} 
#topnav { 
    width: 100%; 
    height: 40px; 
    margin: 29px 0 30px; 
    background-color: red; 
} 
+0

使用'height:100%'添加任何類型的填充將導致頁面上的垂直滾動條。也許如果他在'#container'上使用'display:border-box',這將是一個好的解決方案。 – justis 2012-03-01 15:46:27

+0

負邊會做到這一點。雖然位不雅......( – daveyfaherty 2012-03-01 15:50:56

+0

也是'display:border-box'我的意思是'box-sizing:border-box'。我仍然覺得搞'盒子尺寸'或使用負邊距是粗略的雖然 – justis 2012-03-01 15:55:32

相關問題