CSS Bugs. Ошибки, возникающие при верстке

CSS*

1. Удвоение полей у плавающих (float) блоках в IE 5-6


Проблема: мы очень часто используем поля (margin) и не реже их применяем к блокам со свойством float, ожидая нужный результат, можно сильно удивиться, когда IE вдруг сдвинет наш блок на большее расстояние, чем предполагалось. Конкретно: ошибка левого поля (margin-left) – при свойстве float c параметром left, ошибка правого поля (margin-right) – при свойстве float c параметром right.

#FloatBlock
{
background-color:#ccc;
width:200px;
height:100px;
float:left;
margin-left:50px;
}


Ожидаемый результат (корректный):
Ожидаемый результат

Какой же результат мы видим в IE (некорректный):

результат в IE

Решение: все просто, необходимо добавить строчку display:inline, т.е. объявить блок как строчный.
#FloatBlock
{
background-color:#ccc;
width:200px;
height:100px;
float:left;
margin-left:50px;
display:inline;
}


2. Проблема с плавающими (float) блоками.


Проблема: Блок, содержащий плавающий блок не принимает необходимую высоту, для того чтобы вместить его, высота остается такой, как будто плавающего блока нет. И это вовсе не ошибка, т.к. при применении свойства float блок изымается из нормального потока.
<div id="Container">
<div id="FloatBlock">FLOAT</div>
Контейнер содержащий блок, к которому применено свойство float
</div>

#Container
{
border:red solid 1px;
}
#FloatBlock
{
width:100px;
height:100px;
border:#000 solid 1px;
float:right;
}

Ожидаемый результат:
Ожидаемый результат

В итоге:
В итоге

Решение:
1. Использование дополнительного блока со свойством clear
<div id="Container">
<div id="FloatBlock">FLOAT</div>
Контейнер содержащий блок, к которому применено свойство float
<div class="clear"></div>
</div>

#Container
{
border:red solid 1px;
}
#FloatBlock
{
width:100px;
height:100px;
border:#000 solid 1px;
float:right;
}
.clear
{
clear:both;
}


2. Использование overflow:hidden
#Container
{
border:red solid 1px;
width:100%;
overflow:hidden;
}

3. Использование float:left
#Container
{
border:red solid 1px;
float:left;
}

Сразу все глюки не припомнить. Данный список предлагаю продолжить…
+4
7 июня 2007, 16:30
28
Mailo 0,1

комментарии (43)

0
Kuzma #
используйте , пожалуйста
0
Kuzma #
habracut
0
butuzov #
несколько флоат блоков, первый из которых непонятным образом растягивается по высоте..
0
Mailo #
подробнее, пожалуйста
0
butuzov #
если будет время вечером выложу тестовый кодинг чтоб заценили...
а сейчас увы времени мало.
0
nuclon #
2. Использование overflow:hidden (не работает в IE5-6)

кажется, все таки работает, если при этом еще задать явно width,
width: 100%;
0
Mailo #
Да, действительно. Интересно, а в чем логика...
0
shergin #
float:left; + display:inline; — вообще ересь и мракобесие...
0
Mailo #
Этот метод я использую всегда и считаю его лучшим.
НЛО прилетело и опубликовало эту надпись здесь
0
Mailo #
Видимо вы не понимаете о чем вообще идет речь. Float - одно из самых необходимых свойств используемых при верстке.
0
shergin #
Да это все ясно!..
Дело совсем в другом.
По стандарту float: left; форсируется в display: block;! Поэтому такое совмещение этих свойств по меньшей мере малологично.
0
Mailo #
Понимаю, дикое сочетание, но это лекарство от ошибки IE, и ничего тут не поделаешь.
0
flamefork #
zoom: 1;
не помогает?
0
shergin #
zoom - не W3C.
0
flamefork #
Ну и что? В IE6 это решает 80% всех ошибок, в IE7 - 40%.. Ну цифры эмпирические-примерные, но все же..
0
Mailo #
Расскажите поподробнее, каких именно ошибок? И я попробую рассказать, как их решить без zoom
0
flamefork #
Решать их без zoom не нужно, так как он исправляет конкретные ошибки конкретных браузеров.
Читайте:
http://www.satzansatz.de/cssd/onhavingla…
0
Mailo #
не помогает, да и свойства такого нет в CSS.
0
flamefork #
Читайте:
http://www.satzansatz.de/cssd/onhavingla…
очень полезная статья
0
pho3nix #
В ИЕ мало чего логичного ;)
Довольно часто приходится использовать конструкции типа * html или _property.
Так же проблему с маргином решал через:

{
float:left;
margin-left:40px; // Normal
_margin-left:20px; // IE ;)
}

Попробуем с инлайном. Поставил бы плюс, если бы мог ;)
0
Mailo #
Тоже решение. Но а если margin-left:37px ;)
0
pho3nix #
Угу, это основная математическая проблема =)
Вообще - спасибо за http://www.positioniseverything.net/, очень полезная штука.
0
CurlyBrace #
Я не думаю что это подходящий заголовок для статьи. Да и на статью не совсем тянет, если честно.

Это не ошибки, а CSS-верстка, которой посвящены целые сайты и книги, а вы хотите двумя абзацами и добавлением комментариев покрыть тему.
0
Mailo #
Удвоение полей в IE - это конкретная ошибка. А статью я хочу развить, и думаю комментарии должны в этом помочь.
0
CurlyBrace #
Тогда переносите в Каскадные Таблицы Стилей
0
Mailo #
Я тут первый день, подскажите как :)
0
CurlyBrace #
Присоединитесь к блогу CSS, нажав на шнур рядом с названием, вернитесь в свою тему, нажмите на ключик в заголовке и в подменюшке "куда запостить" выберите CSS. Затем нажмите на "Опубликовать" ;)
0
never_again #
а там нет ни одной темы или я просто не могу их увидеть?

тоже недавно и пока не очень разбираюсь(
0
CurlyBrace #
Я только создал :) Будут темы
0
Mailo #
там нет ни одной темы :(
0
CurlyBrace #
Это временно ;)
0
never_again #
проблема1 - почемуто никогда не сталкивался,всеравно спасибо!

проблема2 - знаю еще одно решение
0
never_again #
сама ссылка - http://www.positioniseverything.net/easy…

чет неполучилось вставить
0
jahson #
Этот сайт стоит знать:
http://www.positioniseverything.net/expl…
0
Mailo #
Тоже, что и у меня в статье только по анг. :)
0
Zigzag #
спасибо, но мало. у меня есть более подробная статья. скоро выложу.
0
basic #
Вторая проблема решается
1. Ка выше писали overflow: hidden; + width
2. Заданию родительскому блоку float

Ваш способ сомнительный тем что приходиться из блочного элемента div делать строчный что действительно идет в разрез с идеологией блочных элементов, так что поддерживаю про ересь.
0
anaheim2by #
есть еще один способ - использовать CSS-хаки

пишем сначала свойство для IE,
а затем, сразу же за ним, свойство для Firefox'a, поставив перед ним (свойством) код html>body
0
anaheim2by #
Это на случай того, когда под разными браузерами расположение элементов на странице отличны
0
zealous #
есть нелогичность по поводу совместного использования двух свойств???
float:left; и display:inline;

так использовать можно и display: inline-block; - вроде логично, и проблему решает...
0
zealous #
упс... не про то написал... в данном случае display: inline-block; проблемы не решает...

сори... задумался... о своем... текущем...
0
PRSO #
Спасибо! помогла мне очень ваша статья

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