これは古い問題であることを知っています。何度も遭遇しました。問題は、ここでのすべての修正がハッキングであり、意図しない結果をもたらす可能性があることです。
まず、根本的な問題の簡単な説明があります。マージンの折りたたみの仕組みにより、コンテナー内の最初の要素に上部マージンがある場合、その上部マージンは親コンテナー自体に効果的に適用されます。以下を実行することで、これを自分でテストできます。
<div>
<h1>Test</h1>
</div>
デバッガーでこれを開き、divにカーソルを合わせます。H1要素の上部マージンが停止する場所にdiv自体が実際に配置されていることに気づくでしょう。この動作はブラウザによって意図されています。
だから、ここのほとんどの投稿がするように、奇妙なハックに頼る必要なしにこれに簡単な修正があります(侮辱は意図されていません、それは真実です)-単に元の説明に戻って...if the first element inside a container has a top margin...
ください--その後、あなたは必要です上余白を持たないコンテナの最初の要素。わかりましたが、ドキュメントに意味的に干渉しない要素を追加せずにそれを行うにはどうすればよいでしょうか。
かんたん!疑似要素!これは、クラスまたは事前定義のミックスインを使用して行うことができます。:before
擬似要素を追加します。
クラスを介したCSS:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
これにより、上記のマークアップの例に従って、divを次のように変更します。
<div class="top-margin-fix">
<h1>Test</h1>
</div>
なぜこれが機能するのですか?
コンテナの最初の要素に上マージンがない場合は、次の要素の上マージンの開始位置を設定します。:before
疑似要素を追加することにより、ブラウザは実際には非意味(つまり、SEOに適した)要素を最初の要素の前の親コンテナに追加します。
Q.なぜ高さが.0000001emなのですか?
A.ブラウザがマージン要素を押し下げるには高さが必要です。この高さは実質的にゼロですが、それでも親コンテナ自体にパディングを追加できます。実質的にゼロであるため、コンテナのレイアウトにも影響しません。綺麗な。
これで、クラス(またはSASS / LESSではミックスイン)を追加して、要素で他のことを実行したいときに予期しない結果を引き起こす奇妙な表示スタイルを追加する代わりに、この問題を修正して、意図的に要素のマージンを取り除くことができますおよび/またはそれをパディング、または実際にはこの問題を解決することを意図していない奇妙な位置/浮動小数点スタイルに置き換える。
overflow:hidden
ケースの90%に適しています。