Які методи 'clearfix' я можу використовувати?


864

У мене є вікова проблема divобгортання макетів з двома колонками. Моя бічна панель є плаваючою, тому мій контейнер divне може завернути вміст і бічну панель.

<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>

Здається, існує чимало методів виправлення явної помилки у Firefox:

  • <br clear="all"/>
  • overflow:auto
  • overflow:hidden

У моїй ситуації єдине, що, здається, працює правильно, - це <br clear="all"/>рішення, яке є трохи скрутним. overflow:autoдає мені неприємні смуги прокрутки, і, overflow:hiddenбезумовно, має побічні ефекти. Крім того, IE7, мабуть, не повинен страждати від цієї проблеми через неправильну поведінку, але в моїй ситуації він страждає так само, як і Firefox.

Який доступний у нас метод є найбільш надійним?


1
Я використовую jqui.net/tips-tricks/css-clearfix, це допомагає мені приховати крапку :)
Val

1
Що з IE 6 та IE 7? Вони ніколи не дотримуються правильного способу очищення речей.
Правен Кумар Пурушотхаман

Тепер ми вже рік, чи є шанс переглянути правильну відповідь на сучасний трирядковий чіткий виправлення, викладений тут , як це використовується в широкоіменних рамках Bourbon та Inuit.css? Дивіться мою відповідь нижче .
Іоно

Відповіді:


1039

Залежно від дизайну, що розробляється, кожне з наведених нижче розчинів CSS має свої переваги.

У виправлення є корисні програми, але він також використовувався як хак. Перш ніж використовувати чітке виправлення, можливо, ці сучасні рішення css можуть бути корисними:


Сучасні рішення Clearfix


Контейнер с overflow: auto;

Найпростіший спосіб очищення плаваючих елементів - це використання стилю, overflow: autoщо містить елемент. Це рішення працює у всіх сучасних браузерах.

<div style="overflow: auto;">
  <img
    style="float: right;"
    src="path/to/floated-element.png"
    width="500"
    height="500"
  > 
  <p>Your content here…</p>
</div>

З одного боку, використання певних комбінацій поля та накладки на зовнішньому елементі може призвести до появи смуг прокрутки, але це можна вирішити, розмістивши поле та прокладку на іншому батьківському елементі.

Використання "переповнення: приховано" також є рішенням для виправлення, але не буде мати смуг прокрутки, однак за допомогою hiddenобрізання будь-якого вмісту, розміщеного за межами елемента, що містить.

Примітка . Плаваючий елемент - це imgтег у цьому прикладі, але може бути будь-яким html-елементом.


Clearfix Reloaded

Тьєррі Кобленц в CSSMojo написав: Перезавантажений самий останній виправлення . Він зазначив, що, відмовившись від підтримки oldIE, рішення можна спростити до одного оператора css. Крім того, використання display: block(замість display: table) дозволяє полем руйнуватися належним чином, коли елементи з чітким виправленням є побратимами.

.container::after {
  content: "";
  display: block;
  clear: both;
}

Це найсучасніша версія виправлення.


Старіші рішення Clearfix

Наведені нижче рішення не потрібні сучасним браузерам, але можуть бути корисними для націлювання на старі браузери.

Зауважте, що ці рішення покладаються на помилки браузера, і тому їх слід використовувати лише в тому випадку, якщо жодне з перерахованих вище рішень не працює для вас.

Вони перераховані приблизно в хронологічному порядку.


"Beat That ClearFix" - чітке виправлення для сучасних браузерів

Тьєррі Кобленц з CSS Mojo зазначив, що, орієнтуючись на сучасні веб-переглядачі, ми можемо відкинути значення zoomта ::beforeвластивості / значення та просто використовувати:

.container::after {
    content: "";
    display: table;
    clear: both;
}

Це рішення не підтримує IE 6/7… спеціально!

Тьєррі також пропонує: " Слово обережності : якщо ви починаєте новий проект з нуля, продовжуйте його виконувати, але не обмінюйте цю техніку з тією, яку ви маєте зараз, тому що, хоча ви не підтримуєте oldIE, ваші існуючі правила перешкоджають руйнуються поля ".


Micro Clearfix

Найсвіжіше і всесвітньо прийняте рішення Clearfix, Micro Clearfix від Nicolas Gallagher .

Відома підтримка: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

.container::before, .container::after {
  content: "";
  display: table;
}
.container::after {
  clear: both;
}
.container {
  zoom: 1;
}

Властивість переповнення

Цей основний метод є кращим для звичайного випадку, коли розміщений вміст не відображатиметься за межами контейнера.

http://www.quirksmode.org/css/clearing.html - пояснює, як вирішити поширені проблеми, пов’язані з цією методикою, а саме встановлення width: 100%на контейнер.

.container {
  overflow: hidden;
  display: inline-block;
  display: block;
}

Замість використання displayвластивості для встановлення "hasLayout" для IE, інші властивості можна використовувати для запуску елемента "hasLayout" для елемента .

.container {
  overflow: hidden;
  zoom: 1;
  display: block;
}

Ще одним способом очищення плавців за допомогою overflowвластивості є використання підкреслення . IE застосовуватиме значення з префіксом підкреслення, інші браузери не будуть. zoomВластивість викликає hasLayout в IE:

.container {
  overflow: hidden;
  _overflow: visible; /* for IE */
  _zoom: 1; /* for IE */
}

Хоча це працює ... використовувати хаки не ідеально.


PIE: Легкий спосіб очищення

Цей старший метод "Easy Clearing" має перевагу в тому, що дозволяє позиціонованим елементам висіти за межі контейнера за рахунок більш складних CSS.

Це рішення досить давнє, але ви можете дізнатися все про те, що простий спосіб очищення позиції - це все: http://www.positioniseverything.net/easyclearing.html


Елемент, що використовує властивість "clear"

Швидке та брудне рішення (з деякими недоліками), коли ви швидко щось ляпаєте разом:

<br style="clear: both" /> <!-- So dirty! -->

Недоліки

  • Це не реагує, і, таким чином, може не забезпечити бажаного ефекту, якщо стилі компонування змінюються на основі запитів медіа Рішення в чистому CSS є більш ідеальним.
  • Він додає розмітку html, не обов'язково додаючи семантичне значення.
  • Він вимагає вбудованого визначення та рішення для кожного екземпляра, а не посилання класу на єдине рішення “clearfix” у css та посилання класу на нього у html.
  • Це ускладнює роботу з кодом для інших, оскільки їм, можливо, доведеться писати більше хаків для роботи над ним.
  • Надалі, коли вам потрібно / хочете використовувати інше рішення для виправлення, вам не доведеться повертатися назад і видаляти кожен <br style="clear: both" />тег, розміщений навколо розмітки.

25
@David Rivers: Метод: after не є хаком, оскільки він не використовує помилку розбору в браузері, він використовує функцію css як рішення. Додатково: after буде підтримуватися в майбутніх браузерах, на відміну від злому підкреслення. В ідеалі буде властивість css, яку можна застосувати до елемента, що призведе до того, що він буде містити весь його вміст.
Бо Сміт

7
Дякуємо за поломку. Я вважаю, що після "простого очищення" метод перевершує "переповнення: приховано", оскільки він не обрізає тіні CSS3 або розташовані елементи. Додаткові рядки коду, безумовно, варті того.
Анеон

7
Я не виступаю за чітке рішення: і те і інше, але я не згоден з вашим "брудним" маркуванням цього. Аргумент "додавання ваги / завантаження повільніше" здається нерозумним, оскільки це 1 короткий рядок коду html, порівняно з декількома рядками CSS (який також повинен завантажувати ваш браузер). Для аргументу «смислового значення» - відповідь з чітким: і те, і інше набагато простіше зрозуміти, ніж намагатися розібратися в купі css goofy firewad. br ясно: і короткий, і простий, і imho не впливає на "професіоналізм".
Vigrond

16
Всупереч поширеній думці, overflow: hiddenабо overflow: autoне чітко плаває (класифікувати його як "clearfix" - неправильно); натомість це змушує елемент створити новий контекст форматування, в якому плавці можуть міститися. Це змушує контейнер розтягуватися на висоту поплавців, щоб утримувати їх. Ніякого зазору не пов’язано ні з чим - якщо говорити, ви все одно можете вибрати, щоб очистити чи не очистити поплавці всередині контейнера залежно від вашого макета.
BoltClock

