Jump to content
  • 0

Проблема с Div и флоатными элементами


rango2014
 Share

Question

Верстаю собственно страничку, вот код http://jsfiddle.net/Yura/mWNap/

 

Возникла такая проблема, имеется header content и  footer

 

в контенте имеются элементы <ul><li></li></ul> при помощи которых сделано горизонтальное меню

естественно эти элементы флоатны.

Так вот когда я выставляю для <li> float:left

нижняя граница контента приподнимается над <ul>

Что бы опустить границу, после ul вставил <div> </div> и присвоил ему clear:both; тогда граница опускается

 

Пожалуйста объясните, почему происходит поднятие границы, ведь насколько я понимаю <ul> находится в <div id="content"> и не должен выходить за его границы.

 

Заранее спасибо.

 

вот еще нарисовал картинку, может будет понятней :-)

 

4905309.jpg

Link to comment
Share on other sites

19 answers to this question

Recommended Posts

  • 0

Здесь вот в чём дело, одно из особенностей  свойства float - оно ещё и влияет на  соседние теги, которые находятся после блока, которым float не задан по этому после такого блока принято писать блок с свойством clear

Link to comment
Share on other sites

  • 0

Надо почитать статьи как отменить обтекание. Есть несколько способов. 

Два лучших - это ovehflow: hidden родителию или псевдоэлемент :after { clear: both; display: table; content: ""; } тоже родителю.

Я кстати пишу display: block - есть какие-то минусы по сравнению с table?

Link to comment
Share on other sites

  • 0
Еще лучше поставить .clearfix перед футером. overflow: hidden; не всегда полезен.

 

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

 

Плюс интересно узнать мнение всех верстальщиков, как вы думаете - не нагружает ли клиарфикс систему? допустим мы 20 раз вставили его в код - у нас лишние 20 псевдослоев - не скажутся ли они на производительности системы?

Edited by Zverushka
Link to comment
Share on other sites

  • 0
пишу display: block - есть какие-то минусы по сравнению с table?

http://jsfiddle.net/zTv5y/2/

 

 

 

не нагружает ли клиарфикс систему?

Сами по себе невидимые слои нулевого размера особо грузить рендерер не должны. Но любые зависимости положения элементов друг от друга (а при float их полно) заставляют браузер пересчитывать, а то и перерисовывать все эти элементы при каждом изменении (напр. анимациях размеров).

  • Like 2
Link to comment
Share on other sites

  • 0

Вот оно в чем дело, а я то думала, почему у меня маргин не работает =).....

марджин то должен работать, просто из-за нулевого размера блока он не там, где бы вы хотели. Хотя может вы о другом.

Link to comment
Share on other sites

  • 0

 

пишу display: block - есть какие-то минусы по сравнению с table?

http://jsfiddle.net/zTv5y/2/

 

 

 

.block-clearfix {    border: 1px solid red;}.table-clearfix {     border: 1px solid red;} 

Если добавить это, то получается так

http://jsfiddle.net/Alexey_swn/zTv5y/6/

 

Почему?

Edited by ALEEX SWN
Link to comment
Share on other sites

  • 0

Потому что через border и padding margin-ы тоже не схлопываются. Поэтому если у контейнера есть что-то из-них, то margin-ы его детей поневоле останутся внутри. А вот без них — могут вывалиться (как в моем первом примере).

 

С недавних пор для предотвращения выпадения margin-ов я повадился использовать border: transparent solid .1px. Визуально 1/10 пикселя во всех браузерах при любом разумном масштабе округляется до нуля и не отображается, но с точки зрения алгоритма ненулевой border присутствует и с задачей «запереть margin-ы потомков внутри» вполне справляется.

Edited by SelenIT
  • Like 1
Link to comment
Share on other sites

  • 0

Потому что через border и padding margin-ы тоже не схлопываются. Поэтому если у контейнера есть что-то из-них, то margin-ы его детей поневоле останутся внутри. А вот без них — могут вывалиться (как в моем первом примере).

 

С недавних пор для предотвращения выпадения margin-ов я повадился использовать border: transparent solid .1px. Визуально 1/10 пикселя во всех браузерах при любом разумном масштабе округляется до нуля и не отображается, но с точки зрения алгоритма ненулевой border присутствует и с задачей «запереть margin-ы потомков внутри» вполне справляется.

Спасибо за разъяснения)

Link to comment
Share on other sites

  • 0

Честно говоря, не вспомню. Помню вековой баг с дробными процентами, но то седая история. Сейчас вот нагуглил, что в 10-м г. дробные пиксели рисовались в тогдашнем Фоксе (может, на Маке?), надо будет перетестировать…

Link to comment
Share on other sites

  • 0

Мда, позор моей невнимательности (и спасибо Зверушке-ушки-на-макушке:)). Firefox всё-таки рисует дробные пиксели как один пиксель. Видимо, в том моем случае это компенсировалось чем-то другим фоксоспецифичным. Эх, жалко, я-то думал, что универсальный метод открыл...

Link to comment
Share on other sites

  • 0

Увы... А с переходом странной границы в 1/120 пикселя начинает отображаться как однопиксельная (в Fx).

 

Зато, кажется, работает padding размером чуть больше той же 1/120px. Может, это — универсальное решение?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy