きちんとしたCSSのみのソリューション
次のコードを使用して、コンテンツのない最初の子を意図せず移動するdivの前に追加します。
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
この方法の利点は、既存の要素のCSSを変更する必要がないため、設計への影響が最小限であることです。次に、追加される要素は疑似要素です。は、DOMツリーにないです。
疑似要素のサポートは広く普及しています:Firefox 3以降、Safari 3以降、Chrome 3以降、Opera 10以降、IE 8以降。これは、最新のブラウザで機能します(新しいブラウザには注意してください)::before
IE8ではサポートされていないに)。
環境
要素の最初の子に margin-top
場合、親は冗長なマージンを折りたたむ方法としてその位置を調整します。どうして?そんな感じです。
次の問題があるとします。
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
</style>
<div class="parent"><!--This div moves 40px too-->
<div class="child">Hello world!</div>
</div>
単純なスペースなどのコンテンツを持つ子を追加することで修正できます。しかし、私たちは皆、デザインのみの問題であるスペースを追加することを嫌います。したがって、white-space
プロパティを使用してコンテンツを偽造します。
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.fix {position: relative;white-space: pre;height: 0px;width: 0px;overflow: hidden;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="fix"></div>
<div class="child">Hello world!</div>
</div>
position: relative;
修正の正しい配置を保証する場所。またwhite-space: pre;
、空白などのコンテンツを修正に追加する必要がなくなります。そしてheight: 0px;width: 0px;overflow: hidden;
、あなたが修正を見ることは決してないでしょう。
追加するline-height: 0px;
かmax-height: 0px;
、高さが実際に古いIEブラウザーでゼロになるようにする必要があるかもしれません(私にはわかりません)。<!--dummy-->
それが機能しない場合は、オプションで古いIEブラウザーに追加できます。
つまり、CSSだけでこれらすべてを実行できます(HTML DOMツリーに実際の子を追加する必要がなくなります)。
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.parent:before {content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="child">Hello world!</div>
</div>