3
Ми більше не повинні підтримувати IE7. Будь ласка , поновіть це з три рядки методу , описаного тут
іоносферні

70

Які проблеми ми намагаємося вирішити?

При плаваючому матеріалі є два важливих питання:

  1. Містять нащадки плаває. Це означає, що розглянутий елемент робить себе досить високим, щоб обернути всіх плавучих нащадків. (Вони не висять надворі.)

    Плаваючий вміст висить поза його контейнера

  2. Ізолюючі нащадки ззовні пливуть. Це означає, що нащадки всередині елемента повинні мати можливість використовувати його clear: bothі не мати взаємодії з плаваючими елементами поза елементом.

    <code> clear: обидва </code> взаємодіють з поплавком в іншому місці DOM

Блокувати контексти форматування

Є лише один спосіб зробити це обоє. А це - встановити новий контекст форматування блоку . Елементи, що встановлюють контекст блокування форматування, - це ізольований прямокутник, в якому плавучі взаємодіють між собою. Контекст форматування блоку завжди буде достатньо високим, щоб візуально обгортати його плаваючих нащадків, і жоден плавець поза контекстом форматування блоку не може взаємодіяти з елементами всередині. Ця двостороння ізоляція - саме те, що ви хочете. У IE ця сама концепція називається hasLayout , яку можна встановити через zoom: 1.

Є кілька способів , щоб встановити блок контексту форматування, але рішення я рекомендую display: inline-blockз width: 100%. (Звичайно, є звичайні застереження з використанням width: 100%, так використання box-sizing: border-boxабо покласти padding, marginі borderна інший елемент.)

Найбільш надійне рішення

Напевно, найпоширеніше застосування плавців - це двоколонний макет. (Можна розширити до трьох стовпців.)

Спочатку структура розмітки.

<div class="container">
  <div class="sidebar">
    sidebar<br/>sidebar<br/>sidebar
  </div>
  <div class="main">
    <div class="main-content">
      main content
      <span style="clear: both">
        main content that uses <code>clear: both</code>
      </span>
    </div>
  </div>
</div>

А тепер CSS.

/* Should contain all floated and non-floated content, so it needs to
 * establish a new block formatting context without using overflow: hidden.
 */
