Почему высота элемента контейнера не увеличивается, если он содержит плавающие элементы?


Я хотел бы спросить, как работают высота и поплавок. У меня есть внешний div и внутренний div, который имеет содержание в нем. Его высота может варьироваться в зависимости от содержания внутреннего div, но кажется, что мой внутренний div будет переполнять его внешний div. Каков был бы правильный способ сделать это?

 <html>
    <body>
        <div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
    	    <div style="width:500px; height:200px; background-color:black; float:right"></div>
        </div>
    </body>
</html>
8 180

8 ответов:

плавающие элементы не добавляют к высоте элемента контейнера, и, следовательно, если вы не очистите их, высота контейнера не увеличится...

я покажу вам визуально:

enter image description here

enter image description here

enter image description here

Другое Объяснение:

<div>
  <div style="float: left;"></div>
  <div style="width: 15px;"></div> <!-- This will shift 
                                        besides the top div. Why? Because of the top div 
                                        is floated left, making the 
                                        rest of the space blank -->

  <div style="clear: both;"></div> 
  <!-- Now in order to prevent the next div from floating beside the top ones, 
       we use `clear: both;`. This is like a wall, so now none of the div's 
       will be floated after this point. The container height will now also include the 
       height of these floated divs -->
  <div></div>
</div>

вы также можете добавить overflow: hidden; на элементах контейнера, но я бы предложил вам использовать clear: both; вместо.

также, если вы могли бы как самоочищение элемента, который вы можете использовать

.self_clear:after {
  content: "";
  clear: both;
  display: table;
}

как работает CSS Float?

что такое float точно и что он делает?

  • The float свойство неправильно понимается большинством новичков. Ну а что именно делает float делать? Первоначально,float свойство было введено для потока текста вокруг изображений, которые плавают left или right. вот еще одно объяснение автор @Madara Uchicha.

    Итак, это неправильно использовать float свойство для размещения коробок бок о бок? Ответ нет; нет никаких проблем, если вы используете float свойство для того, чтобы установить бок о бок коробки.

  • плавучая inline или block элемент уровня заставит элемент вести себя как inline-block элемент.

    Demo
  • если вы плаваете элемент left или right на width элемент будет ограничен содержимым, которое он содержит, если width четко определено ...

  • вы не можете float элемент center. Это самая большая проблема, которую я всегда видел с новичками, используя float: center;, который не является допустимым значением для float собственность. float обычно float / переместить содержимое в самый левый, ни право. Есть только четыре допустимые значения float собственность мне.е left,right,none (по умолчанию) и inherit.

  • родительский элемент сворачивается, когда он содержит плавающие дочерние элементы, чтобы предотвратить это, мы используем clear: both; свойство, чтобы очистить плавающие элементы с обеих сторон, что позволит предотвратить сворачивание родительского элемента. Для получения дополнительной информации, вы можете сослаться на мой другой ответ здесь.

  • (важно) подумайте об этом, где у нас есть стек различных элементов. Когда мы используем float: left; или float: right; элемент перемещается над стеком на единицу. Следовательно, элементы в нормальном потоке документов будут скрываться за плавающими элементами, потому что они находятся на уровне стека выше нормального плавающий элемент. (пожалуйста, не связывайте это с z-index а это совершенно другое.)


принимая случай в качестве примера, чтобы объяснить, как CSS плавает работать, предполагая, что нам нужен простой макет 2 столбца с заголовком, нижним колонтитулом и 2 столбцами, так вот как выглядит схема элементов...

enter image description here

в приведенном выше примере мы будем плавать только красные ящики, либо вы можете float как left, или float на left, а другой right а также, зависит от макета, если это 3 колонки, вы можете float 2 колонки к left где еще один right так зависит, хотя в этом примере, у нас есть упрощенный Макет 2 столбца так будет float один left, а другой right.

разметка и стили для создания макета объяснены ниже...

<div class="main_wrap">
    <header>Header</header>
    <div class="wrapper clear">
        <div class="floated_left">
            This<br />
            is<br />
            just<br />
            a<br />
            left<br />
            floated<br />
            column<br />
        </div>
        <div class="floated_right">
            This<br />
            is<br />
            just<br />
            a<br />
            right<br />
            floated<br />
            column<br />
        </div>
    </div>
    <footer>Footer</footer>
</div>

* {
    -moz-box-sizing: border-box;       /* Just for demo purpose */
    -webkkit-box-sizing: border-box;   /* Just for demo purpose */
    box-sizing: border-box;            /* Just for demo purpose */
    margin: 0;
    padding: 0;
}

