Я хотел бы спросить, как работают высота и поплавок. У меня есть внешний 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>
Ответы:
Плавающие элементы не увеличивают высоту элемента контейнера, и поэтому, если вы их не очистите, высота контейнера не увеличится ...
Я покажу вам визуально:
Более объяснение:
Вы также можете добавить
overflow: hidden;
элементы контейнера, но я бы предложил вам использоватьclear: both;
вместо этого.Также, если вы хотите очистить элемент, вы можете использовать
Как работает CSS Float?
Что такое поплавок и что он делает?
float
Свойство понято большинство начинающих. Ну, что именно делаетfloat
? Первоначальноfloat
свойство было введено для обтекания текста вокруг изображений, которые плаваютleft
илиright
.Вот еще одно объяснение @Madara Uchicha.Итак, неправильно ли использовать
float
свойство для размещения боксов рядом? Ответ - нет ; Нет проблем, если вы используетеfloat
свойство для установки боксов рядом.Плавающий элемент
демонстрацияinline
или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 столбцов с верхним и нижним колонтитулами и двумя столбцами, поэтому вот как выглядит план ...
В приведенном выше примере, мы будем плавающей только красные коробки, либо вы можете
float
как кleft
, или вы можетеfloat
наleft
, и другое ,right
а также, в зависимости от расположения, если это 3 колонки, вы можетеfloat
2 колонки кleft
где другой один кright
такому зависит, хотя в этом примере у нас есть упрощенная 2-колоночная компоновка, так что будетfloat
один к,left
а другой кright
.Разметка и стили для создания макета объяснены ниже ...
Давайте пошагово рассмотрим макет и посмотрим, как работает float.
Прежде всего, мы используем основной элемент обертку, можно только предположить , что это ваше окно просмотра, то мы используем
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
конца, какдемонстрация
Что ж, это исправляет очень хорошо, больше не свернутый
overflow: hidden;
родительский элемент , но он добавляет ненужную разметку в DOM, поэтому некоторые предлагают использовать для родительского элемента, содержащего плавающие дочерние элементы, которые работают как задумано.Использовать
overflow: hidden;
на.wrapper
демонстрация
Это экономит нам элемент каждый раз, когда нам нужно,
clear
float
но, поскольку я тестировал различные случаи с этим, он потерпел неудачу в одном конкретном случае, который используетbox-shadow
дочерние элементы.Демо (не вижу тени со всех четырех сторон,
overflow: hidden;
вызывает эту проблему)И что теперь? Сохраните элемент, нет,
overflow: hidden;
так что используйте хак для ясного исправления, используйте приведенный ниже фрагмент кода в своем CSS, и точно так же, как вы используетеoverflow: hidden;
для родительского элемента, вызовитеclass
ниже для родительского элемента для самоочищения.демонстрация
Здесь тень работает как задумано, также она самостоятельно очищает родительский элемент, который предотвращает свертывание.
И, наконец, мы используем нижний колонтитул после того, как мы
clear
использовали плавающие элементы.демонстрация
Когда
float: none;
используется в любом случае, как это по умолчанию, так что любое использование для объявленияfloat: none;
?Ну, это зависит от того, хотите ли вы использовать адаптивный дизайн, вы будете использовать это значение много раз, когда хотите, чтобы ваши плавающие элементы отображались один под другим с определенным разрешением. Для этого
float: none;
свойства играет важную роль там.Несколько реальных примеров того, как
float
это полезно.img
плавающего внутри,p
что позволит нашему контенту обтекать.Демо (без плавающих
img
)Демо 2 (
img
всплыл наleft
)float
для создания горизонтального меню - ДемоТакже поплавайте второй элемент или используйте `margin`
И последнее, но не менее важное, я хочу объяснить этот конкретный случай, когда вы
float
только один элемент,left
но вы неfloat
другой - нет, так что же происходит?Предположим, что если мы удалим
float: right;
из нашего.floated_right
class
, тоdiv
рендеринг будет экстремальным,left
поскольку он не является плавающим.демонстрация
Таким образом , в данном случае, либо вы можете
float
кleft
аИЛИ
Вы можете использовать,
margin-left
который будет равен размеру левого плавающего столбца, т.е.200px
широкий .источник
clear: both;
, но это хорошо, если вы чувствуете, что редактирование оправдывает себя, поэтому давайте продолжимВам нужно добавить
overflow:auto
к вашему родительскому div, чтобы он охватывал внутренний float div:Пример jsFiddle
источник
Вы столкнулись с ошибкой float (хотя я не уверен, технически ли это ошибка из-за того, как много браузеров демонстрируют такое поведение). Вот что происходит:
При нормальных обстоятельствах, предполагая, что явная высота не была установлена, элемент уровня блока, такой как div, будет устанавливать свою высоту на основе своего содержимого. Нижняя часть родительского div будет выходить за пределы последнего элемента. К сожалению, плавающий элемент мешает родительскому элементу учитывать плавающий элемент при определении его высоты. Это означает, что если ваш последний элемент является плавающим, он не будет «растягивать» родительский элемент так же, как обычный элемент.
клиринг
Есть два распространенных способа исправить это. Во-первых, добавить элемент «очистки»; то есть еще один элемент ниже плавающего, который заставит родителя растягиваться. Поэтому добавьте следующий html как последний дочерний элемент:
Он не должен быть видимым, и используя clear: both, вы убедитесь, что он будет располагаться не рядом с плавающим элементом, а после него.
Переполнение:
Второй метод, который предпочитают большинство людей (я думаю), состоит в том, чтобы изменить CSS родительского элемента так, чтобы переполнение было совсем не «видимым». Таким образом, установка переполнения на «скрытый» заставит родителя вытягиваться за дно плавающего потомка. Это верно только в том случае, если вы не установили высоту для родителя, конечно.
Как я уже сказал, второй метод предпочтительнее, так как он не требует, чтобы вы добавляли семантически бессмысленные элементы в разметку, но бывают ситуации, когда вам нужно,
overflow
чтобы они были видимы, и в этом случае добавление очищающего элемента более чем приемлемо. ,источник
Это из-за плавания div. Добавьте
overflow: hidden
на внешний элемент.демонстрация
источник
Вы путаете, как браузеры отображают элементы, когда есть плавающие элементы. Если один элемент блока является плавающим (ваш внутренний div в вашем случае), другие элементы блока будут игнорировать его, потому что браузер удаляет плавающие элементы из обычного потока веб-страницы. Затем, поскольку плавающий элемент div был удален из обычного потока, внешний элемент div заполняется, как будто внутреннего элемента div нет. Однако встроенные элементы (изображения, ссылки, текст, черные кавычки) будут соблюдать границы плавающего элемента. Если вы введете текст во внешний div, текст будет размещен вокруг внутреннего div.
Другими словами, блочные элементы (заголовки, абзацы, div и т. Д.) Игнорируют плавающие элементы и заполняют, а встроенные элементы (изображения, ссылки, текст и т. Д.) Учитывают границы плавающих элементов.
Пример скрипки здесь
источник
Попробуй это
источник
вы можете использовать свойство overflow для контейнера div, если у вас нет div для показа поверх контейнера, например:
Вот следующий CSS:
-----------------------ИЛИ-------------------------- ----
Вот следующий CSS:
источник