p>
... p>
p>
p>
p>
p>
This is the top navigation bar. P>
p>
This is the advertisement bar. P>
p>
p>
p>
p>
p>
The code you are reading. P>
p>
p>
p>
p>
p>
p>
... p>
"Рада
дня " p>
Тепер
у нас є три блоки, куди ми можемо помістити будь-який вміст, основна
область, верхній навігаційний блок і рекламний блок. Кожен з цих елементів
бере висоту вмісту, але ширина у них фіксована. Давайте тепер
створимо блок, що містить "Порада дня". Зробимо його плаваючим, щоб
вміст центральній області його огинав. Вклав у "main" шар "tipDay", і задамо для нього
переміщення вправо. Також зазначимо для нього деяку ширину (для плаваючих
елементів ширина обов'язково повинна бути задана). Погляньте. P>
# tipDay ( p>
float: right; p>
width: 175px; p>
background: # FFF3AC; p>
) p>
Що
Тепер
давайте вирішимо, як саме ми будемо заповнювати блоки вмістом. Самим
природним рішенням було б використовувати властивість float, але через проблеми з відображенням
плаваючих блоків в Opera і IE нам доведеться використовувати
абсолютне позиціонування. Помилки в IE невеликі, і ними можна було б знехтувати, але, на жаль, з
проблемами в Opera нам
впоратися не вдалося. За цим посиланням розташовані опису виниклих помилок:
одна помилка в Opera, інша помилка в
Opera, помилка в IE. P>
Заповнюємо бічні блоки p>
Почнемо з лівого навігаційного блоку --
додамо до нього шар "lftBar". Так як ми вирішили
використовувати абсолютне позиціонування, то у нас тепер є відносна
свобода у виборі місця для коду, що визначає шар. Його можна поставити всередину
"level0", до або після "level1"
або навіть на один рівень вкладеності із шаром "level0"
- Вони не впливатимуть на його відображення - якщо, звичайно, ми виберемо правильні
координати. p>
Ми спробували вкласти "lftBar"
в "level0", вказавши для "lftBar"
нульові координати top і left,
а для "level0" - відносний
позиціонування (position: relative),
але в IE5.5 шари чомусь перекривалися. Тому
ми вирішили встановити для "lftBar" абсолютні координати
щодо тіла документа. Погляньте. А також - одна помилка в IE,
інша помилка в IE. p>
# lftBar ( p>
position: absolute; p>
width: 143px; p>
top: 9px; p>
left: 9px; p>
) p>
Для правого навігаційного блоку ми використовували
шар "rgtBar". Нам було важливо, що б його верхній край збігся з
верхнім краєм шару "main", що містить основний контент. Тому ми
вирішили вкласти "rgtBar" в "level2", до або після
"level3", встановивши для "level2" відносне
позиціонування, а для "rgtBar" - нульові координати top і left і
ширину, рівну правому краю шару "level3". Погляньте. p>
# level2 ( p>
background: # FFF3AC; p>
position: relative; p>
) p>
... p>
# rgtBar ( p>
position: absolute; p>
width: 143px; p>
top: 0; p>
right: 0; p>
) p>
Розставляємо
по місцях h2>
З нашою версією було дві проблеми в IE для Windows. Перша проблема
полягала в тому, що блок з «Радою дня» зникав, хоча вміст блоку main його справно огинав.
для шару "tipDay" відносне
позиціонування (така установка призвела до підвищення z-index і шар автоматично
розмістився поверх інших). p>
дивацтва
успадкування: " b> Auto b> "
проти " b> Inherit b> " b> p>
Другою проблемою в IE/Windows було те, що правий
навігаційний блок відсовувався максимально вправо. Для вирішення проблеми нам
довелося явно вказати ширину шару "level2" (до якого
вкладений "rgtBar"). IE не розуміє декларацію 'auto', але зате розуміє 'inherit' (хоч і досить-таки дивним чином), і це можна
використовувати для наших цілей. Ми встановили
для "level0" завширшки в 100%, а в якості
ширини для "level2" вказали 'inherit'. Фокус у тому, що в IE
"level2" успадковує значення ширини
від "level0" (100%), у той час як у
інших броузерах - відбувається спадкоємство від "level1" ( 'auto') (а вкажи ми для "level2" завширшки в 100%, то у нас виникли б проблеми з
відображенням в IE 5.5 +, який розуміє
100%, як ширину всього вікна броузера). Цю помилку CSS в IE5 ви, до речі, цілком можете
використовувати для вирішення подібних проблем - подробиці дивіться у розділі використаних
прийомів. Погляньте p>
# level0 ( p>
background: # FC0; p>
width: 100%; # - New, outermost
DIV p>
) p>
# level2 ( p>
background: # FFF3AC; p>
position: relative; p>
width: inherit; # - New,
inherits 100% from level0 in IE5 p>
# inherits auto from level1 in all others p>
) p>
# tipDay ( p>
float: right; p>
width: 175px; p>
background: # FFF3AC; p>
position: relative; # - New,
forces z-index so this div displays in IE p>
) p>
Очищаємо стиль p>
Тепер саме час провести генеральну
прибирання. Для початку позбудемося шару "level3"
і передамо всі його стильові декларації шару "main". Додамо правого блоку кордон за допомогою властивості border-right шару "main". Також зробимо два заголовки для основної області та
поставимо в правий блок кілька тестових підзаголовків. Внизу правого блоку
додамо підзаголовок "A_Long_String", щоб
продемонструвати проблеми, що виникають при використанні великих шрифтів. Цей підзаголовок не можна
розбити на кілька ліній, і він може розсунути блок, якщо перевищить його по
ширині. Погляньте. P>
# main (# Where the main content goes p>
margin-right: 143px; p>
padding-right: 9px; p>
background: # FFF; p>
) p>
# main h1 (# Where our main section headers go p>
margin: 0; p>
padding-left: .3 em; p>
font: 1.25em
Verdana, Helvetica, Arial; p>
color: # 609; p>
background: # FC0; p>
) p>
# main dt (# Bump up the main content links p>
font-weight: bold; p>
font-size: 120%; p>
margin-top: .8 em p>
) p>
# rgtBar h3 (# Subheads for right nav bar, (newsletter, experts ...) p>
margin: 0; p>
padding: 3px; p>
background: # FC0; p>
font-weight: bold; p>
font-size: 1em; p>
text-align: center; p>
) p>
Розмір фіксований проти розміру
відносного p>
Щоб запобігти перевищення довгим
підзаголовком ширини блоку, ми змінимо деякі декларації для "rgtBar" і "main", переписав їх у
відносних одиницях ( "em"). Колись ми ставили
ширину в 143 px. Це становить приблизно 9em, якщо розмір шрифту у броузері дорівнює стандартним дванадцяти
пунктам (дванадцять пунктів - ето16px). Тому ми ставимо для
"rgtBar" і "main" поля і ширину не в 143px, а в
9em. Тепер, завдяки відносним
одиницям, правий блок буде змінювати свою ширину пропорційно встановленому
користувачем розміру шрифту. Погляньте. P>
# main ( p>
margin-right: 9em; # - Use
variable widths rather than fixed, they are p>
more
user-friendly. This also applies to font sizes. P>
padding-right: 9px; p>
background: # FFF;) p>
... p>
# rgtBar ( p>
position: absolute; p>
width: 9em; # - likewise p>
top: 0; p>
right: 0; p>
) p>
Описана методика вирішує більшість проблем
з перевищенням розміру вмісту над розміром містить блоку. Для блоку
"Совет дня" ми теж поставили ширину у відносних одиницях, але для
лівого блоку все ж таки вирішили зупинитися на абсолютних одиницях, так як його
вміст не могло зруйнувати верстку. p>
Плаваюча
форма пошуку h2>
Тепер розмістимо форму пошуку та текстові
посилання у верхньому навігаційному блоці. Форму ми визначимо як першого нащадка
"topBar" і вкажемо їй переміщення
вправо. Ми вже з'ясували, що для плаваючих елементів слід явно задавати
ширину, і наша форма не є винятком.
Визначимо їй ширину 10.5em - завдяки відносним
одиницям елементи форми будуть пропорційно змінювати розмір в залежності від
розмір шрифту у броузері користувача. Також ми задамо для форми вирівнювання
до правого краю (text-align: right), тому що сама форма
трохи ширше, ніж її елементи. Але ми, очевидно, ще не закінчили - погляньте, і ви
зрозумієте, яку проблему нам належить вирішити. p>
# topBar form ( p>
float: right; p>
width: 10.5em; p>
text-align: right; p>
) p>
Нам потрібно встановити в нуль всі поля форми
пошуку, щоб максимально зменшити її розмір по вертикалі. Для Netscape ми визначимо висоту рядка в 0.7 em, тоді кнопка "Search" по висоті
зрівняється з полем вводу (на відображення в IE і Opera ця директива ніяк не вплине). Рухаємося далі. Форма
частково накладається на рекламний блок. Цього ми дозволити не можемо, тому що в ньому прямо під формою буде
розташовуватися текстове посилання, тому визначимо для "advBar" властивість clear. Наприкінці, встановимо
для "topBar" завширшки в 100%, щоб
уникнути помилки в IE і зазначимо для поля введення
розмір шрифту в .8 em, щоб його розмір
змінювався відповідно до розміру шрифту в браузері. Погляньте. P>
# advBar ( p>
background: # FFF3AC; p>
clear: right; # - New, clear
the search form p>
) p>
... p>
# topBar form (# The search form p>
float: right; p>
width: 10.5em; p>
text-align: right; p>
margin: 0; p>
line-height: .7 em; # - Crucial! p>
) p>
# topBar input ( p>
font-size: .8 em; p>
) p>
Додаємо
текстові посилання h2>
Помістимо текстові посилання на належне їм
місце. Ці п'ять посилань розділені Буллітом й ув'язнили в тег , тому саме цей тег повинен стати другим нащадком блоку
"topBar". В IE 5.0 для Windows ми виявили
дивний ефект, через який посилання вирівнювалися до правого краю. Вирішити цю
проблему можна було небудь уклавши посилання в шар з вирівнюванням наліво, або
зробивши блоковим елементом, вказавши для нього
необхідне вирівнювання. Ми віддали перевагу другому спосіб. Також ми вказали стиль
для шрифту і необхідну висоту рядка, щоб посилання були вирівняні по
вертикалі. Погляньте. P>
# topBar b (# Top nav bar text links (sitemap, experts ...) p>
display: block; p>
text-align: left; p>
font: bold .8em/1.7em
Arial, Geneva, sans-serif; p>
) p>
Додаємо
вміст і заголовок для "Ради дня" h2>
На цьому етапі ми замінимо тестові заголовки
типу "Це заголовок 1" і "Це заголовок 2" на реальні
заголовки сайту WebReference - "WebReference.com: Dev the Web ™" і "internet.com" відповідно. Ще
ми додамо заголовок для блоку "Совет дня", причому розташовуватися він буде
в тому ж блоці, що і заголовок "WebReference.com: Dev the Web ™".
Для цього нам знадобиться новий шар, назвемо його "tipTit", який буде першим нащадком шару "main". Зазначимо для нього переміщення та вирівнювання до правого
краю, ширину, стиль шрифту та висоту рядка для вертикального вирівнювання.
Ширину визначимо в 7em (таку ж, як і у блоку
"tipDay"). Щоб уникнути проблем в IE, які описані вище, позиціонування його зробимо
відносним. Погляньте. P>
# tipTit ( p>
float: right; p>
width: 7em; p>
text-align: right; p>
position: relative; p>
font: .8em/1.8em
Arial, Geneva, sans-serif; p>
background: red; p>
) p>
. note ( p>
color: red p>
) p>
Справу зроблено! Ми успішно відтворили
основну сторінку WebReference.com без єдиної таблиці. Нам залишилося тільки додати банер на
його законне місце. Погляньте. Примітка: фінальний варіант розмітки ще не
тестувався в IE6, але ми обов'язково це
зробимо в самому найближчому майбутньому. (прим. перекладача: в IE6 сторінка відображається цілком коректно) p>
# advBar p (text-align: right; margin: 0 0.5em; font-weight: bold;) p>
# advBar img (margin-bottom: 1em) p>
Подальші
плани h2>
Сподіваємося, що з цієї статті ви набули
деякі ідеї щодо використання CSS для створення
багатоколоночних верстки. Для подальшого поліпшення дизайну ми можемо додати
ліву колонку додаткові інформаційні або рекламні блоки. Для верхнього
блоку ([sitemap | experts
.... search]) і центрального заголовка (WebReference: Dev the Web ....
Tip of the Day]) ми можемо застосувати методику, описану в A List Apart (хоча напевно виникнуть проблеми з позиціонуванням
форми пошуку). Зрозуміло, будь-які зміни ми будемо тестувати в усіх
основних броузерах. p>
Нижче коротко сказано про те, чого ми навчилися
в процесі розробки нового дизайну. p>
Основні
прийоми b> CSS b> p>
Зберігайте гнучкість p>
По можливості використовуйте відносні
величини (em або% для шрифтів, em для шарів) p>
Вкладайте шари один в одного p>
Ця техніка допомагає вирішити проблему з
варіаціями реалізації блочної моделі в різних броузерах. У IE5 поля, межі та відступи в одному блоці не дуже-то добре
уживаються один з одним. Обов'язково відокремлюйте декларації полів і кордонів від
декларацій ширини. У невірної блокової моделі, реалізованої в IE5/Windows, поля і кордони не
додаються до загальної ширині блоку, тоді як W3C з повною визначеністю говорить про те, що ширина блоку
складається з ширини його вмісту плюс ширина полів і кордонів. Зауважимо, що
IE5/Mac і
броузери Gecko коректно відображають блокову
модель. Тому якщо вам необхідно задати ширину шару, який містить поля або
кордону, розділіть його на два, один з яких буде вкладений в інший. p>
Не використовуйте "nowrap" для шарів p>
У Netscape і Opera можуть виникнути проблеми при великих розмірах шрифту p>
В IE 5.x є помилка CSS, якою можна
скористатися p>
IE 5.x інтерпретує коментарі,
хоча повинен їх ігнорувати. Це можна використовувати для створення такого собі
подоби "if-then",
щоб обійти в ньому деякі помилки CSS. Ми використали цей
прийом, але потім перейшли на методику з використанням властивості inherit. В IE6 цей прийом не працює. P>
# fontChanger (font-size: .8 em;// font-size: 1em;) p>
Слідкуйте за шириною шарів і таблиць p>
Установка ширини в 100% може призвести до
тому, що ширина такого шару в IE не співпаде з шириною
шару, для якого ширина задана як auto (за замовчуванням). Крім
того, для таблиці з width = 100% IE5.5 встановить ширину рівну ширині всього екрану, а зовсім не
блоку, до якої ця таблиця вкладена. Щоб уникнути ви можете використовувати// width: 100% для зовнішнього блоку
і width: inherit
для самої таблиці. p>
# topBar (background: # FC0;// width: 100 %;} p>
# topBar form (display: inline;) p>
table.c (font: .8em/1em
Arial, Geneva, sans-serif; width: 100%;// width: inherit;) p>
В IE некоректно працює
механізм успадкування, тому таблиця успадковує ширину від найближчого з батьків,
для якого ширина вказана (в абсолютних одиницях, відносних одиницях або
значенням inherit). p>
У плаваючих блоків можуть виникати проблеми
з директивою clear p>
Особливо у форм. Щоб уникнути можна
укладати блоки в додаткові контейнери і вказувати clear для них. Хороша також методика, описана в A List Apart. P>
Не використовуйте фіксовану висоту p>
Агенти п'яте і шосте версій її просто не
підтримують, так само як і min-height. А IE 5.5 до того ж не розуміє min-width, max-width і max-height. p>
В Opera і Netscape задавайте для форм нульової відступ (margin: 0) p>
Особливо в плаваючих блоках. p>
Якщо ви хочете поставити ненульові відступи
зверху (з боків), обов'язково вказуйте висоту (ширину) для батьківського
блоку. p>
Opera розходиться з W3C у тлумаченні специфікації CSS,
тому для коректного відображення відступів вам доведеться задати висоту і
ширину не тільки для батьків, але і для нащадка. Відзначимо, що в Opera і IE 5.5 систематично
виникають помилки, якщо у батьків теж задані відступи. p>
Список
літератури h2>
Для підготовки даної роботи були
використані матеріали з сайту http://www.webmascon.com/
p>