У меня есть два divs рядом друг с другом - одна фиксированная и одна жидкость. Однако, всякий раз, когда я применяю margin-top к абзацу внутри жидкого div, он не заполняет всю высоту div, а также толкает фиксированный div рядом с ним вниз. К сожалению, я не могу использовать overflow: auto, чтобы исправить это, потому что мне нужно, чтобы жидкость div имела переполнение: видимое для конкретной потребности. Странно, я знаю, но я уверен, что для этого должно быть решение. Тем не менее, я пробовал часами без везения.
Вот демо проблемы, которую я имею. Я также добавил объяснение в divs: http://jsfiddle.net/LejbU/
<div class="left">
<p>This div has a fixed width of 300px.<p>
</div>
<div class="right">
<p class="withMargin">Test</p>
</div>
-
.left {
background-color: yellow;
width: 300px;
height: 100%;
float: left;
}
.right {
background-color: pink;
height: 100%;
margin-left: 320px;
overflow: visible;
}
p {
margin: 0;
padding: 10px;
color: black;
}
p.withMargin {
margin-top: 100px;
margin-bottom: 100px;
}
Еще одно решение, которое я нашел. Создайте новый div WITHIN в правом div и примените следующий css к новому div:
.correctblock {
display: inline-block;
width: 100%;
zoom: 1;
}
Пример: http://jsfiddle.net/62ueY/
Это из-за коллапсирующих полей определения модели CSS Box:
CSS 2.1 8.3.1 Свертывание полей
В CSS смежные поля двух или более ящиков (которые могут или не могут быть братьями и сестрами) могут объединяться, чтобы сформировать единый запас. Полагают, что поля, которые объединяются таким образом, разрушаются, а полученный комбинированный запас называется скомпенсированным запасом.
Из определения:
Поля встроенных блоков не сворачиваются (даже с их дочерьми в потоке).
Поэтому измените отображение p.withMargin
на inline-block
чтобы избежать такого поведения.
добавьте этот display:inline-block;
к p.withMargin
Вы стали жертвой краха полей (MDN).
Верхний и нижний поля блоков иногда объединяются (сворачиваются) в один край, размер которого является наибольшим из полей, объединенных в него, поведение, известное как крах.
В твоем случае:
Родитель и первый/последний ребенок
Если нет границы, прокладки, встроенного содержимого или разрешения, чтобы отделить верхний край поля с краем верхнего его первого дочернего блока или без границы, заполнение, встроенное содержимое, высота, минимальная высота или макс. -height, чтобы отделить нижний край блока от нижней границы его последнего дочернего элемента, тогда эти поля рушится. Разрушенный край заканчивается вне родителя.
Есть несколько способов обойти это, я просто использую дополнение вместо изменения макета, как мне нужно, не изменяя другие свойства, которые я считаю более опасными. В этом сценарии: http://jsfiddle.net/rgthree/LejbU/1/
p.withMargin {
padding-top: 100px;
padding-bottom: 100px;
}
display:inline-block
может иметь и другие последствия, так как вы фактически меняете тип отображения и, таким образом, меняете способ отображения этого элемента браузером (скажем, если у вас было несколько рядом с каждым другие и т. д.). Мое решение не только сохраняет элемент как тип блока, но также работает в (очень) старых браузерах, которые не поддерживают inline-block. старое, проверенное и верное решение.