.main_wrap {
    margin: 20px;
    border: 3px solid black;
    width: 520px;
}

header, footer {
    height: 50px;
    border: 3px solid silver;
    text-align: center;
    line-height: 50px;
}

.wrapper {
    border: 3px solid green;
}

.floated_left {
    float: left;
    width: 200px;
    border: 3px solid red;
}

.floated_right {
    float: right;
    width: 300px;
    border: 3px solid red;
}

.clear:after {
    clear: both;
    content: "";
    display: table;
}

давайте шаг за шагом с макетом и посмотрите, как работает поплавок..

прежде всего, мы используем основной элемент оболочки, вы можете просто предположить, что это ваш видовой экран, затем мы используем header и назначить height на 50px так что ничего особенного. Это просто нормальный не плавающий элемент уровня блока, который займет 100% горизонтальное пространство, если оно не плавает или мы назначаем inline-block к нему.

первое допустимое значение для float и left так, в нашем примере, мы используем float: left; на .floated_left, так что мы намерены плавать блок к left наших элемента-контейнера.

колонна поплыла влево

и да, если вы видите, родительский элемент, который является .wrapper рухнул, тот, который вы видите с зеленой границей, не расширился, но он должен быть прав? Вернемся к этому через некоторое время, пока у нас есть колонна, плавающая в left.

переходя ко второй колонке, давайте ее float этот right

еще одна колонна поплыла вправо

у нас 300px широкий столбец, который мы float до right, который будет сидеть рядом с первой колонной, как он плавал в left, и так как он плавал в left, он создал пустой желоб для right, и так как было достаточно места на right, наш right плавающий элемент сидел идеально рядом с left один.

тем не менее, родительский элемент свернут, ну, давайте исправим это сейчас. Существует много способов предотвратить сворачивание родительского элемента.

  • добавить пустой элемент уровня блока и использовать clear: both; прежде чем родительский элемент заканчивается, который содержит плавающие элементы, теперь это дешевое решение для clear ваши плавающие элементы, которые сделают работу за вас, но я бы рекомендовал не использовать это.

добавить <div style="clear: both;"></div> до .wrapperdiv заканчивается, как

<div class="wrapper clear">
    <!-- Floated columns -->
    <div style="clear: both;"></div>
</div>

Demo

Ну, это исправляет очень хорошо, больше нет свернутого родителя, но он добавляет ненужную разметку в DOM, поэтому некоторые предлагают использовать overflow: hidden; на родительском элементе холдинга плавали дочерние элементы, которые работают по назначению.

использовать overflow: hidden; on .wrapper

.wrapper {
    border: 3px solid green;
    overflow: hidden;
}

Demo

это экономит нам элемент каждый раз, когда мы надо clearfloat но поскольку я тестировал различные случаи с этим, он потерпел неудачу в одном конкретном, который использует box-shadow на дочерних элементах.

Demo (не вижу тени со всех 4-х сторон,overflow: hidden; вызывает эту проблему)

Ну и что теперь? Сохранить элемент, нет overflow: hidden; так что идите на четкое исправление Хака, используйте приведенный ниже фрагмент в вашем CSS, и так же, как вы используете overflow: hidden; для родительского элемента, называют class ниже на родителей элемент для самоочищения.

.clear:after {
    clear: both;
    content: "";
    display: table;
}

<div class="wrapper clear">
    <!-- Floated Elements -->
</div>

Demo

здесь тень работает по назначению, также она самостоятельно очищает родительский элемент, который предотвращает коллапс.

и, наконец, мы используем нижний колонтитул после того, как мы clear плавающие элементы.

Demo


когда float: none; используется в любом случае, так как он используется по умолчанию, так что ли объявить float: none;?

ну, это зависит, если вы собираетесь для адаптивного дизайна, вы будете использовать это значение много раз, когда вы хотите, чтобы ваши плавающие элементы отображались один под другим с определенным разрешением. За это float: none; собственность играет там важную роль.


несколько реальных примеров того, как float полезно.

  • первый пример, который мы уже видели, заключается в создании одного или нескольких столбцов макеты.
  • используя img плавали внутри p что позволит нашему контенту течь вокруг.

Demo (без плавающей img)

Demo 2 (img поплыл к left)

  • используя float для создания горизонтального меню - Demo

поплавок второй элемент, а также, или использовать 'margin'

и последнее, но не менее важное, я хочу объяснить этот конкретный случай, когда вы float только один элемент left а не float другое, так что же происходит?

