質問
例えば、以下のデモのように子要素の上下左右にpaddingと同じ幅のネガティブマージンを指定してあげると、要素が膨らんで(???)、親要素全体がリンク領域になりますが、どういう仕組みでこのようになるのかが理解出来ません。
margin-topとmargin-leftにネガティブマージンを指定した場合に、左上に移動するのは感覚的に理解できるのですが、それらに加えて、margin-bottomとmargin-rightにもネガティブマージンを加えると、全体が上下左右に膨らむような挙動をするのが、なぜなのか理解出来ません。
どなたかどういう仕組みでこのようになっているか、ご存知の方がおりましたら、ご教示頂ければ幸いです。仕様が書かれている参照すべき対象ドキュメントを教えていただけるだけでも助かります!
結果
HTML
<div class="parent"> <a href="#" class="child">Link</a> </div>
CSS
.parent { padding: 25px; background-color: #cccccc; width: 300px; display: inline-block; } .child { display: block; background: red; padding: 25px; margin-top: -25px; margin-left: -25px; margin-right: -25px; margin-bottom: -25px; }
#Lhankor_Mhyさんの回答を元に以下を追加
width of containing block(.parent)
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block
0 + 0 + 25px + 300px + 25px + 0 + 0 = 350px
仮に.childを包含ブロックとした場合(.childは包含ブロックではないですよね?)
-25px + 0 + 25px + 300px + 25px + 0 + -25px = 300px
親は350pxである一方、子は300pxとなるので、なぜ、親要素と子要素の高さ、幅が一致するのかが、包含ブロックの幅の計算式によって、決まるのかが分からない。
仮に.childのマージンを取り除いた場合
0 + 0 + 25px + 300px + 25px + 0 + 0 = 350px
350pxになり親要素の幅と一致するが以下のように親と幅が一致しなくなる。
追記2
以下は.childからpaddingを外した場合です。
HTML
<div class="parent"> <a href="#" class="child">Link</a> </div>
CSS
.parent { padding: 0 25px 0 25px; background-color: #cccccc; width: 300px; display: inline-block; } .child { display: block; background: red; margin-left: -25px; margin-right: -25px; }
結果
Lhankor_Mhyさんの回答に当てはめてみる
.child の包含ブロックは、.parent のコンテンツ領域辺
.child の包含ブロックの幅は、300px
OK。
等式に当てはめると、-25+0+25+w+25+0+-25=300
つまり、.child のwidthは300px
追記2の例をもとに当てはめると、-25+0+0+w+0+0+-25=300
.child のwidth(計算式のwの部分)は350pxになる。
両パディングを合わせると、親要素のパディング領域辺の幅の350pxと一致する。
.childにはpaddingは追記2の例ではないので、親要素のパディング領域辺の幅の350pxと一致する。
回答2件
あなたの回答
tips
プレビュー