Плаваючі елементи не додають до висоти елемента контейнера, отже, якщо ви не очистите їх, висота контейнера не збільшиться ...
Я візуально покажу вам:
Більше пояснення:
<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
? Спочатку 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 стовпців із заголовком, колонтитулом та 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;
на.wrapper
.wrapper {
border: 3px solid green;
overflow: hidden;
}
Демо
Це економить нам елемент кожен раз, коли нам потрібно, clear
float
але, як я перевіряв різні випадки цього, це не вдалося в одному конкретному, який використовує box-shadow
дочірні елементи.
Демо (не можна побачити тінь з усіх 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
якого дозволить нашому вмісту обтікатись навколо.
Демо (без плаванняimg
)
Демо 2 (img
плаваючи доleft
)
- Використання
float
для створення горизонтального меню - Демо
Плаваємо також другим елементом або використовуємо `margin`
І останнє, але не менш важливе, я хочу пояснити цей конкретний випадок, коли ви float
лише один елемент, left
але ви не float
інший, і що відбувається?
Припустимо, якщо ми видалимо float: right;
з нашої .floated_right
class
, div
заповіт буде винесений із крайностіleft
оскільки він не буде плавати.
Демо
Тож у цьому випадку ви можете float
це зробитиleft
ж
АБО
Ви можете використовувати, margin-left
який буде дорівнює розміру лівого плаваючого стовпця, тобто 200px
широкого .