предположим, если убрать float: right; наших .floated_rightclass на div будет отображаться из крайнего left как он не плавал.

Demo

в этом случае, либо вы можете float до left а также

или

вы можете использовать margin-left который будет равен размеру левого плавающего столбца, т. е. 200px широкое.

вам нужно добавить overflow:auto к вашему родительскому div, чтобы он охватывал внутренний плавающий div:

<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

пример jsFiddle

вы столкнулись с ошибкой float (хотя я не уверен, что это технически ошибка из-за того, сколько браузеров демонстрируют такое поведение). Вот что происходит:

при нормальных обстоятельствах, предполагая, что явная высота не была установлена, элемент уровня блока, такой как div, установит свою высоту на основе своего содержимого. Нижняя часть родительского div будет выходить за пределы последнего элемента. К сожалению, плавающий элемент останавливает родителя от принятия плавающего элемента в учитывают при определении его высоты. Это означает, что если ваш последний элемент плавает, он не будет "растягивать" родительский элемент таким же образом, как обычный элемент.

очистка

есть два распространенных способа, чтобы исправить это. Первый-добавить элемент "очистка"; то есть еще один элемент ниже плавающего, который заставит родителя растягиваться. Поэтому добавьте следующий html в качестве последнего ребенка:

<div style="clear:both"></div>

Он не должен быть виден, и с помощью ясно: оба, вы убедитесь, что он не будет сидеть рядом с плавающим элементом, но после него.

переполнение:

второй метод, который предпочитают большинство людей (я думаю), заключается в изменении CSS родительского элемента, чтобы переполнение было чем угодно, но не "видимым". Таким образом, установка переполнения на "скрытый" заставит родителя выйти за пределы нижней части плавающего ребенка. Это верно только если вы не установите высоту на родителей курс.

overflow быть видимым, и в этом случае добавление элемента очистки более чем приемлемо.

его из-за поплавка div. Добавить overflow: hidden на внешнем элементе.

<div style="overflow:hidden; margin:0 auto;width: 960px; min-height: 100px; background-color:orange;">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

демо

Вы путаете как браузеры отображает элементы, когда есть плавающие элементы. Если один элемент блока является плавающим (ваш внутренний div в вашем случае), другие элементы блока будут игнорировать его, потому что браузер удаляет плавающие элементы из обычного потока веб-страницы. Затем, поскольку плавающий div был удален из нормального потока, внешний div заполняется, как и внутренний div нет. Однако встроенные элементы (изображения, ссылки, текст, черные кавычки) будут уважать границы плавающий элемент. Если вы введете текст во внешнем div, текст разместится вокруг внутреннего div.

пример скрипки здесь

<body>
    <div style="float:right; background-color:blue;width:200px;min-height:400px;margin-right:20px">
           floating element
    </div>
    <h1 style="background-color:red;"> this is a big header</h1>
    <p style="background-color:green"> this is a parragraph with text and a big image. The text places arrounds the floating element. Because of the image is wider than space between paragrah and floating element places down the floating element. Try to make wider the viewport and see what happens :D
        <img src="http://2.bp.blogspot.com/_nKxzQGcCLtQ/TBYPAJ6xM4I/AAAAAAAAAC8/lG6XemOXosU/s1600/css.png">
     </p>

вы можете использовать свойство переполнения для контейнера div, если у вас нет div для отображения над контейнером, например:

<div class="cointainer">
    <div class="one">Content One</div>
    <div class="two">Content Two</div>
</div>

вот следующий css:

.container{
    width:100%;/* As per your requirment */
    height:auto;
    float:left;
    overflow:hidden;
}
.one{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

.two{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

-----------------------или------------------------------

    <div class="cointainer">
        <div class="one">Content One</div>
        <div class="two">Content Two</div>
        <div class="clearfix"></div>
    </div>

вот следующий css:

    .container{
        width:100%;/* As per your requirment */
        height:auto;
        float:left;
        overflow:hidden;
    }
    .one{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }

    .two{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }
    .clearfix:before,
    .clearfix:after{
        display: table;
        content: " ";
    }
    .clearfix:after{
        clear: both;
    }

Если вам нужно, чтобы ваш ребенок плавал ДИВС слева, Я рекомендую код ниже для вашего родительского div.

.parent_div{
    display: flex;
}

использовать <div style="clear: both;"></div> в нижней части всех ваших кодов, но выше </body></html>

просто скопируйте и вставьте его

это будет работать префекта