Решил немного систематизировать поиск различных решений (ошибок) в вёрстке в дивах (div). Без этого такая работа превращается в метод научного тыка, что отнимает уйму времени.
Что бы понять суть, а не пытаться всё запомнить, начну с того, что имеется из браузеров для просмотра сайта. По отношению к вёрстке в дивах браузеры делятся на IE и остальные. Здесь и далее пишу не ради дискуссии о том, кому какие браузеры нравятся, а с точке зрения работы браузера с дивными блоками.
Браузера НЕ IE, появились и предназначались для быстрой обработки таблиц, на которых верстались сайты. Браузер IE так и не смог освоить табличную верстку и загружал сайты много медленнее, обсчитывая каждую таблицу.
Ныне вёрстка в таблицах уходит в прошлое с появлением таблиц стилей (CSS), а браузеры сделанные под таблицы остались. Эти браузеры ведут себя в дивной вёрстке так же как с таблицами.
Браузер IE так же не изменил своим "привычкам" и продолжает в дивах обсчитывать вёрстку, что намного привлекательнее, поскольку дивный блок в отличии от таблицы не будет работать без стилей из таблицы стилей, а в IE будет работать.
Таким образом, для НЕ IE в обязательном порядке необходимо применение таблиц стилей и что ещё более отягощает верстальщика, с помощью таблиц стилей требуется эмулировать таблицу, иначе указанные браузеры работать не будут. В тоже время для браузера IE верстка под табличные браузеры содержит много излишнего кода, который может исказить отображение сайта в этом браузере до такой степени, что станет невозможным просматривать сайт.
Собственно, вот то основное, что по моему надо помнить при вёрстке в дивах или редактировании дивной вёрстки. Для закрепления выше написанного приведу несколько примеров вёрстки в дивах.
HTML Code:
<div>
содержимое блока
</div>
Это самый простой код дивного блока. Но он будет по разному отображаться в браузерах. В IE блок автоматически растянется на всю ширину страницы, а содержимое блока получит отступы по вертикали. В остальных браузерах блок "повиснет" на содержимом. В последнем случае, что бы блок растянулся по горизонтали следует указать размер ширины блока. Если на всю ширину страницы, то значение width (ширина) будет равно 100% - всё как в табличной вёрстке.
Код блока с размером по ширине во всю страницу будет следующим
HTML Code:
<div style="width:100%;">
содержимое блока
</div>
Но для IE код избыточен, в результате в браузере может появится горизонтальная прокрутка, а часть страницы справа может вовсе исчезнуть. Что бы вернуть IE в работоспособное состояние применяют хаки. То есть, продолжим "принуждать" IE к работе с приёмами табличной вёрстки и, хотя, таблиц уж нет в вёрстке, но есть теперь браузеры работающие с этой вёрсткой.
В случае с шириной браузера во всю страницу код дивного блока для всех браузеров будет выглядеть так.
HTML Code:
<div <if condition="!is_browser(ie)">style="width:100%;"</if>>
содержимое блока
</div>
На человеческом языке означает, что если браузер НЕ IE, то добавляется стиль, указывающий ширину блока. По функции последний код дивного блока аналогичен самому первому. Но в первом варианте браузер IE автоматически растягивал блок по ширине, а другие нет. Так в каком варианте поведение браузера будет правильнее? Правильнее будет тот вариант, который чаще применяется в вёрстке - это растянутый блок по ширине страницы или родительского блока.
Если же потребуется обтянуть блоком его содержимое, то в браузере IE следует отключить отступы, которые он создаёт автоматически в блоке. Код дивного блока будет следующим.
HTML Code:
<div style="overflow:hidden;">
содержимое блока
</div>
Этот код будет работать во всех браузерах.
Выше я разобрал наиболее распространённый вариант вёрстки, который подвергается редактированию. Но, к сожалению, в таком виде, с одним только стилем по ширине, вёрстка блока встречается реже. В основном в блоке применяются сразу несколько стилей. В тоже время, блок, в отличие от таблиц не имеет видимых границ, а сами блоки, в отличии от ячеек таблиц, располагаются на странице в произвольной последовательности. Указанные обстоятельства сильно затрудняют редактирование вёрстки в дивах. Даже опытный верстальщик может часы, а то и дни, проводить в поиске причины, по которой блок не хочет вести себя так, как написано в его HTML коде.
Решение этой проблемы простое – блок необходимо вооружить видимыми границами. Изначально это потребует изменение HTML кода блока, то есть траты на это действие времени, при кажущейся простоте редактирования блока. Ну это сами решите, какова будет последовательность действий.
Ниже напишу о том, как сделать границы блока видимыми.
Для этого в стиль блока (или к имеющемуся стилю блока) необходимо добавить свойства бордера. Border позволяет одновременно установить толщину, стиль и цвет границы вокруг блока.
HTML Code:
<div style="border:1px solid black;">
содержимое блока
</div>
В приведённом примере границы блока обозначены линией толщиной в 1 пиксель, чёрного цвета. Толщину линии и цвет линии можно изменять.
Напишу HTML код из нескольких блоков
HTML Code:
<div id=”1” style="border:1px solid #000000;">
<div id=”2” style="border:1px solid #FF0000;">
<div id=”3” style="border:1px solid #0000FF;">
содержимое блока
</div>
</div>
</div>
Получилось три блока, встроенных один в другой с номерами id от 1 до трёх. Если посмотреть на блоки через браузер, то увидите три рамки, чёрную снаружи красную посередине и синим цветом внутри. При этом в браузере IE рамки будут растянуты по ширине окна браузера. Следующим шагом выравниваем содержимое внутреннего блока по центру окна по горизонтали.
HTML Code:
<div id=”1” style="border:1px solid #000000;">
<div id=”2” style="border:1px solid #FF0000;">
<div id=”3” style="border:1px solid #0000FF;text-align:center">
содержимое блока
</div>
</div>
</div>
В браузере IE выравнивание произошло, в остальных нет. Следуя моим инструкциям в начале темы вы поставите внутреннему блоку размер ширины в 100% и ни какого результата не получите, содержимое блока останется на месте. Если бы границы блоков не были раскрашены, то причина этого была бы неясна. Правильнее сказать, виноват был бы Лунтик, поскольку его код не работает.
НО тот кто не поленился и предварительно раскрасил границы блока видит, что внутренний блок обжимают снаружи два блока, поэтому содержимое внутреннего блока, хотя и центрируется, но остаётся на месте. Исправляем ситуацию тем, что внешним блокам присваиваем свойства ширины со значением 100%
HTML Code:
<div id=”1” style="border:1px solid #000000;width:100%;">
<div id=”2” style="border:1px solid #FF0000;width:100%;">
<div id=”3” style="border:1px solid #0000FF;text-align:center;width:100%;">
содержимое блока
</div>
</div>
</div>
После того, как получите результат, свойства бордера нужно удалить из стилей блоков и границы блоков вновь станут невидимыми.