Почему высота элемента контейнера не увеличивается, если он содержит плавающие элементы?
Я хотел бы спросить, как работают высота и поплавок. У меня есть внешний 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 колонки, вы можете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>
до.wrapper
div
заканчивается, как<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; }
это экономит нам элемент каждый раз, когда мы надо
clear
float
но поскольку я тестировал различные случаи с этим, он потерпел неудачу в одном конкретном, который использует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_right
class
на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; }