2009-08-21 13 views
1

So habe ich schon seit einiger Zeit html gemacht .. aber ich habe Probleme, wenn ich Ränder benutze. Dies führt dazu, dass ich normalerweise nur Padding verwende.Top Margin verhält sich nicht wie ich erwarte .. warum?

Wie auch immer, lassen Sie mich Ihnen ein Beispiel für etwas geben, an dem ich gerade arbeite.

http://vasoshield.xcsit.com/index.html

Hauptstruktur:

<div id="main"> 
    <div id="header"> 
     <div id="mainNav"> 
      main navigation... 
     </div> 
    </div> 
    <div id="content"> 
     page content... 
    </div> 
</div> 



#main { 
    margin: 0 auto; 
    width: 745px; 
    padding-left: 175px; 
    padding-right: 50px; 
    background: url(../images/white_bg.jpg) no-repeat top left; 
    position: relative; 
} 

#header { 
    height: 210px; 
} 
#mainNav { margin-top: 175px; } 

Das Problem ist .. Ich margin-top setzen: 150px auf der "Mainnav" div .. und statt nach unten drücken 150px von "header" div .. die ganze Seite wird nach unten bewegt. Also wird der "Haupt" -Teil tatsächlich 150px gedrückt. Ich verstehe nicht warum !! Wenn ich padding-top: 150px für "mainNav" div verwende, benutzt es tatsächlich den "header" div um von dort herunter zu drücken.

Macht meine Frage Sinn?

Ich bin sicher, dass es eine Art Regel gibt, von der ich nichts weiß. Danke im Voraus !!

Antwort

6

Sie sind den Umgang mit Kollabieren Margen.

See: http://www.w3.org/TR/CSS21/box.html#collapsing-margins

Kurz gesagt, der obere Rand von #main und #header sind neben (angrenzende) die Marge von #mainNav. Solche vertikal angrenzenden Ränder sind im Allgemeinen kollabiert; sie bilden eine kombinierte Marge. Vergleichen Sie dies mit den Td-Grenzen mit border-collapse: collapsed - auch diese werden nur zu einer Grenze, deren Breite gleich der dicksten Grenze ist.

Nur vertikale Ränder kollabieren, und sie kollabieren nur, wenn sie aneinandergrenzen, und sie sind nicht spezielle. Weitere Details finden Sie in der Spezifikation, aber Dinge wie absolute Positionierung, Floating und einige andere Dinge verhindern, dass die Ränder kollabieren.

Zum Beispiel könnten Sie #header { padding-top:1px; } setzen, oder Sie wenden einen der spezifizierten Fälle an, die verhindern, dass Grenzen aneinander grenzen (wie das Floaten des Elements). Beachten Sie, dass Floating und die anderen Fälle verhindern, dass die Ränder kollabieren, um die Spezifikation zu vereinfachen: Sie betreten komplexes Gebiet, für wenig Gewinn.

Ihre Fallback-Option, Padding statt Rand zu verwenden (oder jede Art von Zwischenabstand anzuwenden, wie die 1px-Padding, die ich zuvor beschrieben habe), sind die bessere Wahl; Sie wirken sich minimal auf den Rest Ihres Layouts aus, während die Einführung von Floats und/oder absoluter Positionierung zu merkwürdigen Interaktionen führen kann, sobald Seiten komplex werden (insbesondere, wenn Sie anfangen, Druckszenarien in Betracht zu ziehen).

+1

cool. Das erklärt die Logik dahinter. Grundsätzlich, wenn ich verhindern kann, dass die Ränder kollabieren, ist mein Problem gelöst. Hinzufügen von "overflow: hidden" Ich nehme an, dass das div "special" ist, was wiederum das Kollaps verhindert (genau wie border oder padding etc). habe ich recht? – Roeland

+0

Ja, '' header {overflow: hidden; } 'wird gut funktionieren und ist ein bisschen einfacher als meine Idee, eine winzige Top-Padding zu setzen. Gute Idee! –

-1

versuchen Sie, Ihre Hauptposition in Position zu bringen: absolut; Es wird funktionieren, denke ich. Ich kenne den Grund nicht

+0

Das funktioniert genauso wie mein Kommentar zu 'overflow: hidden'.Mit 'position: absolute' wird das Element auch als neue "flow root" definiert, aber "position: absolute" ist für dieses spezielle Problem bei weitem nicht so gut, da es unbeabsichtigte Konsequenzen für das Layout haben kann. – Wick

0

Da gibt es keinen Inhalt in der header div vor der mainNav Div, der Rand ist die erste Sache, die der Browser berücksichtigen muss, so sieht es aus, als ob die ganze Seite nach unten verschoben wird . Ich schlage vor, allen Divs 1px solid red Grenzen hinzuzufügen, damit Sie sehen können, welcher wo geht.

+1

Tatsächlich fügt das Hinzufügen von 'border: 1px solid red' hinzu, dass Ränder nicht kollabieren ;-). Das macht Debugging-Komplex ... Was Sie wollen, ist "Umriss: 1px rot gestrichelt;" - das wird nur eine Kontur überlagern ohne Layout zu ändern (funktioniert in allen gängigen Browsern außer IE7 oder älter) –

+0

das ist REALY nett zu kennt. Grenze meist verwirrt Layout, weil ich normalerweise Sachen pixel perfekt float .. so 1 Pixel zu viel wirft das Layout. – Roeland

+0

@Roeland: Es gibt viele Möglichkeiten, CSS-Layouts zu debuggen. Sie können auch verschiedene Hintergrundfarben oder Bilder oder was auch immer verwenden. Nur eine Einstellung wird nicht helfen :) –

1

Nun .. einfach hinzufügen Überlauf: versteckt, um den "Haupt" Container funktioniert .. fragt mich nicht warum!

+0

'overflow: hidden' funktioniert, weil das Teil des beabsichtigten Verhaltens der Boxmodellspezifikation ist. Sehen Sie sich den Regelsatz unter "Beispiel X" an unter http://www.w3.org/TR/css3-box/#collapsing-margins ... Wenn Sie die Überlauf-Eigenschaft auf etwas anderes als 'visible' setzen, wird das Element eingerichtet als "Flow-Root", was im Wesentlichen bedeutet, dass es seinen eigenen Formatierungskontext etabliert. Dieser Trick (kein Hack!) Ist super praktisch, um Schwebekörper aufzunehmen und kollabierende Ränder zu verhindern. – Wick