2011-01-21 9 views
1

#childのサイズが#parentと異なる理由を理解できますか?親ディメンションと子ディメンションの計算

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Title</title> 
    </head> 
    <body> 
     <div id='parent' style='border: 1px solid black'> 
      <div id='child' style='background-color: #888888'> 
       <p>Here is some content</p> 
       <div id='grandchild' style='margin-bottom: 1em'> 
        <p>A little more content</p> 
       </div> 
      </div> 
     </div> 
    </body> 
</html> 
+0

パディング?マージン? – SuperSaiyan

+0

+1これは私には奇妙です。 – Jake

答えて

3

ここでは何が起こっているのですか。

マージン折りたたみ。ジェーレンの答えは、私に頭痛を与えたW3C box model specs for collapsing marginsに私を指摘し、国境の質問にはあまり答えなかった(Odedが最初に指摘した)。次に、私はthis articleを見つけて解決策をまとめました(私はトップマージンについて話していますが、まったく同じ解決策がボトムマージンに当てはまります)。 2 [ブロックレベル]要素の垂直マージンが触れている

  1. 大きなマージンが使用され、小さなマージンが破棄されます。

  2. コード内のすべてが、<html><body>タグを含むブロックレベルの要素とみなされます。

  3. <body>は、親の<html>要素内にデフォルトのmargin-topの8pxを持っています。

  4. 最初の<p>タグのデフォルト値はmargin-topで、16pxです。

  5. マージン折りたたみは兄弟に限定されないため、<p>タグは親タグの位置とマージンをチェックし始めます。

  6. #child要素は<p>トップマージンが#child上部マージンに触れているので、それらは単一16pxにマージン(> 0 16)に崩壊0のmargin-topを有しています。 <p>タグの16ピクセルマージンは「プッシュスルー」し、#childタグのマージンとして機能します。

  7. <p>からの16pxマージンは、それの真上のマージンをまだチェックしています。次までも0

  8. のマージントップを持っていますが、#parent上の1ピクセルの境界線は、任意のさらなる行くから<p>を防ぐことができます。#parentタグ、だろう<p>は、1pxの境界線に接触しているため、それより上に余白が残っていません。だから、崩壊は#parentの上端の内側で止まります。

  9. 16ピクセルの余白がレンダリングされ、その下に0ピクセルのマージンが崩壊した#childタグがあります。

    #parentボックスが#childボックスより32PX背が高い理由です

:彼らはマージン(1ピクセルの境界線)でなかった何かを打つまで<p>マージンが「通過墜落しました」。だから、もし#parentの1pxボーダーが崩壊を止めていなかったらどうなるでしょうか?

  1. 上記の手順1〜7に従います。

  2. <p>の上マージンは、#parent要素の0pxのマージンになります。再び、<p>がより大きいマージン(16対0)なので、折り畳みは上方に続きます。

  3. <p>の上マージンは<body>タグに当ります。 <body>のデフォルトの上マージンは8pxです。 <p>タグが大きいので、<body>タグは16pxの上マージンを「継承」し、8pxは破棄されます。

  4. <p>先頭余白は<html>タグに達します。 <html>がルート要素であるため、ここで折り畳みが停止します。 <body>タグは16pxの上マージンでレンダリングされ、#parent,#child、および<p>要素はすべて下にレンダリングされます。 <p>は、マージンがクラッシュしたため、#parentボックスの内側にぴったりです。

これは把握してくれそう長くかかった理由は、私は今日まで余白を崩壊の聞いたことがなかったのと同じ理由です:Firebugのは明らかに崩壊マージンを示していません。 Firebugでは、<p>タグはまだ16pxの上限を保持していることを示しています。これは本当です。ただし、折りたたみが発生したという兆候はありません。廃棄されても、<body>タグは8pxの上端を報告します。

私はこれを今知ってうれしいです。私はページレイアウトについて多くの混乱を明らかにしています。


編集:

The article I referencedが読み取り本当に価値があります。それは私に答えに必要な情報を与えただけでなく、それはIE7でどのように詳細が<body>タグは国境が崩壊に参加していない詳細。それはたくさん説明します。

+0

恐ろしい答えです;すべてを説明してくれてありがとう! – WorkerThread

+0

問題ありません。お役に立てて嬉しいです! – Jake

1

あなたの親divの境界線は1pxの周囲にあり、子供はそうではないためです。

これは、親divの幅と高さに2ピクセルを追加します。

+0

なぜ国境がそれを引き起こすのですか?私は、境界線を追加すると、境界線の太さを除いて、寸法には影響しないと思います。編集:このコメントが明確でない場合は、はい、境界線が寸法を変える原因になっているのは間違いありません。なぜか分からない。 – WorkerThread

1

pbottom-marginの標準マージンが#grandchildにあるためです。彼らはbodyの標準マージンで崩壊します。

body,pなどで余白をリセットし、余白の代わりに余白を使用することで回避できます。パディングは崩壊しません。

+0

'border:1px solid black'はどのように動作が異なりますか? – Jake

+0

@Jake、これは非常に良い質問です。答えはおそらくW3Cの文書のどこかにあります。そこで、ボックスモデルとマージンの縮小について話しています。ボックスが関係するところでは、マージンが悪い頭痛を引き起こす可能性があるので、私は通常パディングに頼っています。 – jeroen

関連する問題