Позиционирование. Сранительная харакетиристика различных схем позиционирования в наиболее популярных броузерах
Для начала немного о том для чего эта статья. Когда появилась седьмая Opera я стал замечать, что некоторые вещи, которые выглядели как и положено в шестой Opera, имеют совершенно непотребный вид в седьмой. Это коснулось и одного тестового примера, который я естественно решил переделать. Но это оказалось довольно сложной задачей, т.к. надо было подогнать пример под шесть броузеров (IE 5-6, Opera 6-7, NN и Mozilla). Но мое творение постоянно где-то "разъезжалось". Было очевидно, что в разных броузерах блоки, имеющие различные типы позиционирования в пределах одного контейнера, располагаются по разному. Так и появилась эта статья, целью которой было сделать небольшой сравнительный анализ различных схем позиционирования в наиболее популярных броузерах.
Для анализа были взяты следующие броузеры:
Internet Explorer 5.0
Internet Explorer 6.0
Opera 6.0
Opera 7.0
Mozilla 1.0
Netscape 6.2
Создадим три блока test1, test2, test3 и поместим их внутрь блока ext:
#ext{ border: 2px solid #000; margin: 20px; width: 80%; padding: 10px; background-color:#ccc} #test1{ border: 1px solid #000; margin: 10px; text-align: center; width: 30%; background-color:#6f9} #test2{ border: 1px solid #000; margin: 10px; text-align: center; width: 30%; background-color:#ff6} #test3{ border: 1px solid #000; margin: 10px; text-align: center; width: 30%; background-color:#f96} ... <div id=ext> <div id=test1>Это первый блок</div> <div id=test2>Это второй блок</div> <div id=test3>Это третий блок</div> </div>
При таком позиционировании, расположение блоков будет таким, как показано на рис.1
Укажем для второго блока относительное позиционирование (position: relative), т.е. сдвинем его вправо относительно нормального положения на 10% (left:10%) и вниз на 20% (top:20%) (рис.2).
Картина будет такая же и в том случае, если мы таким же образом позиционируем третий блок (рис. 3)
Теперь укажем для третьего блока абсолютное позиционирование (position: absolute), но координаты указывать не будем (рис. 4).
Если же для блока указать координаты размещения, то они должны определяться от границ документа. Укажем для второго блока left: 10px; top: 10px; (т.е. верхний левый угол второго блока должен совпасть с верхней и левой границей внешнего блока) (рис. 5).
Рассмотрим ситуацию с абсолютным позиционирование третьего блока без указания координат (рис. 6). В данном случае возникает следующий вопрос - будет ли третий блок находиться внутри внешнего? По идее не должен.
Теперь перейдем к плавающей модели. Если мы для первого блока укажем float: left, то два других блока должны как бы "обтекать" его справа. Как это выглядит показано на рис. 7
Если установить плавающую модель позиционирования для второго блока (float: left) - рис.8 ...
... и, наконец, для третьего блока (float: left) - рис.9.
Попробуем расположить первый блок слева, а второй - справа (рис. 10). эта схема в общем подтверждает сделанные ранее выводы.
Положение блоков, котрое мы получили на рис. 9, возможно и в том случае, если первым и второй блок расположить слева, а третий - справа (рис. 11).
Ну, и на последок давайте пофантазируем. Расположим первый блок слева, третий - справа, а второй - абсолютно (рис. 12). Очень интересный результат.
А теперь то же самое, только третий блок расположим слева (рис. 13)
Итак, определенные выводы Вы можете сделать сами. Необходимо учитывать, что в большинстве случаев размеры блоков лучше указывать в абсолютных величинах. Не следует использовать сложных схем позиционирования, но если избежать этого нельзя, воспользуйтесь подходом, который изложен в статье Проблемы CSS: колонки одинаковой высоты .
Для того, чтобы правильно позиционировать блоки, в первую очередь необходимо знать теорию, т.е. как это должно быть. Для этого следует ознакомиться со спецификацией CSS 2 . На самом деле очень интересное стиво.
Ну и на последок хочется отметить Oper'у. Последнюю. Порадовала.