マージンの縮小を完全に無効にする方法はありますか?私が見つけた唯一の解決策(「折りたたみ解除」という名前)は、1pxの境界線または1pxのパディングを使用することを伴います。これは受け入れられないことです。無関係なピクセルは、理由もなく計算を複雑にします。このマージンの縮小を無効にするより合理的な方法はありますか?
margin-bottom
なく残すmargin-top
0が
マージンの縮小を完全に無効にする方法はありますか?私が見つけた唯一の解決策(「折りたたみ解除」という名前)は、1pxの境界線または1pxのパディングを使用することを伴います。これは受け入れられないことです。無関係なピクセルは、理由もなく計算を複雑にします。このマージンの縮小を無効にするより合理的な方法はありますか?
margin-bottom
なく残すmargin-top
0が
回答:
マージンの崩壊には主に2つのタイプがあります。
パディングまたはボーダーを使用すると、後者の場合にのみ折りたたみが防止されます。また、親に適用されているoverflow
デフォルト(visible
)と異なる値は、折りたたみを防ぎます。このように、両方のoverflow: auto
とoverflow: hidden
同じ効果を持つことになります。おそらく、使用時の唯一の違いhidden
は、親の高さが固定されている場合にコンテンツを非表示にするという意図しない結果です。
親に適用されると、この動作の修正に役立つその他のプロパティは次のとおりです。
float: left / right
position: absolute
display: inline-block / flex
ここですべてをテストできます:http : //jsfiddle.net/XB9wX/1/。
いつものように、Internet Explorerは例外です。より具体的には、IE 7では、親要素にある種のレイアウトが指定されている場合、マージンは折りたたまれませんwidth
。
出典:Sitepointの記事Collapsing Margins
overflow: auto
オーバーフローコンテンツをオーバーフローさせるのではなく、親要素にスクロールバーが表示される可能性があることに注意してくださいoverflow: visible
。
flex
デフォルトと異なる値でもマージンの縮小は無効になります
これには、古き良きマイクロclearfixを使用することもできます。
#container:before, #container:after{
content: ' ';
display: table;
}
更新されたフィドルを参照してください:http : //jsfiddle.net/XB9wX/97/
:before
と:after
要素で埋める傾向を理解できたと思います。このルールをスタイルシートに追加しました:div:before, div:after{content: ' '; display: table;}
。素晴らしい。突然、予期したとおりに動作し始めます。
私が知る限り、視覚的な影響を与えないマージンの縮小を無効にする巧妙なトリックの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
トリックを行うにはシーム。
*{padding-top:0.1px}
。すべてのブラウザで動作することは確かですか?
0.05px
ランダムなブラウザのだまされた数ではなく、まだ特定の選択のように思われ0.01px
ます。
overflow:hidden
マージンの崩れを防ぎますが、副作用がないわけではありません。つまり、オーバーフローを隠します。
これとは別に、あなたが言ったことをライブで学び、実際に役立つこの日のために学ばなければなりません(3〜5年ごとに行われます)。
overflow: auto
隠されたオーバーフローを防ぎ、マージンの縮小を防ぐために使用するとよいでしょう。
overflow:auto;
によって、コンテンツ領域に一部のページでスクロールバーが表示されるようになりました。
実際、問題なく動作するものがあります。
ディスプレイ:フレックス; フレックス方向:列;
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>
<div>
には.container
、内にエクストラを追加する必要があります。追加しない場合、.container
はその子のボックスモデルを制御します。たとえば、インライン要素は全幅のブロック要素になります。マージンがある場合は、マージンも折りたたまれます。
すべてのWebkitベースのブラウザがプロパティをサポートする必要があります-webkit-margin-collapse
。上部または下部のマージンにのみ設定するサブプロパティもあります。値を折りたたむ(デフォルト)、破棄する(隣接するマージンがある場合はマージンを0に設定する)、分離する(マージンの折りたたみを防ぐ)ことができます。
私はこれがChromeとSafariの2014バージョンで動作することをテストしました。残念ながら、それはwebkitに基づいていないので、IEではサポートされないと思います。
完全な説明については、AppleのSafari CSSリファレンスをお読みください。
MozillaのCSS Webkit拡張ページを確認すると、これらのプロパティがプロプライエタリとしてリストされており、使用しないことをお勧めします。これは、彼らがすぐに標準のCSSに入る可能性が低く、Webkitベースのブラウザーのみがそれらをサポートするためです。
私はこれが非常に古い投稿であることを知っていますが、親要素でflexboxを使用すると、その子要素のマージンの縮小が無効になると言いたいだけです。
親がposition
親族に設定しているため、マージンの崩壊について同様の問題がありました。以下は、マージンの折りたたみを無効にするために使用できるコマンドのリストです。
任意のparent-fix*
クラスをdiv.container
要素に、または任意のクラスchildren-fix*
をに割り当ててみてくださいdiv.margin
。ニーズに最も適したものを選択してください。
いつ
div.absolute
赤い背景がページの最上部に配置されます。div.absolute
れていますと同じY座標に配置されますdiv.margin
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があります
新しいブラウザー(IE11を除く)では、親子マージンの折りたたみを防ぐ簡単なソリューションはを使用することdisplay: flow-root
です。ただし、隣接する要素が折りたたまれるのを防ぐには、他の手法も必要です。
デモ(変更前)
.parent {
background-color: grey;
}
.child {
height: 16px;
margin-top: 16px;
margin-bottom: 16px;
background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
デモ(後)
.parent {
display: flow-root;
background-color: grey;
}
.child {
height: 16px;
margin-top: 16px;
margin-bottom: 16px;
background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>