Зробіть зовнішній div автоматично таким самим висотою, як його плаваючий вміст


94

Я хочу, щоб зовнішній div, чорний, загортав його divплаваючі всередині нього. Я не хочу використовувати style='height: 200pxв ідентифікаторі divз outerdivідентифікатором, оскільки хочу, щоб це було автоматично висотою його вмісту (наприклад, плаваючі divs).

<div id='outerdiv' style='border: 1px solid black;background-color: black;'>
<div style='width=300px;border: red 1px dashed;float: left;'>
    <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
</div>

<div style='width=300px;border: red 1px dashed;float: right;'>
    <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
</div>

Як цього досягти?

Відповіді:


167

Ви можете встановити outerdivCSS для цього

#outerdiv {
    overflow: hidden; /* make sure this doesn't cause unexpected behaviour */
}

Ви також можете зробити це, додавши елемент в кінці за допомогою clear: both. Це можна додати звичайно, з JS (невдале рішення) або з :afterпсевдоелементом CSS (не широко підтримується в старих IE).

Проблема полягає в тому, що контейнери природно не розширяться, включаючи дітей, що плавають. Будьте застережені, використовуючи перший приклад, якщо у вас є дочірні елементи поза батьківським елементом, вони будуть приховані. Ви також можете використовувати 'auto' як значення властивості, але це буде викликати смуги прокрутки, якщо якийсь елемент з'явиться зовні.

Ви також можете спробувати плаваючий батьківський контейнер, але залежно від вашого дизайну це може бути неможливо / складно.


37
Я хотів би, щоб я зрозумів логіку того, чому переповнення: у цьому випадку працює приховане.
masteroleary

2
Так, я сподівався, що не лише я вважав це протиінтуїтивним. Алекс?
регулярний майк

3
@masteroleary @regularmike HTML/CSSніколи не була хорошою технологією користувальницького інтерфейсу, тому в ній зустрічаються контр-інтуїтивні речі :)
Юрій Наконечний

2
@masteroleary Я усвідомлюю, що це стара тема, але нещодавно я намагався відповісти на подібне запитання на stackoverflow.com/questions/21041297#21041625 - сподіваюся, що це допоможе
xec

1
+1 для floatрішення. Дуже добре працює з іншими помилками, особливо в парі з Twitter Bootstrap.
Fizzix

17

По-перше, я настійно рекомендую вам робити стиль CSS у зовнішньому файлі CSS, а не робити це вбудовано. Це набагато простіше в обслуговуванні і може бути більш багаторазовим за допомогою класів.

Опрацювавши відповідь Алекса (& clearrefix Гаррета) про "додавання елемента в кінці з clear: both", ви можете зробити це так:

    <div id='outerdiv' style='border: 1px solid black; background-color: black;'>
        <div style='width: 300px; border: red 1px dashed; float: left;'>
            <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
        </div>

        <div style='width: 300px; border: red 1px dashed; float: right;'>
            <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
        </div>
        <div style='clear:both;'></div>
    </div>

Це працює (але, як бачите, вбудований CSS не такий гарний).


Чому мене оцінили вниз? Це працює, і я справедливо визнав, що це не було гарним рішенням.
Lycana

1
Я не впевнений, я поставив +1 як мінімум, щоб повернути вас до 0. Можливо, вас проголосували проти, тому що ви не виправили його неправильний CSS ... тобто використання знака рівності для встановлення властивості CSS є неправильним.
alex

досить справедливо. Я ціную +1 Алекс. Я вважав, що це моє твердження було справедливим.
Lycana

Це рішення краще IMO. Я б прийняв цю відповідь, якби це було моє запитання.
ksg91

8

Можливо, ви захочете спробувати самозакриваються поплавці, як це докладно на http://www.sitepoint.com/simple-clearing-of-floats/

Тож, можливо, спробуйте або overflow: auto(зазвичай це працює), або overflow: hidden, як сказав Алекс.


приховані роботи, але ви маєте рацію, авто працює трохи краще. Дякую.
Метт Сеттер,

7

Я знаю, що деякі люди будуть мене ненавидіти, але я знайшов display:table-cellдопомогу у цих випадках.

Це дійсно чистіше.


зовнішній div використання display: table; а всередині div використовують display: table-cell;
Анукул Лімпанасіл

4

Перш за все, ви не використовуєте width=300pxце атрибут налаштування для тегу, а не CSS, використовуйте width: 300px;замість цього.

Я б запропонував застосовувати clearfixтехніку на #outerdiv. Clearfix є загальним рішенням для очищення 2 плаваючих div, тому батьківський div буде розширений, щоб вмістити 2 плаваючі div.

<div id='outerdiv' class='clearfix' style='width:600px; background-color: black;'>
    <div style='width:300px; float: left;'>
        <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
    </div>

    <div style='width:300px; float: left;'>
        <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
    </div>
</div>

Ось приклад вашої ситуації та дії Clearfix для її вирішення.


3

Використовуйте jQuery:

Встановити батьківський зріст = Child offsetHeight.

$(document).ready(function() {
    $(parent).css("height", $(child).attr("offsetHeight"));
}

3
Надмірне, коли це можна зробити лише за допомогою CSS.
alex

1
З моєю відповіддю ви можете встановити батьківську висоту таку ж, як і дочірню висоту, але використовуючи переповнення, ми не змінюємо батьківську висоту, що створить певну проблему, якщо ми показуємо дані після батьківського div.
Гарпал

1

Використовуйте clear: both;

Я витратив більше тижня, намагаючись це зрозуміти!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.