.container {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

/* Fixed-width floated sidebar. */
.sidebar {
  float: left;
  width: 160px;
}

/* Needs to make space for the sidebar. */
.main {
  margin-left: 160px;
}

/* Establishes a new block formatting context to insulate descendants from
 * the floating sidebar. */
.main-content {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

Спробуйте самі

Перейдіть до JS Bin, щоб пограти з кодом і подивитися, як це рішення будується з нуля.

Традиційні методи явного виправлення вважаються шкідливими

Проблема з традиційними рішеннями clearfix полягає в тому, що вони використовують дві різні концепції візуалізації для досягнення однієї і тієї самої мети для IE та всіх інших. В IE вони використовують hasLayout для встановлення нового контексту форматування блоку, але для всіх інших вони використовують створені поля ( ) з , що не встановлює новий контекст форматування блоку. Це означає, що речі не будуть вести себе однаково у всіх ситуаціях. Щоб пояснити, чому це погано, див . Невірно все, що ви знаєте про Clearfix .:afterclear: both


Що таке "звичайні застереження щодо використання width: 100%"? Також ви пропонуєте використовувати zoom: 1в пункті 1 §2?
Баумр

Цікава відповідь, а як щодо того overflow: hidden, яка концепція візуалізації викликає це? А як можна по-іншому hasLayout?
Баумр

Щоправда, але якщо хтось уникає використання position: absolute, то це добре і буде частиною тієї самої концепції візуалізації?
Баумр

Розумію. Під рендерінгом поняття я мав на увазі, чи overflow: hiddenзастосовується таке, що відрізняється від того, що маєLayout?
Баумр

2
Детальніше про те, hasLayoutна сайті stackoverflow.com/questions/1794350/what-is-haslayout . Я вважаю це синонімом встановлення нового контексту форматування блоку. Елементи, які роблять це, по суті відповідають за компонування всіх їхніх нащадкових елементів. Результатом цього є те, що елементи, що встановлюють новий контекст форматування блоку, містять плаваючі нащадки, а поплавці поза елементом не взаємодіють з clear: left|right|bothелементами всередині. (Це у відповіді вище.)
Кріс Кало

54

Новий стандарт, який застосовують Inuit.css та Bourbon - дві дуже широко використовувані та доглянуті рамки CSS / Sass:

.btcf:after {
    content:"";
    display:block;
    clear:both;
}

Примітки

Майте на увазі, що виправлення - це, по суті, хак для того, що макети flexbox тепер можуть забезпечувати набагато розумнішим чином . CSS-поплавці спочатку були розроблені для того, щоб вбудований вміст протікав навколо - як зображення у довгій текстовій статті - а не для макетів сітки тощо. Якщо ваші цільові браузери підтримують flexbox , то варто переглянути.

Це не підтримує IE7. Ви не повинні підтримувати IE7. Це продовжує піддавати користувачів нефіксованим подвигам безпеки та ускладнює життя для всіх інших веб-розробників, оскільки це зменшує тиск на користувачів та організації перейти на сучасні браузери.

Цей чіткий виправлення був оголошений і пояснений Тьєррі Кобленцом у липні 2012 року. Він віддає непотрібну вагу завдяки мікро-прозорості Ніколя Галлахера 2011 року . У процесі він звільняє псевдоелемент для власного використання. Це було оновлено для використання, display: blockа не display: table(знову ж таки, кредит Тьєррі Кобленцу).


3
Я сподіваюся, що ваша відповідь набере більше голосів щодо цього, оскільки я повністю з вами згоден. Знову-таки, це 2013 рік, і я справді вірю, що це рішення, яким люди повинні користуватися.
rafaelbiten

2
Домовились. theie7countdown.com Перевірте власну аналітику та сподіваємось побачити, що IE7 не вартий вашого часу.
Джастін

1
@ Джустін погодився; ваша особиста аналітика викладе це. Я не думаю, що сайт відліку часу оновлювався, хоча найкраще використовувати статистику каніуси, яка ставить IE7 на 0,39% у всьому світі.
іоно

1
Будемо сподіватися, що хаки, подібні до виправлення, незабаром стануть непотрібними за допомогою використання флексбоксу, а не плаваючих, для макета.
іоно

Ви можете заперечити підтримку IE7 скільки завгодно, але якщо з боку бізнесу є необхідність підтримувати цих користувачів (з різних причин - зазвичай це гроші), ви збираєтесь це робити, незалежно від того, як ви ставитесь до цього питання
Кріс Селбекк

27

Я рекомендую використовувати наступне, яке взято з http://html5boilerplate.com/

/* >> The Magnificent CLEARFIX << */
.clearfix:after { 
  content: "."; 
  display: block; 
  height: 0; 
  clear: both; 
  visibility: hidden; 
}
.clearfix { 
  display: inline-block;  
}
* html .clearfix {  
  height: 1%;  
} /* Hides from IE-mac \*/
.clearfix {  
  display: block;  
}

8
Хто зараз пам’ятає IE-mac? Чому ускладнюють справи через проблеми, які не є більш актуальними?
Ілля Стрельцин

23

Властивість переповнення може використовуватися для очищення плавців без додаткової розмітки:

.container { overflow: hidden; }

Це працює для всіх браузерів, окрім IE6, де все, що вам потрібно зробити, це увімкнути hasLayout (масштабування - мій кращий метод):

.container { zoom: 1; }

http://www.quirksmode.org/css/clearing.html


3
переповнення: прихований не працює в браузері PS3. Мало того, що більшість людей потребує цього для роботи, але це найважливіше, що підірвав мій сайт у PS3, на який ми намагаємось націлитись з бізнес-причин. Тьфу.
gtd

1
І це проблема, якщо ви дійсно хочете, щоб певний вміст висів поза контейнера.
Саймон Іст

переповнення: прихований має поганий побічний ефект відсікання вмісту
Кріс Кало

9
overflow:hiddenмає ефект відсікання вмісту; це має побічний ефект очищення контейнера ;-)
Тамлін

переповнення: автоматичне також спричинить контекст блокування блоку, і він не буде вирізати вміст.
Гаррі Роббінс

17

Я знайшов помилку в офіційному методі CLEARFIX: DOT не має розміру шрифту. І якщо ви встановите height = 0і перший елемент у вашому DOM-Tree має клас "clearfix", у вас завжди буде поле у ​​нижній частині сторінки 12px :)

