Аккуратное решение только для 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>
person
Yeti
schedule
13.11.2017