divマージンが重なっているのはなぜですか?どうすれば修正できますか?


83

これらのdivのマージンが重複している理由がわかりません。

.alignright {float: right}
#header .social {margin-top: 50px;}
#header .social a {display: inline-block;}
#header .social .fb {width: 64px; height: 1px; padding-top: 60px; overflow: hidden;}
#header .social .twit {width: 64px; height: 1px; padding-top: 60px; overflow: hidden;}
#header .contact {margin: 20px 70px 20px 0; font-size: 14px; font-weight: bold;}
#header .contact span {color: #FFFFFF;}
#header .search {margin: 10px 0 0;}
<div class="alignright">
    <div class="social">
        <a href="#" class="twit"></a>
        <a href="#" class="fb"></a>
    </div><!-- social -->
    <div class="contact">
        Get in Touch: <span>+44 10012 12345</span>            
    </div><!-- contact -->
    <div class="search">
        <form method="post" action="">
            <input type="text" value="" name="s" gtbfieldid="28">
        </form>
    </div><!-- search -->
</div>

画像


2
:あなたは面白いコンテキストのフォーマットでこの記事を見つけるかもしれないtjkdesign.com/articles/...
jensgram

1
そこで使用しているルールのいくつかが欠落しているようです。.alignright内のすべての要素もフロートしていますか?
Joel Glovier 2010年

回答:


80

マージンが崩れていると思います。最初の要素の下部と2番目の要素の上部の間の最大マージンのみが考慮されます。

たとえば、2つの段落の間にあまりスペースがないのはごく普通のことです。

2つの隣接する要素でそれを回避することはできないため、より大きなマージンを拡大または縮小する必要があります。

編集:cf。W3C

次の場合に限り、2つのマージンが隣接しています。

  • どちらも、同じブロックフォーマットコンテキストに参加するインフローブロックレベルボックスに属しています
  • ラインボックス、クリアランス、パディング、境界線はありません。
  • 両方とも垂直に隣接するボックスの端に属します

したがってfloat、要素をフローから取り除く崩壊はありません。


マージンを希望どおりに下げるだけです。
Kissaki 2010年

編集済み、大きなマージンを拡大または縮小するか、パディングを使用する
MatTheCat 2010年

8
要素をフロートさせると、両方のマージンが適用されることがわかりました。
Atif Mohammed Ameenuddin 2011年

10
float厄介な副作用が発生する可能性があるため、ハックとして使用することには注意が必要です。float原則として使用には注意が必要です。
アンドリュー

時間に高さを与えると、インフローブロックレベルボックスになりますか?それを試してみてください
マヌエル・エルナンデス

49

パディング(特定の幅をパディングする)とは対照的に、マージンは「最小距離としてこれを行う」ことです。

すべての要素にその距離を置くわけではありません。

ご覧のとおり、タッチブロックの下部マージンは入力ボックスにマージされています。それがここでアクティブなマージンです。もう一方のマージンである入力からの上部マージンは、より小さく、実際に要素を押し戻すブロック要素に到達しないため、有効ではありません。2つのマージンは重なり合っており、互いに影響を及ぼしません。


1

パディングを使用できず、マージンが重ならないようにする必要がある場合は、次の1つのトリックがあります。

.btn {
    /* hack for a 2px margin */
    border-top: 2px #fff solid;
    /* this is important if you have a background-color
    and don't want to see it underneath the transparent border*/
    background-clip: padding-box;
}

デモ用にこのスニペットを起動してください:


0

気を付けろdisplay: flex親要素に。

.flex {
  display: flex;
  flex-direction: column;
}

.block {
  display: block;
}


/* css for example only */
div {
  padding: 1em;
  background: #eee;
}
p {
  font-size: 20px;
  margin: 1em 0;
  background: pink;
  padding: 5px;
}
p:first-child {
  margin-top: 0;
}
<h1>display: flex</h1>
<div class="flex">
  <p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Curabitur blandit tempus porttitor.</p>
  <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
  <p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Curabitur blandit tempus porttitor.</p>
  <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
</div>
<h1>display: block</h1>
<div class="block">
  <p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Curabitur blandit tempus porttitor.</p>
  <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
  <p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Curabitur blandit tempus porttitor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.</p>
  <p>Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
</div>


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.