きちんとした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以降、IE8以降。これは最新のブラウザで機能します(::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;
、あなたが修正を見ることは決してないことを確認してください。
古代のIEブラウザでは、高さが実際にゼロになるように追加line-height: 0px;
または確認する必要があるかもしれません(わかりません)。また、機能しない場合は、オプションで古いIEブラウザにmax-height: 0px;
追加できます。<!--dummy-->
つまり、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>