Чистое решение только для 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>