Ви повинні виправити це так:

/* float clearing for everyone else */
.clearfix:after{
  clear: both;
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
  font-size: 0;
}

Зараз це частина YAML-макета ... Погляньте на це - це дуже цікаво! http://www.yaml.de/uk/home.html


15

Це досить охайне рішення:

/* For modern browsers */
.cf:before,
.cf:after {
    content:"";
    display:table;
}

.cf:after {
    clear:both;
}

/* For IE 6/7 (trigger hasLayout) */
.cf {
    zoom:1;
}

Відомо, що він працює в Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

У тому числі: перед селектором не потрібно очищати поплавці, але це запобігає краху верхньої межі в сучасних браузерах. Це забезпечує наявність візуальної узгодженості з IE 6/7 при застосуванні масштабування: 1.

Від http://nicolasgallagher.com/micro-clearfix-hack/


1
Так, станом на середину 2011 року це моє улюблене рішення. Він дозволяє розміщувати об'єкти за межами цього поля, якщо це необхідно (уникаючи overflow: hidden).
Саймон Іст

10

Виправлення з завантажувальної програми:

.clearfix {
  *zoom: 1;
}

.clearfix:before,
.clearfix:after {
  display: table;
  line-height: 0;
  content: "";
}

.clearfix:after {
  clear: both;
}

З якої версії завантажувального пристрою це?
Ерік

8

Я просто використовую: -

.clear:after{
  clear: both;
  content: "";
  display: block;
}

Працює найкраще та сумісніше з IE8 + :)


Не працюватиме в IE7, оскільки він не підтримує псевдоелементи CSS.
суперлюмінація

4
... Тому він сказав "сумісний з IE8 +". Більшість веб-сайтів більше не потребують підтримки IE7, використання в світі менше 1%. theie7countdown.com
Джастін

8

Враховуючи величезну кількість відповідей, я не збирався публікувати. Однак цей метод може комусь допомогти, як і мені.

Залишайтеся вдалині від поплавків, коли це можливо

Варто згадати, я уникаю поплавків, як Ебола. Причин багато, і я не один; Прочитайте відповідь Рікудо про те, що є чітким виправленням, і ви побачите, що я маю на увазі. Його власними словами:...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...

Є й інші хороші (а іноді й кращі) варіанти, крім плавців. По мірі прогресу та вдосконалення технологій, флексбокс (та інші методи) будуть широко сприйняті , а плавучі стануть лише поганою пам'яттю. Може бути, CSS4?


Поводяться недобросовісні поведінки та невдалі очищає

По-перше, іноді ви можете подумати, що ви в безпеці від поплавків, поки ваш рятівник не буде пробитий, і ваш потік HTML не почне тонути:

У наведеному нижче коді http://codepen.io/omarjuvera/pen/jEXBya практика очищення поплавця <div classs="clear"></div>(або іншого елемента) є загальною, але нахмурена і антисемантична .

<div class="floated">1st</div>
<div class="floated">2nd</div>
<div class="floated">3nd</div>
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

