マージンの折りたたみを完全に無効にする方法はありますか?私が見つけた唯一の解決策(「崩壊しない」という名前で)は、1pxボーダーまたは1pxパディングの使用を必要とします。私はこれを受け入れられないものとします:無関係なピクセルは、正当な理由もなく計算を複雑にします。このマージンの折りたたみを無効にするより合理的な方法はありますか?
マージンの折りたたみには、主に2つのタイプがあります。
パディングまたはボーダーを使用すると、後者の場合にのみ崩壊を防ぐことができます。また、親に適用されるデフォルト(overflow
)と異なるvisible
の値は、崩壊を防ぎます。したがって、overflow: auto
とoverflow: hidden
の両方に同じ効果があります。おそらく、hidden
を使用する場合の唯一の違いは、親の高さが固定されている場合にコンテンツを非表示にすることの意図しない結果です。
親に適用されると、この動作の修正に役立つその他のプロパティは次のとおりです。
float: left / right
position: absolute
display: inline-block
ここですべてをテストできます: http://jsfiddle.net/XB9wX/1/ 。
通常どおり、Internet Explorerは例外です。より具体的には、IE 7では、width
など、親要素に何らかの種類のレイアウトが指定されている場合、マージンは縮小されません。
出典:Sitepointの記事折りたたみマージン
これには、古き良きマイクロクリアフィックスを使用することもできます。
#container:before, #container:after{
content: ' ';
display: table;
}
更新されたフィドルを参照してください: http://jsfiddle.net/XB9wX/97/
私の知る限り、視覚的な影響のないマージンの折りたたみを無効にする巧妙なトリックの1つは、親のパディングを0.05px
に設定することです。
.parentClass {
padding: 0.05px;
}
パディングは0でなくなったため、折りたたみは発生しなくなりましたが、同時にパディングは視覚的に0に切り捨てられるほど小さいです。
他のパディングが必要な場合は、padding-top: 0.05px;
など、マージンの折りたたみが望ましくない「方向」にのみパディングを適用します。
実際の例:
.noCollapse {
padding: 0.05px;
}
.parent {
background-color: red;
width: 150px;
}
.children {
margin-top: 50px;
background-color: Lime;
width: 100px;
height: 100px;
}
<h3>Border collapsing</h3>
<div class="parent">
<div class="children">
</div>
</div>
<h3>No border collapsing</h3>
<div class="parent noCollapse">
<div class="children">
</div>
</div>
編集:値を0.1
から0.05
に変更しました。 Chris Morganが以下のコメントで言及したように、そして この小さなテスト から、Firefoxは0.1px
のパディングを考慮に入れているようです。ただし、0.05px
はトリックを行うようです。
overflow:hidden
はマージンの縮小を防ぎますが、副作用がないわけではありません。つまり、オーバーフローを隠します。
これとあなたが言及したこととは別に、あなたはそれを実際に学び、実際に有用であるこの日のために学ぶ必要があります(3年から5年ごとに来ます)。
すべてのWebkitベースのブラウザは、プロパティ-webkit-margin-collapse
をサポートする必要があります。また、上部または下部のマージンにのみ設定するサブプロパティがあります。値を折りたたむ(デフォルト)、破棄する(隣接するマージンがある場合はマージンを0に設定する)、分離する(マージンの崩壊を防ぐ)ことができます。
これは2014年バージョンのChromeおよびSafariで動作することをテストしました。残念ながら、これはIEでサポートされるとは思わない。なぜならそれはwebkitに基づいていないからだ。
完全な説明については、 AppleのSafari CSSリファレンス をお読みください。
MozillaのCSS Webkit拡張機能ページ をチェックすると、これらのプロパティは独自のものとしてリストされ、使用しないことをお勧めします。これは、彼らがすぐに標準CSSに移行する可能性が低く、Webkitベースのブラウザのみがそれらをサポートするためです。
これは非常に古い投稿であることは知っていますが、親要素でflexboxを使用すると、子要素のマージンの折りたたみが無効になると言いたいだけです。
実際、完璧に機能するものがあります:
ディスプレイ:flex;フレックス方向:列;
IE10以降のみをサポートして生活できる限り
.container {
display: flex;
flex-direction: column;
background: #ddd;
width: 15em;
}
.square {
margin: 15px;
height: 3em;
background: yellow;
}
<div class="container">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
<div class="container">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
親がposition
を相対に設定しているため、マージンの崩壊で同様の問題が発生しました。以下は、マージンの折りたたみを無効にするために使用できるコマンドのリストです。
parent-fix*
クラスをdiv.container
要素に、またはクラスchildren-fix*
をdiv.margin
に割り当ててみてください。ニーズに最適なものを選択してください。
いつ
div.absolute
はページの一番上。div.absolute
はdiv.margin
と同じY座標に配置されますhtml, body { margin: 0; padding: 0; }
.container {
width: 100%;
position: relative;
}
.absolute {
position: absolute;
top: 0;
left: 50px;
right: 50px;
height: 100px;
border: 5px solid #F00;
background-color: rgba(255, 0, 0, 0.5);
}
.margin {
width: 100%;
height: 20px;
background-color: #444;
margin-top: 50px;
color: #FFF;
}
/* Here are some examples on how to disable margin
collapsing from within parent (.container) */
.parent-fix1 { padding-top: 1px; }
.parent-fix2 { border: 1px solid rgba(0,0,0, 0);}
.parent-fix3 { overflow: auto;}
.parent-fix4 { float: left;}
.parent-fix5 { display: inline-block; }
.parent-fix6 { position: absolute; }
.parent-fix7 { display: flex; }
.parent-fix8 { -webkit-margin-collapse: separate; }
.parent-fix9:before { content: ' '; display: table; }
/* Here are some examples on how to disable margin
collapsing from within children (.margin) */
.children-fix1 { float: left; }
.children-fix2 { display: inline-block; }
<div class="container parent-fix1">
<div class="margin children-fix">margin</div>
<div class="absolute"></div>
</div>
ここにjsFiddleの例を編集できます
あなたの情報のために、グリッドを使用できますが、副作用があります:)
.parent {
display: grid
}