Почему высота элемента контейнера не увеличивается, если он содержит плавающие элементы?
Я хотел бы спросить, как работают высота и поплавок. У меня есть внешний 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 ответов:
плавающие элементы не добавляют к высоте элемента контейнера, и, следовательно, если вы не очистите их, высота контейнера не увеличится...
я покажу вам визуально:
Другое Объяснение:
<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свойство для того, чтобы установить бок о бок коробки.плавучая
Demoinlineилиblockэлемент уровня заставит элемент вести себя какinline-blockэлемент.если вы плаваете элемент
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 столбцами, так вот как выглядит схема элементов...
в приведенном выше примере мы будем плавать только красные ящики, либо вы можете
floatкакleft, илиfloatнаleft, а другойrightа также, зависит от макета, если это 3 колонки, вы можетеfloat2 колонки к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>Ну, это исправляет очень хорошо, больше нет свернутого родителя, но он добавляет ненужную разметку в DOM, поэтому некоторые предлагают использовать
overflow: hidden;на родительском элементе холдинга плавали дочерние элементы, которые работают по назначению.использовать
overflow: hidden;on.wrapper.wrapper { border: 3px solid green; overflow: hidden; }это экономит нам элемент каждый раз, когда мы надо
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>здесь тень работает по назначению, также она самостоятельно очищает родительский элемент, который предотвращает коллапс.
и, наконец, мы используем нижний колонтитул после того, как мы
clearплавающие элементы.
когда
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как он не плавал.в этом случае, либо вы можете
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>
вы столкнулись с ошибкой 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; }