div {
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

div.floated {
    float: left;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Однак якраз тоді, коли ти думав, що твій плавець гідний вітрил ... бум! Оскільки розмір екрана стає все меншим і меншим, ви бачите дивні форми поведінки, як на графіці нижче (Те саме http://codepen.io/omarjuvera/pen/jEXBya ):

зразок поплавкового клопа 1

Чому ти повинен дбати? Я не впевнений у точній цифрі, але приблизно 80% (або більше) використовуваних пристроїв - це мобільні пристрої з невеликими екранами. Настільні комп'ютери / ноутбуки вже не є королем.


Це не закінчується

Це не єдина проблема з поплавцями. Є багато, але в цьому прикладі деякі можуть сказати all you have to do is to place your floats in a container. Але як ви бачите в кодеці та графіці, це не так. Це, мабуть, зробило найгірше:

HTML

<div id="container" class="">
  <div class="floated">1st</div>
  <div class="floated">2nd</div>
  <div class="floated">3nd</div>
</div> <!-- /#conteiner -->
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

#container {
  min-height: 100px; /* To prevent it from collapsing */
  border: 1px solid #0f0;
}
.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Що стосується результату?

Це ж! зразок поплавкового клопа 2

Якнайменше ви знаєте, ви розпочнете вечірку CSS, запросивши на вечірку всілякі селектори та властивості; створюючи більший безлад свого CSS, ніж те, з чого ви почали. Просто, щоб виправити свій поплавок.


CSS Clearfix на допомогу

Цей простий і дуже пристосований фрагмент CSS - це краса та "рятівник":

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Це воно! Це дійсно працює, не порушуючи семантики, і я згадував, що це працює? :

З того ж зразка ... HTML

<div class="clearfix">
    <div class="floated">1st</div>
    <div class="floated">2nd</div>
    <div class="floated">3nd</div>
</div>
<section>Below</section>

CSS

div.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}
section {
        border: 4px solid #00f;
}


.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Тепер нам більше не потрібна <div classs="clear"></div> <!-- Acts as a wall -->і щаслива семантична поліція. Це не єдина користь. Це чітке виправлення реагує на будь-який розмір екрана, не використовуючи @mediaйого в найпростішій формі. Іншими словами, він буде тримати ваш поплавковий контейнер під контролем та запобігати затопленню. Нарешті, він забезпечує підтримку старих веб-переглядачів в одному маленькому відбиванні карате =)

Ось знову виправлення

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

2
Причина, чому елемент з clearназвою класу не працює, полягає в тому, що ваш атрибут classнеправильний. Те, що ви написали classs, з додатковим s.
каштан

Ваш приклад не демонструє, на що ви заявляєте, навіть після виправлення помилок.
Відновіть Моніку - немейнард

7

Я завжди плаваю основними ділянками своєї сітки і звертаюся clear: both;до нижнього колонтитулу. Для цього не потрібен додатковий розділ або клас.


Ніл, я думаю, що проблема виникає, коли вам потрібно встановити межу навколо обох стовпців (або фоновий колір / зображення), вам потрібен розділ обгортки, який потребує вмісту хак.
Simon Simon

5

чесно; всі рішення здаються хакером, щоб виправити помилку візуалізації ... я помиляюся?

я виявив <br clear="all" />себе найпростішим, найпростішим. бачити class="clearfix"скрізь не може погладити чутливість того, хто заперечує проти сторонніх елементів маркетингу, чи не так? ти просто малюєш проблему на іншому полотні.

Я також використовую display: hiddenрішення, яке чудово і не вимагає додаткових оголошень класу або розмітки html ... але іноді потрібні елементи для переповнення контейнера, наприклад. симпатичні стрічки та крила


5
overflow: hiddenЯ думаю, ти маєш на увазі
ajbeaven

Деякі рекомендують використовувати клас, який називається групою, що робить речі більш семантичними. Я відверто не впевнений, чому це не наздогнало
Деймон

я повністю відступає від цієї позиції. я просто використовую clearfix зараз. але на дуже поширених контейнерах я 'запікаю' його в css, щоб скоротити забруднення атрибутів класу. також, називати його "групою" здається приємно. менше символів для
набору,


4

Я випробував всі ці рішення, велика маржа буде додана до <html>елемента автоматично, коли я використовую код нижче:

.clearfix:after {   
    visibility: hidden;   
    display: block;   
    content: ".";   
    clear: both;   
    height: 0;
}

Нарешті, я вирішив проблему з маржами, додавши font-size: 0;до вищевказаного CSS.


2
Це тому, що ви додаєте рядок із ., просто використовуйтеcontent: ""
Сорок

4

За допомогою SASS, виправлення:

@mixin clearfix {
    &:before, &:after {
        content: '';
        display: table;
    }
    &:after {
        clear: both;
    }
    *zoom: 1;
}

і використовується так:

.container {
    @include clearfix;
}

