Почему родительский div имеет нулевую высоту, если в него помещены дочерние элементы?


132

У меня есть следующее в моем CSS. Все поля / отступы / границы глобально сбрасываются на 0.

#wrapper{width: 75%; min-width: 800px;}
.content{text-align: justify; float: right; width: 90%;}
.lbar{text-align: justify; float: left; width: 10%;}

Теперь, когда я пишу свой HTML как

<div id="wrapper">
    <div class="content">
        some text here
    </div>
    <div class="lbar">
        some text here
    </div>
</div>

страница отображается правильно. Тем не менее, когда я проверяю элементы, div#wrapperотображается как 0pxвысокий. Я ожидал бы, что это расширится до конца div.contentи div.lbar... Почему это происходит?

Опять же, страница отображается нормально. Такое поведение просто сбивает меня с толку.


4
Это может быть полезно для вас CSS Floats 101 , из A List Apart .
Дэвид говорит восстановить Монику

Ответы:


251

Плавающее содержимое не влияет на высоту его контейнера. Элемент не содержит содержимого, которое не является плавающим (поэтому ничто не останавливает высоту контейнера равной 0, как если бы он был пустым).

Установка overflow: hiddenна контейнере позволит избежать этого, установив новый контекст форматирования блока . См методы , содержащие поплавки для других методов и содержащих поплавки для объяснения о том, почему CSS был разработан таким образом.


Вот еще один подход к созданию контейнеров, содержащих плавающие элементы, который решается в CSS без добавления элементов на страницу.
Фил

56

Обычно floatони не учитываются в макете их родителей.

Чтобы предотвратить это, добавьте overflow: hiddenк родителю.


16
Спасибо, это работает, но я не понимаю, почему ... переполнение: говорят, что скрытый скрывает содержимое, которое переполняет, а не увеличивает элемент, чтобы содержать его.
ripper234

@ ripper234 Вот почему: stackoverflow.com/questions/25818199/…
kristianp

6

Я не уверен, что это правильный путь, но я решил его, добавив display: inline-block;в обертку div.

#wrapper{
    display: inline-block;
    /*border: 1px black solid;*/
    width: 75%;
    min-width: 800px;
}

.content{
    text-align: justify; 
    float: right; 
    width: 90%;
}

.lbar{
    text-align: justify; 
    float: left; 
    width: 10%;
}

1
Это было именно то решение, которое я искал. Переполнение: при скрытии тень блока, естественно, исчезает.
Китиара
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.