У меня есть давняя проблема 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.
Какой метод в настоящее время доступен для нас, является наиболее надежным?
Ответы:
В зависимости от разрабатываемого дизайна каждое из приведенных ниже CSS-решений clearfix имеет свои преимущества.
У clearfix есть полезные приложения, но он также использовался как взлом. Прежде чем использовать clearfix, возможно, эти современные css-решения могут быть полезны:
Современные решения Clearfix
Контейнер с
overflow: auto;
Самый простой способ очистить плавающие элементы - использовать стиль
overflow: auto
для содержащего элемента. Это решение работает во всех современных браузерах.С другой стороны, использование определенных комбинаций полей и отступов на внешнем элементе может привести к появлению полос прокрутки, но это можно решить, поместив поля и отступы на другой родительский содержащий элемент.
Использование 'overflow: hidden' также является решением с явным исправлением, но не будет иметь полос прокрутки, однако использование обрезает
hidden
любой контент, расположенный за пределами содержащего элемента.Примечание. Элемент с плавающей
img
точкой в этом примере является тегом, но это может быть любой элемент HTML.Clearfix Reloaded
Тьерри Кобленц из CSSMojo написал: «Перезагружен самый последний код» . Он отметил, что отказавшись от поддержки oldIE, решение можно упростить до одного оператора css. Кроме того, использование
display: block
(вместоdisplay: table
) позволяет корректно сворачивать поля, если элементы с clearfix являются братьями и сестрами.Это самая современная версия clearfix.
⋮
⋮
Старые решения Clearfix
Приведенные ниже решения не являются необходимыми для современных браузеров, но могут быть полезны для таргетинга на старые браузеры.
Обратите внимание, что эти решения основаны на ошибках браузера и поэтому должны использоваться только в том случае, если ни одно из указанных выше решений не работает для вас.
Они перечислены примерно в хронологическом порядке.
«Beat That ClearFix», исправление для современных браузеров
Тьерри Кобленц из CSS Mojo отметил, что когда мы нацеливаемся на современные браузеры, теперь мы можем отбросить
zoom
и::before
свойство / значения и просто использовать:Это решение не поддерживает IE 6/7 ... специально!
Тьерри также предлагает: « Слово предостережения : если вы начинаете новый проект с нуля, сделайте это, но не меняйте эту технику на ту, которая у вас есть сейчас, потому что, даже если вы не поддерживаете oldIE, ваши существующие правила мешают рушится поля ".
Micro Clearfix
Самое последнее и всемирно принятое решение clearfix, Micro Clearfix от Николаса Галлахера .
Известная поддержка: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+
Свойство переполнения
Этот базовый метод предпочтителен для обычного случая, когда позиционированный контент не будет отображаться за пределами контейнера.
http://www.quirksmode.org/css/clearing.html - объясняет, как решить общие проблемы, связанные с этой техникой, а именно, настройку
width: 100%
контейнера.Вместо того, чтобы использовать
display
свойство для установки «hasLayout» для IE, можно использовать другие свойства для запуска «hasLayout» для элемента .Другой способ очистить поплавки с помощью этого
overflow
свойства - использовать хак с подчеркиванием . IE будет применять значения с префиксом подчеркивания, другие браузеры - нет.zoom
Свойство вызывает hasLayout в IE:Хотя это работает ... не идеально использовать хаки.
ПИРОГ: легкий метод очистки
Этот старый метод «Easy Clearing» имеет преимущество, заключающееся в том, что позиционируемые элементы могут висеть за пределами контейнера, за счет более сложного CSS.
Это решение довольно старое, но вы можете узнать все о Easy Clearing на позиции все: http://www.positioniseverything.net/easyclearing.html
Элемент, использующий свойство clear
Быстрое и грязное решение (с некоторыми недостатками), когда вы быстро что-то ударили:
Недостатки
<br style="clear: both" />
теги, замусоренные вокруг разметки.источник
overflow: hidden
илиoverflow: auto
не очищает поплавки (классифицировать его как «clearfix» является неправильным); вместо этого он заставляет элемент создавать новый контекст форматирования, в котором могут содержаться числа с плавающей точкой. Это заставляет контейнер растягиваться до высоты поплавков для их удержания. Никакой очистки не требуется - при этом вы все равно можете очистить или не очистить поплавки внутри контейнера в зависимости от вашей компоновки.Какие проблемы мы пытаемся решить?
Есть два важных соображения, когда плавающие вещи:
Содержит потомок плавает. Это означает, что рассматриваемый элемент становится достаточно высоким, чтобы обернуть всех плавающих потомков. (Они не висят снаружи.)
Изоляция потомков от внешних поплавков. Это означает, что потомки внутри элемента должны иметь возможность использовать
clear: both
его и не взаимодействовать с плавающими элементами вне элемента.Блокировать контексты форматирования
Есть только один способ сделать оба этих. И это установить новый контекст форматирования блока . Элементы, которые устанавливают контекст форматирования блока, представляют собой изолированный прямоугольник, в котором поплавки взаимодействуют друг с другом. Контекст форматирования блока всегда будет достаточно высоким для визуального переноса его плавающих потомков, и никакие плавающие объекты вне контекста форматирования блока не могут взаимодействовать с элементами внутри. Эта двусторонняя изоляция - именно то, что вы хотите. В IE эта же концепция называется hasLayout , которую можно установить с помощью
zoom: 1
.Есть несколько способов установить контекст блочного форматирования, но я рекомендую решение
display: inline-block
сwidth: 100%
. (Конечно, есть обычные предостережения с использованиемwidth: 100%
, так использованияbox-sizing: border-box
или положитьpadding
,margin
иborder
на другой элемент.)Самое надежное решение
Вероятно, наиболее распространенным применением поплавков является двухколонный макет. (Может быть расширен до трех столбцов.)
Сначала разметка структуры.
А теперь CSS.
Попробуй сам
Перейдите к JS Bin, чтобы поиграть с кодом и посмотреть, как это решение строится с нуля.
Традиционные методы исправления ошибок считаются вредными
Проблема с традиционными решениями clearfix заключается в том, что они используют две разные концепции рендеринга для достижения одной и той же цели для IE и всех остальных. В IE они используют hasLayout для установки нового контекста форматирования блока, но для всех остальных они используют сгенерированные box ( ) с , который не устанавливает новый контекст форматирования блока. Это означает, что вещи не будут вести себя одинаково во всех ситуациях. Для объяснения того, почему это плохо, см. Все, что вы знаете о Clearfix, неправильно .
:after
clear: both
источник
width: 100%
"? Кроме того, вы предлагаете использоватьzoom: 1
в § 1 из § 2?overflow: hidden
, что концепция рендеринга это вызывает? И чем это может отличатьсяhasLayout
?position: absolute
, то это нормально и будет частью той же концепции рендеринга?overflow: hidden
реализует ли такая вещь, которая отличается от того, что делает hasLayout?hasLayout
на stackoverflow.com/questions/1794350/what-is-haslayout . Я думаю, что это синонимично с установлением нового контекста форматирования блока. Элементы, которые делают это, несут основную ответственность за макет всех своих дочерних элементов. Одним из результатов этого является то, что элементы, которые устанавливают новый контекст форматирования блока, содержат плавающие потомки и плавающие вне элемента не взаимодействуют сclear: left|right|both
элементами внутри. (Это в ответе выше.)Новый стандарт, используемый Inuit.css и Bourbon, - две широко используемые и хорошо поддерживаемые платформы CSS / Sass:
Ноты
Имейте в виду, что исправления ошибок по сути являются хаком для того, что макеты flexbox теперь могут обеспечить намного более разумным способом . Первоначально CSS-плавающие элементы были предназначены для обтекания встроенного содержимого - как изображения в длинной текстовой статье, а не для разметки сетки и тому подобного. Если ваши целевые браузеры поддерживают flexbox , стоит посмотреть.
Это не поддерживает IE7. Вы не должны поддерживать IE7. Это продолжает подвергать пользователей незафиксированным уязвимостям безопасности и усложняет жизнь всем остальным веб-разработчикам, поскольку снижает нагрузку на пользователей и организации на переход на современные браузеры.
Это исправление было объявлено и объяснено Тьерри Кобленцем в июле 2012 года. Оно избавляет от лишнего веса из микроочистки Николя Галлахера 2011 года . В процессе он освобождает псевдоэлемент для вашего собственного использования. Это было обновлено, чтобы использовать
display: block
вместоdisplay: table
(опять же, кредит Тьерри Кобленцу).источник
Я рекомендую использовать следующее, которое взято с http://html5boilerplate.com/
источник
Свойство overflow можно использовать для очистки чисел без дополнительной разметки:
Это работает для всех браузеров, кроме IE6, где все, что вам нужно сделать, это включить hasLayout (масштабирование - мой предпочтительный метод):
http://www.quirksmode.org/css/clearing.html
источник
overflow:hidden
имеет эффект отсечения контента; у него есть побочный эффект очистки контейнера ;-)Я нашел ошибку в официальном методе CLEARFIX: у DOT нет размера шрифта. И если вы установите
height = 0
и первый элемент в вашем DOM-дереве имеет класс "clearfix", у вас всегда будет поле в нижней части страницы размером 12 пикселей :)Вы должны исправить это так:
Теперь это часть YAML-макета ... Просто посмотрите на это - это очень интересно! http://www.yaml.de/en/home.html
источник
Это довольно аккуратное решение:
С http://nicolasgallagher.com/micro-clearfix-hack/
источник
overflow: hidden
).Clearfix от начальной загрузки:
источник
Я просто использую: -
Лучше всего работает и совместим с IE8 + :)
источник
Учитывая огромное количество ответов, я не собирался публиковать. Однако этот метод может кому-то помочь, так как он мне помог.
Держитесь подальше от поплавков, когда это возможно
Стоит отметить, что я избегаю поплавков, таких как Эбола. Есть много причин, и я не одинок; Прочтите ответ Рикудо о том, что такое исправление, и вы поймете, о чем я. По его собственным словам:
...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...
Есть и другие хорошие (а иногда и лучшие) варианты, кроме поплавков. По мере развития и совершенствования технологий, flexbox (и другие методы) получат широкое распространение, и операции с плавающей точкой станут просто плохой памятью. Может быть CSS4?
Неправильное поведение Float и сбой очищает
Во-первых, иногда вы можете думать, что вы в безопасности от поплавков, пока ваш спасатель не проколется и ваш поток HTML не начнет снижаться:
В приведенном ниже коде http://codepen.io/omarjuvera/pen/jEXBya практика очистки поплавка с
<div classs="clear"></div>
(или другим элементом) распространена, но осуждается и антисемантична .CSS
Однако , только когда вы подумали, что ваш поплавок достоин паруса ... бум! По мере того, как размер экрана становится все меньше и меньше, вы видите странное поведение, как показано на рисунке ниже (То же http://codepen.io/omarjuvera/pen/jEXBya ):
Почему ты должен заботиться? Я не уверен в точной цифре, но около 80% (или более) используемых устройств - это мобильные устройства с маленькими экранами. Настольные компьютеры / ноутбуки больше не являются королями.
Это не заканчивается
Это не единственная проблема с поплавками. Их много, но в этом примере некоторые могут сказать
all you have to do is to place your floats in a container
. Но, как вы можете видеть в коде и графике, это не так. Это, видимо, ухудшило ситуацию:HTML
CSS
Что касается результата?
Это то же самое!
Как минимум, вы знаете, что вы создадите CSS-вечеринку, пригласив на нее все виды селекторов и свойств; создавая еще больший беспорядок в вашем CSS, чем то, с чего вы начали. Просто чтобы исправить твой поплавок.
CSS Clearfix на помощь
Этот простой и очень адаптируемый фрагмент CSS - это красота и «спаситель»:
Это оно! Это действительно работает, не нарушая семантику, и я упоминал, что это работает? :
Из того же примера ... HTML
CSS
Теперь мы больше не нуждаемся
<div classs="clear"></div> <!-- Acts as a wall -->
и поддерживаем семантическую полицию счастливой. Это не единственное преимущество. Это исправление реагирует на любой размер экрана без использования@media
в простейшем виде. Другими словами, он будет контролировать ваш поплавковый контейнер и предотвращать затопление. Наконец, он обеспечивает поддержку старых браузеров в одном небольшом отборе по каратэ =)Вот снова исправление
источник
clear
именем класса не работает, заключается в том, что ваш атрибутclass
неверен. То, что вы написалиclasss
, с допs
.Я всегда плаваю в основных разделах своей сетки и применяю
clear: both;
к нижнему колонтитулу. Это не требует дополнительного div или класса.источник
честно говоря; все решения кажутся хаком, чтобы исправить ошибку рендеринга ... я не прав?
Я нашел
<br clear="all" />
самый простой, самый простой. видениеclass="clearfix"
повсюду не может затронуть чувства того, кто возражает против посторонних элементов разметки, не так ли? Вы просто рисуете проблему на другом холсте.я также использую
display: hidden
решение, которое прекрасно и не требует дополнительных объявлений классов или разметки html ... но иногда вам нужны элементы, например, для переполнения контейнера. красивые ленты и поясаисточник
overflow: hidden
Я думаю, что вы имеете в видуисточник
Я перепробовал все эти решения, большой
<html>
элемент будет добавлен к элементу автоматически, когда я использую код ниже:Наконец, я решил проблему с запасом, добавив
font-size: 0;
вышеупомянутый CSS.источник
.
, просто используйтеcontent: ""
С SASS, ясно, что это:
и он используется как:
если вы хотите новый clearfix:
источник
С LESS ( http://lesscss.org/ ) можно создать удобный помощник по очистке:
А затем используйте его с проблемными контейнерами, например:
источник
Использование
overflow:hidden
/auto
и высота для ie6 будет достаточно, если плавающий контейнер имеет родительский элемент.Любой из #test может сработать, чтобы приведенный ниже HTML-код очищал плавающие числа.
В случаях, когда это отказывается работать с ie6, просто поместите родителя в исходное состояние, чтобы очистить float.
Никогда еще не требовалось никакого другого вида очистки. Может быть, так я пишу свой HTML.
источник
Новое отображаемое значение кажется заданию в одну строку.
Из спецификации W3: «Элемент генерирует блок контейнера блока и раскладывает его содержимое с помощью компоновки потока. Он всегда устанавливает новый контекст форматирования блока для своего содержимого».
Информация: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136
Shown Как показано в ссылке выше, поддержка в настоящее время ограничена, поэтому может быть полезна резервная поддержка, как показано ниже: https://github.com/fliptheweb/postcss-flow-root
источник
Я бы
#content
тоже плавал , так как в обоих столбцах есть поплавки. Кроме того, потому что это позволит вам очистить элементы внутри#content
без очистки боковой панели.То же самое с оберткой, вам нужно сделать это контекстом форматирования блока, чтобы обернуть два столбца.
В этой статье упоминается несколько триггеров, которые вы можете использовать: блокировать контексты форматирования .
источник
Очистка - это способ автоматического удаления после себя элемента, так что вам не нужно добавлять дополнительную разметку.
Обычно вам нужно сделать что-то следующее:
С clearfix вам нужно только
источник
Зачем просто пытаться использовать css hack, чтобы сделать то, что выполняет 1 строка HTML. И почему бы не использовать семантический html, чтобы поставить разрыв, чтобы вернуться к строке?
Для меня действительно лучше использовать:
И если вам не нужен какой-либо стиль в вашем html, вы просто должны использовать класс для перерыва и вставить
.clear { clear:both; }
свой CSS.Преимущество этого:
источник
Предполагая, что вы используете эту структуру HTML:
Вот CSS, который я бы использовал:
Я использую этот набор все время, и он отлично работает для меня, даже в IE6.
источник
В отличие от других исправлений, здесь есть открытый без контейнеров
Другие исправления требуют, чтобы плавающий элемент находился в хорошо размеченном контейнере, или требуется дополнительный, семантически пустой
<div>
. И наоборот, четкое разделение контента и разметки требует строгого решения этой проблемы с помощью CSS .Тот факт, что нужно пометить конец с плавающей точкой, не допускает автоматической верстки CSS .
Если последнее является вашей целью, поплавок следует оставить открытым для чего-либо (абзацы, упорядоченные и неупорядоченные списки и т. Д.), Чтобы обернуть вокруг него, пока не встретится «clearfix». Например, clearfix может быть установлен новым заголовком.
Вот почему я использую следующий код с новыми заголовками:
Это решение широко используется на моем веб-сайте для решения проблемы: текст рядом с плавающей миниатюрой является коротким, а верхнее поле следующего очищаемого объекта не соблюдается.
Это также предотвращает любое ручное вмешательство при автоматической генерации PDF-файлов с сайта. Вот пример страницы .
источник
Я всегда использую микро-clearfix :
В Cascade Framework я даже применяю его по умолчанию для элементов уровня блока. IMO, применяя его по умолчанию к элементам уровня блока, дает элементам уровня блока более интуитивное поведение, чем их традиционное поведение. Кроме того, мне стало намного проще добавлять поддержку старых браузеров в Cascade Framework (который поддерживает IE6-8, а также современные браузеры).
источник
Вы также можете поместить это в свой CSS:
И добавьте класс "cb" в ваш родительский div:
Вам не нужно будет добавлять что-либо еще в ваш оригинальный код ...
источник
источник
Вы пробовали это:
У меня не было проблем с этим методом.
источник
<div/>
является X (HT) ML-совместимым, но не HTML-совместимым , поэтому для документов, обслуживаемыхtext/html
всеми браузерами, он будет обрабатываться как закрытый тег. К сожалению, нет такой вещи, как самозакрывающиеся теги дляtext/html
документов, независимо от типа документа .Мой любимый метод - создать класс clearfix в моем документе css / scss, как показано ниже
А затем позвоните в мой HTML-документ, как показано ниже
источник
Это так просто. Clearfix очищает проблему, когда мы используем свойства float внутри элемента div. Если мы используем два элемента div, один как float: left; а другой как float: правильно; мы можем использовать clearfix для родителя элемента div. Если мы откажемся использовать clearfix, ненужные пробелы заполняются содержимым ниже и структура сайта будет нарушена.
источник