якщо ви хочете новий чіткий виправлення:

@mixin newclearfix {
    &:after {
        content:"";
        display:table;
        clear:both;
    }
}

4

З МЕНШЕ ( http://lesscss.org/ ) можна створити зручний помічник для виправлення:

.clearfix() {
  zoom: 1;
  &:before { 
    content: ''; 
    display: block; 
  }
  &:after { 
    content: ''; 
    display: table; 
    clear: both; 
  }
}

А потім використовуйте його з проблемними контейнерами, наприклад:

<!-- HTML -->
<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>
/* LESS */
div#container {
  .clearfix();
}

4

Використання overflow:hidden/ autoі висоти для ie6 буде достатньо, якщо плаваючий контейнер має батьківський елемент.

Будь-який із #test може працювати, щоб HTML, зазначений нижче, очищав плаваючі.

#test {
  overflow:hidden; // or auto;
  _height:1%; forces hasLayout in IE6
}

<div id="test">
  <div style="floatLeft"></div>
  <div style="random"></div>
</div>

У випадках, коли це відмовляється працювати з ie6, просто переведіть на батьківський сценарій, щоб очистити поплавок.

#test {
  float: left; // using float to clear float
  width: 99%;
}

Ще ніколи не знадобився будь-який інший вид очищення. Можливо, саме так я пишу свій HTML.


1
Я хотів би вивчити ваш спосіб написання HTML, не очищаючи жодних елементів. Чи можете ви опублікувати деякі посилання?
Starx

4

Нове значення відображення здається завданням в одному рядку.

display: flow-root;

З специфікації W3: "Елемент генерує блок блоку контейнерів і викладає його вміст, використовуючи макет потоку. Він завжди встановлює новий контекст форматування блоку для його вмісту."

Інформація: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136

※ Як показано у посиланні вище, підтримка наразі обмежена, тому підтримка резервного копіювання, як показано нижче, може бути корисною: https://github.com/fliptheweb/postcss-flow-root


3

Я б також плавав #content, так що обидва стовпці містять поплавці. Також тому, що це дозволить очистити елементи всередині, #contentне очищаючи бічну смугу.

Те саме, що і з обгорткою, вам потрібно буде створити контекст форматування блоку, щоб обернути два стовпці.

У цій статті згадується кілька тригерів, які ви можете використовувати: блокувати контексти форматування .


3

Очищення - це спосіб автоматичного очищення елемента після себе, так що вам не потрібно додавати додаткову розмітку.

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
.cleaner {
  clear: both;
}

Зазвичай вам потрібно буде зробити щось наступне:

<div style="float: left;">Sidebar</div>
<div class="cleaner"></div> <!-- Clear the float -->

З Clearfix вам потрібно лише

<div style="float: left;" class="clearfix">Sidebar</div>
<!-- No Clearing div! -->

2

Чому просто намагаються використовувати css hack, щоб зробити те, що 1 рядок HTML виконує завдання. А чому б не використати семантичний html tu put break, щоб повернутися до рядка?

Для мене справді краще використовувати:

<br style="clear:both" />

І якщо ви не хочете будь-якого стилю у вашому html, вам просто потрібно використовувати клас для перерви та ввести .clear { clear:both; }свій CSS.

Перевага цього:

  • Семантичне використання html для повернення до рядка
  • Якщо не завантажено CSS, воно буде працювати
  • Не потрібен додатковий код CSS та Hack
  • не потрібно імітувати br з CSS, це вже існує в HTML

2

Припустимо, що ви використовуєте цю структуру HTML:

<div id="container">
  <div id="content">
  </div>
  <div id="sidebar">
  </div>
</div>

Ось CSS, який я б використовував:

div#container {
    overflow: hidden;    /* makes element contain floated child elements */
}

div#content, div#sidebar {
    float: left;
    display: inline;    /* preemptively fixes IE6 dobule-margin bug */
}

Я постійно користуюся цим набором, і він чудово працює для мене, навіть в IE6.


2

На відміну від інших чітких виправлень, тут відкритий без контейнерів

Інші чіткі виправлення або вимагають, щоб плаваючий елемент знаходився в добре відміченому контейнері, або потрібен додатковий, семантично порожній <div>. І навпаки, чітке розділення вмісту та розмітки вимагає суворого рішення CSS для цієї проблеми.

