2009-08-21 12 views
1

今、少しばかりHTMLをやっていますが、余白を使うと問題にぶつかります。これは、通常、単にパディングを使用するようになります。トップマージンは私の予想通りに動作しません。なぜですか?

とにかく、私が現在取り組んでいることの例を挙げておきます。

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

主な構造..、代わりに "ヘッダ" のdivからダウン150ピクセルプッシュの "mainNav" のdivに150ピクセル:私はマージントップを置く

<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; } 

問題が..です..ページ全体が下に移動します。だから "メイン"のdiv実際に150pxをプッシュ取得..私はなぜ理解していない! 「mainNav」divにpadding-top:150pxを使用すると、実際には「header」divを使用して下に移動します。

私の質問は意味がありますか?

私はちょうど知りませんルールのいくつかの並べ替えがあると確信しています。あらかじめありがとう!

答えて

6

マージンはです。

参照:要するにhttp://www.w3.org/TR/CSS21/box.html#collapsing-margins

、#mainと#ヘッダーの上マージンは#mainNavのマージンを(隣接する)の隣にあります。そのような垂直方向に隣接するマージンは、一般に崩壊する。それらは1つの合成マージンを形成する。これをborder-collapse: collapsedとのtdの境界線と比較してください。これらも1つの境界になり、幅は最も太い境界に等しくなります。

垂直マージンが崩壊するだけで、隣接している場合にのみ倒れます。特別なです。完全な詳細については仕様を参照してください。ただし、絶対配置、浮動小数点数などのようなものは、マージンが崩壊するのを防ぎます。

たとえば、#header { padding-top:1px; }を設定するか、境界線が隣接しないように指定された説明のうちの1つを適用します(要素をフローティングするなど)。フローティングと他のケースでは、スペックを単純化するためにマージンが崩壊するのを防ぎます。複雑な領域に入ることはほとんどありません。

余白の代わりにパディングを使用するか(前述の1pxパディングのような中間の間隔を適用する)フォールバックオプションを使用することをお勧めします。浮動小数点数や絶対位置を導入すると、ページが複雑になると(特に印刷シナリオの検討が始まると)奇妙なやり取りが発生する可能性がありますが、レイアウトの残りの部分にはかなりの影響があります。

+1

cool。それはその背後にある論理を説明しています。基本的に私がマージンが崩壊するのを防ぐことができれば、私の問題は解決されます。 "overflow:hidden"を追加すると、divが 'special'になり、畳まれないようになります(境界やパディングなどと同じように)。私は正しい? – Roeland

+0

ええ、 '#header {overflow:hidden; } 'はうまく動作し、ちょっとしたトップパディングを設定する考えよりかなり簡単です。良いアイデア! –

-1

あなたのメインのdivポジションをposition:absoluteに配置しようとします。それは私が思うように動作します。理由がわからない

+0

これは、上記の「オーバーフロー:非表示」に関するコメントと同じ理由で機能します。'position:absolute'を使用すると、新しい「フロールート」として要素が設定されますが、レイアウトに意図しない影響を及ぼす可能性があるため、「position:absolute」はこの特定問題の解決策とほとんど同じです。 – Wick

0

mainNav divの前に divに内容がないため、ブラウザが考慮する必要があるのは最初のマージンであるため、ページ全体が下に移動したように見えます。私はすべてのdivに1px solid redボーダーを追加することをお勧めします。

+1

実際、 'border:1px solid red'を追加すると、余白が崩れるのを防ぐことができます;-)。それは複雑なデバッグを行います...あなたがしたいのは 'outline:1px dotted red;' - レイアウトを変更せずに輪郭をスーパーインポーズするだけです(IE7以前の一般的なブラウザすべてで動作します) –

+0

本当にいいです知っている。境界線は、通常、レイアウトを邪魔します。なぜなら、私は通常、完全なピクセルのピクセルを浮動させるからです。 – Roeland

+0

@ Roeland:CSSレイアウトをデバッグする方法はまだまだあります。異なる背景色や画像などを使用することもできます。態度を持っているだけでは助けにならないでしょう:) –

1

まあ、単純にオーバーフローを追加: "メイン"コンテナに隠されています。

+0

'overflow:hidden'は、ボックスモデル仕様の意図された動作の一部であるため動作します。以下の "例X"のルールセットを参照してください。http://www.w3.org/TR/css3-box/#collapsing-margins ...オーバーフロープロパティを 'visible'以外に設定すると、基本的に独自の書式設定コンテキストを確立することを意味する「フロールート」として定義されます。このトリック(ハックではありません!)は、浮動小数点数を含むために便利です。 – Wick

関連する問題