Плавающие элементы не увеличивают высоту элемента контейнера, и поэтому, если вы их не очистите, высота контейнера не увеличится ...
Я покажу вам визуально:
Более объяснение:
<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
Свойство понято большинство начинающих. Ну, что именно делает 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
.
Разметка и стили для создания макета объяснены ниже ...
<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;
}
Давайте пошагово рассмотрим макет и посмотрим, как работает 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
конца, как
<div class="wrapper clear">
<!-- Floated columns -->
<div style="clear: both;"></div>
</div>
демонстрация
Что ж, это исправляет очень хорошо, больше не свернутый overflow: hidden;
родительский элемент , но он добавляет ненужную разметку в DOM, поэтому некоторые предлагают использовать для родительского элемента, содержащего плавающие дочерние элементы, которые работают как задумано.
Использовать overflow: hidden;
на.wrapper
.wrapper {
border: 3px solid green;
overflow: hidden;
}
демонстрация
Это экономит нам элемент каждый раз, когда нам нужно, clear
float
но, поскольку я тестировал различные случаи с этим, он потерпел неудачу в одном конкретном случае, который использует box-shadow
дочерние элементы.
Демо (не вижу тени со всех четырех сторон,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
что позволит нашему контенту обтекать.
Демо (без плавающихimg
)
Демо 2 (img
всплыл наleft
)
- Использование
float
для создания горизонтального меню - Демо
Также поплавайте второй элемент или используйте `margin`
И последнее, но не менее важное, я хочу объяснить этот конкретный случай, когда вы float
только один элемент, left
но вы неfloat
другой - нет, так что же происходит?
Предположим, что если мы удалим float: right;
из нашего .floated_right
class
, то div
рендеринг будет экстремальным, left
поскольку он не является плавающим.
демонстрация
Таким образом , в данном случае, либо вы можете float
к left
а
ИЛИ
Вы можете использовать, margin-left
который будет равен размеру левого плавающего столбца, т.е. 200px
широкий .