2013-06-14 3 views

ответ

1

"Не clearfix должен заменить строку <div style="clear: both;"></div>?"

  • Нет

Представьте у вас есть контейнер, содержащий несколько элементов. Если все эти элементы плавают, контейнер эффективно теряет информацию о высоте. Таким образом, маргинальные дни и фоновые стили отображаются неправильно. Clearfix решает эту проблему, добавляя псевдоэлементы до и после элемента контейнера +, устанавливая display: table;, чтобы растянуть его до полной высоты.

В вашем случае, вам придется добавить clear: both; на #child

+1

-1 Неверно, clearfix * это *, чтобы удалить эти неземные элементы, однако это не относится к проблеме OP! – Christoph

3

Не clearfix должен заменить линии <div style="clear: both;"></div>

Да. Clearfix существует, чтобы избежать не семантического пустого тега. Однако для этого вам нужно поместить его на родительский элемент. (Example)

В вашем случае, однако, проблема не в том, что братья и сестры игнорируют перемещаемый элемент. Это не намерение clearfix, вы просто добавляете clear:right (или both, как и вы) на свой #child родной брат, чтобы восстановить нормальный поток документов.

your fixed Example

+0

Может быть, вы можете помочь мне понять это? http://jsfiddle.net/BenRacicot/owtqncfb/ – BenRacicot

+0

@BenRacicot, как я пытался объяснить, clearfix должен восстановить высоту * родителей *. Если вы хотите восстановить поток документа, вы просто объявляете «clear: both;» вместо элемента sibling - это, тем не менее, не устраняет проблему, что перемещенные элементы извлекаются из обычного потока документов! Взгляните на ваш модифицированный пример: http://jsfiddle.net/owtqncfb/9/ – Christoph

+0

Спасибо, что ответили! Таким образом, высота родителя должна учитываться с помощью переполнения или самого clearfix ...? – BenRacicot

0

В вашем случае вы пытаетесь очистить плавающым элемент из себя (с псевдо-элемент, который принадлежит к себе).

Очистка должна быть на элементах, следующих за поплавковыми элементами.

Некоторые другие правила также могут достичь этого.

http://jsfiddle.net/77RRA/6/

#main { 
    background: lightgreen; 
    width: 100px; 
    height: 200px; 
} 

#one { 
    float: right; 
    display: block; 
} 

#child { 
    background: red; 
    width: 100%; 
    height: 20px; 
    display:inline-block 
} 

display:inline-block; очистит этот элемент из плавающых элементов любых сторон.

+0

В то время как 'display: inline-block;' возможно, использовать его невозможно, так как иногда вам нужен другой тип отображения, и в конце концов для этого существует 'clear'. – Christoph

+0

это хорошо для примера (я удалил: после и добавил только это правило). Я считаю, особенно для новичков, что полезно понять, что ясный - это не единственный вариант для борьбы с флотирующим элементом. Элемент элемента floatting имеет поведение, которое может быть очень сложным для понимания между фиксированными, абсолютными, относительными и статическими. Это очень много, и некоторые подсказки помогают учиться самостоятельно. –

+0

Если вы можете объяснить * почему * это работает, тогда я могу принять вашу мысль, иначе я бы просто рассматривал это как еще одну возможность смутить людей. :) – Christoph