Zgrabne rozwiązanie tylko dla CSS
Użyj poniższego kodu, aby dołączyć bez zawartości pierwsze dziecko do niezamierzonego ruchu div:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
Zaletą tej metody jest to, że nie trzeba zmieniać CSS żadnego istniejącego elementu, a zatem ma minimalny wpływ na projekt. Obok tego dodawany jest pseudoelement, którego nie ma w drzewie DOM.
Obsługa pseudo-elementów jest szeroko rozpowszechniona: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ i IE 8+. Będzie to działać w dowolnej nowoczesnej przeglądarce (uważaj na nowszą ::before
, która nie jest obsługiwana w IE8).
Kontekst
Jeśli pierwsze dziecko elementu ma margin-top
, rodzic dostosuje swoją pozycję jako sposób zwijania zbędnych marginesów. Dlaczego? Po prostu tak jest.
Biorąc pod uwagę następujący problem:
<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>
Możesz to naprawić, dodając dziecko z zawartością, na przykład prostą spacją. Ale wszyscy nienawidzimy dodawać spacji dla tego, co jest kwestią wyłącznie projektową. Dlatego użyj tej white-space
właściwości do sfałszowania treści.
<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>
Gdzie position: relative;
zapewnia prawidłowe ustawienie poprawki. I white-space: pre;
sprawia, że nie musisz dodawać żadnych poprawek - takich jak białe znaki. I height: 0px;width: 0px;overflow: hidden;
upewnia się, że nigdy nie zobaczysz poprawki.
W starożytnych przeglądarkach IE może być konieczne dodanie line-height: 0px;
lub max-height: 0px;
upewnienie się, że wysokość jest równa zero (nie jestem pewien). I opcjonalnie możesz dodać <!--dummy-->
do niego w starych przeglądarkach IE, jeśli to nie działa.
Krótko mówiąc, możesz to wszystko zrobić tylko za pomocą CSS (co eliminuje potrzebę dodawania rzeczywistego potomka do drzewa DOM HTML):
<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>