Сам факт, що потрібно відмітити кінець поплавця, не допускає без нагляду набору CSS .

Якщо остання ваша мета, float слід залишити відкритим для чого-небудь (абзаців, упорядкованих та не упорядкованих списків тощо), щоб обернутись навколо нього, поки не з’явиться «чіткий виправлення». Наприклад, виправлення може бути встановлено новим заголовком.

Ось чому я використовую таке чітке виправлення з новими заголовками:

h1 {
    clear: both;
    display: inline-block;
    width: 100%;
}

Це рішення широко використовується на моєму веб-сайті для вирішення проблеми: Текст поруч із плаваючою мініатюрою короткий, а верхній край наступного об’єкта очищення не дотримується.

Це також запобігає будь-якому ручному втручанню при автоматичному генеруванні PDF-файлів із сайту. Ось приклад сторінки .


2

Я завжди використовую мікро-очищення :

.cf:before,
.cf:after {
    content: " ";
    display: table;
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 */
.cf {
    *zoom: 1;
}

У Cascade Framework я навіть застосовую його за замовчуванням для елементів рівня блоку. IMO, застосовуючи його за замовчуванням на елементах рівня блоків, надає елементам рівня блоку більш інтуїтивну поведінку, ніж їх традиційну поведінку. Також мені стало набагато простіше додати підтримку старих браузерів до Cascade Framework (який підтримує IE6-8, а також сучасні браузери).


0

Ви також можете помістити це у свій CSS:

.cb:after{
  visibility: hidden;
  display: block;
  content: ".";
  clear: both;
  height: 0;
}

*:first-child+html .cb{zoom: 1} /* for IE7 */

І додайте клас "cb" до свого батьківського div:

<div id="container" class="cb">

Вам не потрібно буде нічого більше додавати до початкового коду ...


0

#content{float:left;}
#sidebar{float:left;}
.clear{clear:both; display:block; height:0px; width:0px; overflow:hidden;}
<div id="container">
  <div id="content">text 1 </div>
  <div id="sidebar">text 2</div>
  <div class="clear"></div>
</div>


-2

Ви спробували це:

<div style="clear:both;"/>

У мене не було проблем із цим методом.


2
Я думаю, що в цьому рішенні ми намагаємося уникати як додаткових стилів розмітки, так і вбудованих стилів. Це залежить від того, який компроміс з вашим найщасливішим, я думаю,
Сем Мюррей-Саттон

1
Проблема цього методу полягає в тому, що в браузерах IE div має висоту, тому інтервал буде вимкнено. Саме тому методи css встановлюють висоту та розмір шрифту.
zznq

вам потрібно сказати <div style = "clear: obo"> </div> за допомогою відповідного тега для завершення сумісності XHTML. У мене виникли проблеми з jQuery, коли цього не
робилося

1
Як не дивно, «повинен-бути-самим-замкнутим» <div/> є X (HT) ML відповідає, але НЕ HTML сумісні , тому для документів , що послужили text/htmlвсіх браузери будуть розглядати його як незакриті тег. На жаль, не існує такого поняття, як самозакриваються теги для text/htmlдокументів, незалежно від доктрипу , на жаль.
Ілля Стрельцин

-2

Мій улюблений метод - створити клас чіткої корекції в документі css / scss, як показано нижче

.clearfix{
    clear:both
}

А потім зателефонуйте в мій html-документ, як показано нижче

<html>
  <div class="div-number-one">
    Some Content before the clearfix
  </div>

  <!-- Let's say we need to clearfix Here between these two divs --->
  <div class="clearfix"></div>

  <div class="div-number-two">
    Some more content after the clearfix
  </div>
</html>

-2

Це настільки просте чітке виправлення усуває проблему, коли ми використовуємо властивості float всередині елемента div. Якщо ми використовуємо два елементи div один як float: left; та інший як плаваючий: право; ми можемо використовувати clearfix для батьків двох елементів div. Якщо ми відмовляємось у використанні clearfix, зайві пробіли заповнюються вмістом нижче та структура сайту буде порушена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.