Создано 29.08.2010
Вступление
Я не ставлю своей целью переписать в разделе имеющиеся в моем распоряжении книжки или используемые мной справочники...
Поэтому предполагается, что в дополнение к материалам на этом сайте Вы используете, как минимум, справочники по основным тегам и стилевым свойствам.
При подготовке этого материала использовалась книга:
"CSS. Профессиональное применение веб-стандартов"
Энди Бадд, Камерон Молл, Саймон Коллизон
Вильямс 2009
"HTML и XHTML. Подробное руководство."
Чак Муссиано, Билл Кеннеди
Символ 2008
А так же другие материалы.
Схема DTD
В самом начале раздела, в вводной статье, я писал - "вводим новые понятия и элементы по мере необходимости..." И вот эта необходимость настала.
Поговорим о высоком. Схема DTD (Document Type Definition - определение типа документа) представляет собой набор правил, читаемых компьютером и определяющих, что разрешено и не разрешено в конкретном документе (x)HTML. Браузеры используют эти правила при синтаксическом разборе веб-страницы, чтобы проверить, действительна ли она. Код документа должен быть не только синтаксически правильным, но и действительным (valid), т.е. соответствовать стандартам W3C
(World Wide Web Consortium). Если код недействителен, браузер попытается интерпретировать разметку самостоятельно по ему одному известным правилам (нестандартный режим). Результат может быть непредсказуемым, скорее всего плачевным...
DTD предоставляется браузеру в объявлении DOCTYPE
. Браузер выбирает режим вывода в зависимости от... В общем, нам достаточно знать следующее:
Если документ (x)HTML плохо сформирован или не содержит объявления DOCTYPE , он будет выведен в нестандартном режиме!
Объявление DOCTYPE представляет из себя 2 строки кода на языке SGML (Standard Generalized Markup Language - стандартный обобщенный язык разметки), размещенные в начале документа. Это объявление "заверяет" браузер, что Ваш документ намерен соответствовать указанному в нем стандарту. Если до этого мы начинали документ с тега html , то теперь будем начинать вот так:
Объявление DOCTYPE и тег html
...Почему раньше мы обходились без всяких объявлений? По мере продвижения вперед, код разметки усложняется и количество использемых стилевых правил увеличивается. Примеры, приведенные в последующих главах, без объявления DOCTYPE в разных браузерах могут работать не корректно. Чтобы не быть голословным, я подскажу (*) в каком примере можно увидеть различия в реализации кода, отключив объявление DOCTYPE .
Тег
Подготовка
Многие браузеры на основе своих таблиц стилей присваивают значения по умолчанию многим элементам страницы. Поэтому перед тем как писать код, рекомендуется сбросить эти значения. Для этого в папке css
создадим файл reset.css
, а в html-документе добавим на него ссылку.
Код файла reset.css
/* сброс значений по умолчанию*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
Как прописано в стандартах и скучных учебниках, тег div
(division) разбивает документ на отдельные части, разделы. Вот так вот скупо, тоска.... Видимо это писалось еще во времена тотальной табличной верстки, когда он был не очень популярен - как-то без него обходились.
А выглядит он вот так:
Контейнер div
На примере этого тега, о котором, в общем-то писать действительно нечего, кроме того, что это блочный элемент, как параграф или загловок, мы рассмотрим наиболее важные концепции CSS. При использовании его с атрибутами class
и id
, тег div
является основным строительным материалом для блочной верстки страниц в современном веб-дизайне.
Код HTML
Контейнер div
На примере... (текст)..
код CSS
/** код просто посмотрите, глубоко не вникая пока... **/
.smpl-div{
margin:10px 20px;
padding:16px;
background:#565;
color:#fff;
border:3px solid orange;
width:80%;
}
Ну еще можно добавить, что в него можно вложить все! Заголовки, параграфы, таблицы, формы, другие теги div
... вобщем все, или почти все. Дескриптор div
используется для группирования блочных элементов на основе их функционального назначения, логически связанных.
Наша задача сделать код более чистым и осмысленным, поэтому применение слишком большого количесва тегов div
в презентационных целях, признак того, что код плохо структурирован и чрезмерно усложнен.
На этом лирическое отступление заканчиваем и переходим к наверно САМОЙ СЕРЬЕЗНОЙ
главе раздела HTML&CSS
Модель контейнеров
Область содержимого
Модель контейнеров управляет размещением и выводом элементов на странице. В рамках этой модели каждый элемент страницы рассматривается, как прямоугольный контейнер, обладающий определенными параметрами. У контейнера может быть содержимое (это то, что мы в него положили) или он может быть пустым. Дальше я буду все объяснять очень подробно! Это важно
.
Эксперемент #1
Создадим 2 контейнера - один с текстом, другой пустой.
Цвет фона для них сделаем #a55.
/* Стили CSS */
.test_num1{
background-color:#a55; /* цвет фона */
}
СОДЕРЖИМОЕ. Текст.
Из полученного делаем выводы:
- Без указания каких либо параметров контейнер с содержимым имеет высоту, достаточную для вмещения содержимого, и занимает максимально возможную ширину (ширина родительского элемента)
- Пустой контейнер мы не видим вообще!!! Он просто "схлопнулся" по высоте. (в браузере IE6 - видим....)
Эксперемент #2
Явно задаем размеры контейнеров:
/* Стили CSS */
.test_num2{
background-color:#a55; /* цвет фона */
width:80px; /* ширина*/
height:60px; /* высота*/
}
СОДЕРЖИМОЕ. Текст.
Выводы:
- Пустой контейнер с явно заданными размерами выводится нормально
- Первый сюрприз. Браузер IE6 отображают контейнеры по другому, нежели все остальные... Специально задав недостаточную ширину, ожидалось, что содержимое выйдет за пределы блока. Так оно и случилось во всех браузерах, кроме IE6, который проигнорировал заданное значение width
и увеличил ширину блока до размеров содержимого. Со свойством height
то же самое, увеличивает размер контейнера по вертикали. Привыкайте.
- Обещаная подсказка (*)
: Если вы сейча отключите объявление DOCTYPE, то сможете увидеть, что все версии браузеров IE увеличивают ширину контейнера и увеличат высоту, если текста будет больше (Opera, кстати, тоже увеличит высоту)
- При необходимости, когда ширины контейнера не хватает, текст переносится на следующую строку по пробелу.
- Свойсто CSS overflow
, отвечает за способы отображения содержимого, если оно не вмещается. Что это такое - посмотрите, пожалуйста, в справочнике. Поэксперементируйте, добавляя разные значения свойства overflow
в класс test_num2
, и посмотрите, что из этого получится
Отступы и рамки
В соответствии справилами CSS, свойства width
и height
устанавливают размер не контейнера, а области содержимого. По сути, мы имее дело с ЧЕТЫРЬМЯ(!) контейнерами, где содержимое является так называемым "ядром" (core content area) и помещается еще в 3 контейнера. Каждый из них имеет параметр, соответствующий значению одноименного свойства CSS (ни одно из этих свойств не является обязательным). В разных источниках используются разные термины для описания этих свойств. Схематически модель контейнеров можно представить так.
margin: 20px
border: 10px
padding: 30px
padding
- внутренний отступ, или внутренняя полоска, или подложка. Обрамляет содержимое, отделяя его от границ контейнера. Заливается цветом фона вместе с содержимым.
border
- рамка. Имеет цвет, толщину и стиль используемых линий. Чаще используются в декоративных целях.
margin
- внешний отступ, или внешняя полоска, или поле. Прозрачная полоска за пределами рамки. Используется для задания промежутков между элементами страницы.
Добавление padding
, border
и margin
не изменяет размеры области содержимого, но изменяет общий размер контейнера.
Вычисляем ширину контейнера:
width + 2 *(padding + border + margin) = 40+2*(30+10+20) = 160px
Высота вычисляется аналогично (height
вместо width
) и, в нашем случае, равна ширине.
А теперь простыми словами и более подробно
Свойства padding и border
Внутренний отступ нужен для того, чтобы содержимое не прижималось к внутренней границе контейнера. В качестве содержимого может быть параграф (текст), рисунок или любой другой элемент.
Рассмотрим пример:
Создаем контейнер div
с заданой шириной, внутренним отступом и рамкой. В качестве содержимого вставляем параграф, тоже с рамкой и внутренним отступом. Применяем фон к параграфу, отличный от фона контейнера div
, чтобы визуально видеть внутреннюю полоску.
/* класс для контейнера
div
*/
div.smplBox{
width:520px ;
border: 4px solid #565; /* для содержащегося в классе параграфа
p
*/
div.smplBox p{
padding: 4px 8px; /* подложка – сверху/снизу-справа/слева */
border: 7px solid #565; /* рамка */
background: #f8f278; /* цвет фона */
}
Вычисляем общую …
Вычисляем общую ширину контейнера на основании имеющихся занчений свойств.
Так как высота не задана явно, она будет увеличиваться по мере заполнения контейнера содержимым.
Общая ширина контейнера = ширина содержимого +
отступ справа +отступ слева + толщина рамки*2
Размеры для параграфа можно во внимание не принимать, т.к. ширина его содержимого не задана явно. Следовательно, его размеры зададутся автоматически, чтобы вместить содержимое в отведенное для него пространство. Они не окажут влияния на общую ширину содержащего контейнера.
520+10+30+4*2 = 568px
Создаем еще один контейнер без внутренних отступов, чтобы он соответствовал по ширине первому. При этом для него тоже создаем рамку.
Так как внутренних отступов нет,
Общая ширина контейнера = ширина содержимого + толщина рамки*2
Width= 568- 1*2 = 566px
Где 568 – ширина первого контейнера, а 1 – толщина рамки нашего контейнера.
/* используем тот же класс
?!
… */
div.smplBox{
width:520px ; /* ширина области содержимого*/
padding: 5px 10px 20px 30px; /* подложка: сверху-справа-снизу-слева */
border: 4px solid #565; /* рамка – толщина сплошная цвет */
background: #ddd; /* цвет фона*/
}
/* переопределяющий класс для второго контейнера */
div.smplBox-reset{
width:566px ; /* ширина области содержимого (568-2) с запасом для рамки*/
padding: 0; /* подложка: обнуляем */
border-width: 1px; /* толщина рамки – переопределяем толщину */
}
/* обнуляем свойства для параграфа
p
*/
div.smplBox-reset p{
padding: 0;
border: 0;
}
Вычисляем общую …
Повидимому, здесь необходимо сделать некоторые пояснения:
Значения некоторых свойств для 1-го и 2-го контейнеров совпадают, например цвет фона, стиль и цвет рамки. Поэтому мы можем воспользоваться этим классом, а потом ПЕРЕОПРЕДЕЛИТЬ (!) несовпадающие свойства. Этот прием достаточно часто используется веб-дизайнерами.
Фишка в том - как мы его переопределили. Оказывается, к одному селектору можно применять несколько классов, указывая их для атрибута class
через пробел! Причем, если в этих классах есть одинаковые свойства, то последнее переопределяет предыдущие. Соответственно, для контекстного селектора p
действуют те же правила.
И еще, мы не стали переопределять полностью свойство border
, а сделали это только для значения толщины рамки, использовав для этого свойство border-width
.
Свойство margin
Как уже говорилось, свойство margin
позволяет задать поля вокруг элемента, которые обеспечивают отступ от соседних элементов и границ родительского блока.
Создадим 2 блока одинакового размера, расположенных друг над другом и зададим им разные значения полей:
margin: 30px 20px;
Поля первого блока:
верхнее, нижнее - 30px
правое, левое - 20px
Ширина и высота блока, а так же рамка в данном примере значения не имеют.
Второй блок окружен полями - 50px;
Все достаточно просто, визуально разница в отступе от левого края хорошо заметна. Интерес представляет расстояние между блоками...
Логично было бы предположить, что расстояние между блоками, нижнее поле одного из которых равно 30px, а верхнее поле другого 50px, будет равно сумме этих полей, т.е. 80px. Но это не так. Смежные вертикальные полоски сливаются, принимая ширину большей из них. В нашем случае зазор между блоками будет 50px. Это очень полезное правило, позволяющее убирать не нужные вертикальные зазоры между абзацами, например. По горизонтали поля не сливаются.
Сейчас мы более подробно остановимся на этом очень важном для понимания моменте - слияние внешних полосок.
Html-код со встроенными стилями
Cлияние смежных вертикальных полей родительского и
дочернего элементов.
Cлияние смежных вертикальных полей родительского и дочернего элементов.
Из вышепреведенного примера видно, что нижнее поле блока div
, равное 15px, и верхнее поле блока p
- 20px, "схлопнулись" и дали результирующее поле размером 20px. При этом горизонтальные поля остались на месте. (в браузере IE6 - нет...)
А теперь, если родительскому блоку div
добавить рамку border:1px solid #111
, или внутренний отступ padding:5px
, верхнее и нижнее поля вернутся на место! (проверьте самостоятельно)
Вывод:
Слияние смежных вертикальных полей дочернего и родительского блоков просисходит, если у родителя нет рамки или внутреннего отступа (т.е. ничто не разделяет их внешние поля). Как видите, рамка иногда имеет не только декоративное значение
.
Так же сливаются верхние и нижние вертикальные поля пустого элемента, а если пустых элементов несколько и они расположены друг над другом, то все их верикальные внешние полоски сольются в одну!
margin: 0px 20px;
Для свойства margin
можно задавать ОТРИЦАТЕЛЬНЫЕ значения. Их можно использовать для наслоения элементов друг на друга. Для второго блока мы задали поля 50px, а потом переопределили значение для верхнего поля
-30px;
. Еще отрицательные значения иногда используют для сокрытия элемента. Задав достаточно большой отрицательный отступ, например -2000px, мы смещаем элемент за пределы страницы, т.е. делаем его невидимым. Попробуйте самостоятельно.
Не увлекайтесь переопледелением свойств, можно запутаться. В этой главе я часто переопределял их чисто в показательных целях.
Если не хотите, чтобы поля "схлопывались" - задавайте рамки, совпадающие по цвету с фоном, при этом не забывая, что увеличиваете размер блока на удвоенную ширину рамки. Есть еще способы, но о них позже.
Старайтесь не задавать без необходимости свойство padding
элементам с явно указанными размерами. Лучше применить его к родительскому или дочернему блоку
Установите, пожалуйста, на свой компьютер второй браузер (Opera, Mozilla, Safari, GoogleChrome,IE6-8). Один из них должен быть IE!
О кроссбраузерности мы будем говорить позже, а пока хотя бы фиксируйте для себя различия в поведении браузеров. По этой ссылке вы можете скачать IETester
Блохи и грабли
- Грабли, говорите.... Да они пофсюду!!!
- Если что-то не идет, хотя должно
по идее... - внимательно проверьте, а еще лучше просто скопируйте по-новой объявление DOCTYPE
- К сожалению браузеры IE5 и IE6 считают размеры контейнера по своему. Они считают свойство width
равным сумме области содержимого и отступов, как внеш. так и внутренних.
- Наибольшее количество проблем возникает в браузерах Internet Explorer, для которых иногда приходится писать параллельный код CSS. Уже скоро:)
Плавающие элементы. Свойство FLOAT
Создано 28.08.2010
Понимание этой, достаточно не простой концепции, поможет нам …. в общем, если вы хотите чтобы элементы на странице вели себя предсказуемо …. Блин! Как же написать-то???
Итак: что плавает, как плавает и зачем плавает.
Плавают элементы, определенные тегами, для которых задано свойство float
.
Float: left | right | none;
/* Прим. если значение
none
- то элемент не плавающий */
В зависимости от значения, элемент прижимается соответствующей стороной (внешней кромкой) к внутренней кромке родительского элемента или к другому плавающему элементу. Строчные контейнеры (следующее за нашим тегом) будут обтекать плавающий контейнер с противоположной стороны и снизу.
Для примера берем рисунок и 2 параграфа с текстом. Помещаем все это в контейнер div
. Контейнеру задаем рамку, для наглядности. Задаем для рисунка обтекание слева…. Не однозначный момент.…
Слева – это не значит, что содержимое будет обтекать наш рисунок слева, наоборот – справа! Иными словами, рисунок будет слева по отношению к последующему содержимому. Уф.… Как сложно иногда бывает описывать простые вещи. Вот так это выглядит.
А вот так это записывается:
/*** код css ***/
.test-float {
border:1px solid yellow; /* рамка контейнера (для наглядности)*/
}
.test-float img {
float:left; /* обтекание слева */
height:120px; /* высота рисунка */
margin:4px; /* внешние отступы со всех сторон */
}
первый параграф
второй параграф
Прежде, чем мы начнем подробно рассматривать чудеса, связанные с плавающими элементами, необходимо выяснить, как можно прекратить все это безобразие, т.е. прекратить обтекание. Для этого используется свойство clear
– очистка.
Clear: both | left | right;
Соответственно отменяет обтекание: любое | слева | справа (в подавляющем большинстве случаев применяется значение both
). Ага, забыл ответить на свой же вопрос – "зачем плавает".
Все блочные элементы, вне зависимости от размеров, в потоке содержимого начинаются с новой строки, после чего поток возобновляется опять с новой строки. Иными словами, блоки располагаются друг под другом. Применение свойства float
позволяет располагать блоки горизонтально, рядом друг с другом (элемент с заданным значением float
автоматически становится блочным), что дает нам большие возможности при макетировании страницы. При этом плавающие элементы удаляются из общего потока
и остальные блочные контейнеры ведут себя так, как будто плавающих элементов не существует.
Так вот, свойство clear
позволяет отменить обтекание. Для чего нам его отменять? Представьте себе, что в предыдущем примере у нас не 2 абзаца обтекают рисунок, а 1 абзац и 1 нумерованный список, причем список достаточно длинный. И если часть списка начнет обтекать рисунок снизу, а не с боку, то выглядеть это будет достаточно противно…. Представили? Поэтому лучше после первого параграфа очистить плавающие элементы, чтобы последующее содержимое начиналось ниже рисунка.
В нашем примере нужно просто очистить второй параграф, для этого добавим класс clear
в нашу таблицу css, а потом укажем этот класс в качестве атрибута второго параграфа.
Clear {clear: both;}
/*---------------------*/
.......
второй параграф
Это всего лишь одна, причем не самая важная, причина, по которой мы применяем очистку. По большому счету в данном случае можно было обойтись и без очистки, просто задав для второго параграфа (или любого другого элемента на его месте) значение margin-top
, достаточное для того, чтобы вытеснить параграф ниже рисунка.
Главная причина в том, что плавающий элемент оказывает влияние на все последующие элементы страницы, что при определенных условиях может вызвать непредсказуемые последствия. В одном из примеров (*) мы вернемся к этому.
В следующей серии примеров мы попытаемся более глубоко разобаться в поведении плавающих элементов.
Сначала создадим несколько стилевых классов для работы с контейнерами.
/* класс для плавающих блоков */
.float-box{
float:left;/* обтекание слева, делаем элемент плавающим */
background-color:#abc;
border:1px solid yellow;
margin:8px;/* отступы со всех сторон */
width:80px;/* ширина */
text-align:center;/* выравнивание по центру */
}
/* очищает обтекание и переопределяет ширину */
.test-box1{
width:150px;/* увеличиваем ширину блока */
float:none;/* делаем блок не плавающим */
}
/* контейнер-обертка */
.local_wrapper{
border:1px solid black;
}
Пример 1
Три плавающих блока разной высоты. Поэтому значения высоты задаем непосредственно в атрибутах тегов.
Пример 2
К двум блокам добавляем через пробел второй класс:
class="float-box
test-box1
"
тем самым переопределяя значение свойства float
и width
. Все три блока заключены в контейнер-оболочку
Блоки div#2 и div#3 делаем обычными, они тут же перестают видеть блок div#1, которого нет в общем потоке, и спокойно занимают его место. Происходит наслоение контейнеров. (В браузере IE7 и ниже - все друг друга видят и никто ничье место не занимает.... Вот так)
Пример 3
Опять все три блока плавающие. Заключены в контейнер-оболочку. Увеличиваем ширину блока div#3.
div#3 - не поместился по горизонтали и был перенесен вниз. Но "зацепился" за div#1 (мы специально сделали контейнеры разной высоты) и пристыковался к его левой кромке. Вот, кстати, подходящий пример (*) того, как изменение размера плавающего элемента может разрушить страницу.
Если внимательно сравнить последний пример с предыдущим, то можно заметить, что расстояние по вертикали между блоками div#2 и div#3 разное. В прошлый раз мы сделали эти блоки обычными и, как мы помним из модели контейнеров, их внешние поля слились. У плавающих элементов слияния внешних полосок НЕ ПРОИСХОДИТ! Таким образом зазор по вертикали стал равен margin-bottom
+ margin-top
, а не большему из них, как в обычной жизни... Не стоит про это забывать.
Ну и еще один сюрприз. Контейнер-обертка схлопнулся (горизонтальная черта над блоками - слившиеся верхняя и нижняя линии рамки), т.к. все содержащиеся в нем блоки плавающие, а значит их нет в общем потоке и отношение к ним соответствующее - как к пустому месту (опять же браузеры IE7 и ниже живут по своим законам...). Что делать?
Есть 3 варианта решения этой проблемы.
- Сделать содержащий контейнер-обертку тоже плавающим, задав для него свойство float
. Тогда он будет относится к вложенным блокам как к "своим"
- Установить контейнеру-обертке для свойства overflow
значение hidden
. Это трюк. И, как большинство трюков, в некоторых ситуациях имеет побочные эффекты, о которых мы поговорим в главе "Позиционирование"
- Очистка с помощью свойства clear
. Для этого должен быть элемент, которому это свойство можно было бы присвоить, например параграф p
или блок div
, в конце концов просто горизонтальная линия hr
По возможности старайтесь явно задавать ширину плавающих контейреров. В отличии от обычных блоков, которые пытаются занять всю доступную им ширину, плавающие элементы скромно устанавливают ширину достаточную, для вмещения содержимого. Поэтому при изменении содержимого будет меняться размер контейнера. Оно нам надо?
Плавающие элементы значительно усложняют разметку страницы, поэтому не стоит этим злоупотреблять.
Часто проблема заключается в том, что нам негде разместить свойство clear
. С этой целью иногда даже создаются пустые элементы, исключительно с целью очистки. Создание пустых элементов - может оказаться не самым безобидным занятием... В этом плане неожиданно полезным может оказаться невзрачный тег br
. Не занимая лишнего места с его помощью можно очистить обтекание.
Clear {clear: both;}
Блохи и грабли
- Вечная проблема - сползание блоков, которым надлежит распологаться горизонтально, вниз. Почему? Суммарный размер ширины блоков + отступы + рамки превышает ширину содержащего блока или страницы
- Браузер IE6 это отдельная, долгая и безумно печальная история (IE7 тоже, кстати, при благоприятных условиях может запросто разрушить вашу страницу). Пока мы на этом подробно останавливаться не будем
Позиционирование
Создано 02.09.2010
Мы рассмотрели две важных концепции модели визуального форматирования: модель контейнеров и плавающие элементы. Третий "краеугольный камень" верстки страниц на основе таблиц CSS - позиционирование.
В этой главе, как и в двух предыдущих, мы говорим о блочных элементах
. Остановимся на этом подробнее.
Блочные и строчные контейнеры
Строчные контейнеры (span, strong, i
и другие..) выводятся в строке горизонтально. Блочные контейнеры (p, h1, div ...
) выводятся вертикально один над другим, если значение свойства float
не определяет их как плавающие. Деление элементов на блочные и строчные достаточно условно, потому что задав определенное значение свойству элемента display
, мы можем изменить тип генерируемого контейнера и переопределить элемент как:
- блочный - {display: block;}
- строчный - {display: inline;}
- ни контейнер ни его содержимое не выводится и не занимает места на странице - {display: none;}
- другие значения свойства смотрите в справочнике...
По умолчанию браузер выводит элементы документа последовательно, единым потоком. Изменить порядок следования мы можем с помощью свойства position
(по умолчанию имеет значение static
).
Относительное позиционирование
Относительное позиционирование заключается в смещении элемента в потоке, относительно его начального положения.
div#2
position: relative;
margin-top: -30px;
margin-left: 30px;
Позиция элемента вычисляется с помощью свойств top, bottom, left, right
.
Относительное позиционирование. CSS
/* отсчет относительно изначальной позиции
! */
position: relative;
left: 50px;
top: 20px;
Абсолютное позиционирование
Если при относительном позиционировании элемент оставался в нормальном потоке, то при абсолютном он извлекается из нормального потока, не занимает в нем места и остальные элементы ведут себя так, как будто абсолютно-позиционированного элемента не существует. Этим он напоминает плавающий элемент.
Контейнер, свойству position
которого присвоено значение absolute
, смещается вверх и занимает верхний левый угол ближайшего позиционированного элемента, у которого position: absolute | relative
.
(Кстати это важный момент. Если вы поместили абсолютно позиционированный блок в не позиционированный контейнер, то ваш блок из контейнера убежит... , если только он не находится в верхнем левом углу страницы. Вот так!)
Если такого не находится, то в качестве контейнера используется страница. Остальные элементы сдвигаются вверх, занимая освободившееся место.
Позиция вычисляется с помощью тех же свойств, что и при относительном позиционировании.
Абсолютное позиционирование. CSS
/* отсчет относительно соответствующего угла позиционированного родительского контейнера
! */
position: absolute;
right: 10px;
top: 10px;
Можно сверстать страницу исключительно из абсолютно позиционированных элементов! И все бы хорошо, если бы не необходимость явно задать ВСЕ размеры. Иначе при увеличении размеров шрифта, или добавлении текста, в общем изменении размера контейнера, блоки будут наслаиваться и страница, вероятно, разрушится.
Ну и совсем немного про фиксированное позиционирование
, даже не будем выводить отдельной темой.
Фиксированное позиционирование. CSS
/* отсчет относительно соответствующего угла экрана
*/
position: fixed;
left: 0px;
bottom: 200px;
Это абсолютное позиционирование, с той разницей, что позиция фиксируется относительно экрана
. Зафиксированный элемент как-бы плавает в одном и том же месте экрана (как пример - логотип этого сайта), не смотря на прокрутку страницы. Браузер IE6 не поддерживает фиксированное позиционирование.
Если при относительном позиционировании не задавать значения позиции, то такой контейнер ничем не будет отличаться от обычного. Этим можно пользоваться, чтобы в дальнейшем, в случае необходимости, можно было сместить элемент с помощью свойств позиционирования, а не отступов. Или разместить внутри абсолютно позиционированный элемент.
При наслоении контейнеров на переднем плане находится тот контейнер, у которого больше z-index. Свойство может принимать в качестве значений любые целые числа (в том числе отрицательные). Если известно, что элемент всегда должен находиться на поверхности, лучше задать значение побольше, с запасом, например: z-index: 2000;
Блохи и грабли
- Помните плавающие элементы? Чтобы предотвратить схлопывание содержащего контейнера, мы тогда задавали для него свойство overflow: hidden
, и упоминали о возможных побочных эффектах. Так вот, если с помощью задания соответствующей позиции мы сместим какой либо блок (его часть) за границы содержащего контейнера, то "выступающую часть" просто обрежет
.
- При абсолютном позиционировании в браузере IE6 родительскому элементу нужно явно задавать размеры, иначе блок будет позиционирован относительно страницы... Косяк браузера
- Часто забывают, что родительский элемент должен быть явно позиционирован! (при абс.поз.)
Практикум
Создано 19.10.2010
Подготовка
Создаем папку practicum
(корневой каталог), внутри нее создаем папку css
.
- В корневом каталоге создаем документ practicum1.html
- В папку css
создаем файл practicum_css
.css
- В начало документа вставляем объявление DOCTYPE
(пока просто вставляем, более подробно мы разберем его позже)
- Структурируем документ, определяя основные теги: html, head, body
- Пишем что-нибудь внятное в теге title
, а в разделе head
ссылаемся на нашу таблицу стилей в папке css
Чтобы протестировать документ и правильность подключения таблицы стилей, задаем для тега body
цвет фона #ccc
, вставляем в документ параграф с произвольным текстом и обновляем документ. Все.
Постановка задачи
С относительным позиционированием мы уже разобрались. Все было достаточно просто и понятно. Гораздо интереснее - как я это "нарисовал"... Похоже относительным позиционированием здесь дело не обошлось....
Да, все не так просто, хотя, в общем то, и не очень сложно. Верстаем макет, изображенный на иллюстрации. Поэтапно, подробно, внимательно. Иногда, в экспериментальных целях, наступем на грабли.
1-й этап
Родительский контейнер
/* задаем ширину и рамку */
#wrapper{
width:610px;
border:1px solid yellow;
}
Не очень красиво, когда блоки прикасаются к внешнему контейнеру, поэтому стоит задать отступы. И сразу вопрос: что использовать, padding
для родительского блока или margin
для внутренних? При явно заданных размерах родителя, предпочтительнее, наверное, будет использовать второй вариант, потому что иначе размер родительского блока увеличится на величину соответствующих внутренних отступов. К тому же мы все равно будем использовать margin
для зазоров между блоками.
Удобнее сначала для всех блоков задать общие свойства, а уже потом, при необходимости, для групп элементов или в индивидуальном порядке какие-то из них переопределить. Например, для всех блоков задать внешний отступ справа и сверху, и затем только для первого определить отступ слева, чтобы он не прижимался к содержащему контейнеру.
Для параграфов задаем внутренние отступы и очищаем элементы от обтекания. Для блоков у нас задано обтекание слева, поэтому давайте применим очистку слева: clear: left
. Для чего - станет понятно чуть позже.
параграф 1
/* Общие свойства. Потом переопределим. */
#wrapper div{
border:1px solid red;
margin:2px 10px 0 0;
background-color:#484f6c;
float:left;
width:100px;
height:100px;
}
#wrapper p{
padding:2px;
clear:left;
}
Параграф 1
2-й этап
Правый блока (5)
. Увеличиваем высоту, убираем фон и прижимаем к правому краю. Для этого создаем идентификатор #rightBox
. Если мы просто пропишем в таблице css идентификатор #rightBox
и применим его к правому блоку, то с удивлением обнаружим, что ничего не изменилось! Типичная ошибка, связаная со специфичностью. Дело в том, что к блоку применимы сразу два стилевых правила: #wrapper div
и #rightBox
. Первое из них более специфично, т.к. использует контекстный селектор. Чтобы все-таки переопределить первое правило, записываем идентификатор применительно к элементу div, выглядеть это будет вот так: div#rightBox
. Теперь правила имеют одинаковую специфичность и применено будет то, которое записано последним. Если в результате перестановки правил в таблице стилей нужное нам правило окажется ближе к началу страницы, то оно опять не сработает.... Чтобы наше правило было определяющим, вне зависимости раньше или позже оно прописано в таблице, нужно сделать его более специфичным, например записывать так:
/* правый блок (5) */
#wrapper div#rightBox{
background:transparent;
float:right;
height:180px;
width:137px;
}
Параграф 1
Параграф 2
Второй блок (2)
. Убираем фон, рамку делаем пунктирной. Класс - #old_position
/* второй блок (2) */
#wrapper div.old_position{
background:transparent;
border-style:dashed;
}
Четвертый блок (4)
. Устанавливаем относительное позиционирование. Смещаем вниз-влево. Идентификатор - #test_box
. Вопрос - на сколько нужно сместить блок (4) влево (от начальной позиции), чтобы имитировать сдвиг блока (2) вправо на 50px?
Расчет.
Сначала вычислим расстояние от левого края блока (4):
отступ слева + 3 блока с правым отступом и удвоенной рамкой
2 + 3 * (100 + 10 + 2)= 338px
Потом вычислим положение сдвинутого вправо псевдоблока (2):
отступ слева + 1 блок с правым отступом и удвоенной рамкой + псевдосдвиг
2 + (100 + 10 + 2) + 50 = 164px
В результате получаем реальный сдвиг:
338 - 164 = 174px
#wrapper #test_box{
position:relative;
right:174px;
top:30px;
}
Параграфы
. Почему на 1-ом этапе мы задали для параграфов clear:left
? Потому что нам нужно, чтобы они обтекали только правый блок (5). Можете поэкспериментировать: уберите очистку и сделайте ширину блоков меньшего размера. Текст параграфа "устремится" в образовавшийся зазор между блоками (4) и (5). Насчет блока (4): мы помним, что хоть визуально он и смещен, но продолжает занимать первоначальную позицию в потоке.
Второй параграф очищаем полностью и отменяем обтекание. Иногда, чтобы не создавать специально идентификатор или класс, проще прописать правило непосредственно в документе, в атрибуте соответствующего тега.
Параграф 1
Параграф 2
3-й этап
Рисуем указатели величины сдвига
. Для этого помещаем внутри блока (2) еще один блок с таким же атрибутом class="old_position"
. Чем повторять те же свойства в еще одном классе, правильнее применить уже существующий класс, а потом, путем добавлением к атрибуту нового класса или идентификатора, добавить недостающие свойства и переопределить имеющиеся. Еще раз напомню, что если мы планируем использовать какой-либо набор свойств многократно, то их нужно оформлять как класс, если однократно, то лучше как идентификатор.
Переопределять свойства будем в идентификаторе #pointer
. Переопределяем цвет рамки, убираем верхнюю и левую рамку и добавляем размеры блока (вернее тоже переопределяем, но те, которые были установлены еще во #wrapper div
)
/* внутри блока (2) */
div#pointer{
border-color:black;
border-width:0 1px 1px 0;
height:29px;
width:49px;
margin:0;
}
left:50px
top:30px
Параграф 1
Параграф 2
Параграф 1
Параграф 2
Надписи, указывающие величину сдвига
. Размещаем их внутри блока #pointer
, применяем абсолютное позиционирование и смещаем в заданную позицию уже снаружи (за счет величины сдвига, превышающей размеры родителя, который никак на это не реагирует, потому что не видит абсолютно позиционированные элементы). Надписи заключаем в теги span
, в качестве атрибута которых указываем класс caption
. Мы помним, что плавающий или абсолютно позиционированный строчный тег автоматически становится блочным! Почему в данном случае удобнее применить тег span
, а не div
. Этим мы избавляем себя от необходимости переопределять ранее установленные для тегов div
свойства, такие как рамка, фон и пр....
Если мы сейчас проверим, что у нас получилось, то, увы, не найдем своих надписей. Почему? Абсобютно позиционированные элементы находятся в не позиционированном родительском блоке! Значит они будут смещены относительно верхнего левого угла страницы. Вот там их и ищите.
Устанвливаем для родителя position:relative
.
Два блока внутри блока (5)
. Здесь совсем просто. Для определения стилевых правил используем конструкцию #rightBox div
. Отменяем обтекание, устанавливаем размеры и отступы. Индивидуальные правила для каждого блока задаем прямо в атрибутах тегов.
/* внутри блока (5) */
#rightBox div{
width:50px;
height:30px;
float:none;
margin:5px;
}
4-й этап
Вставляем текст параграфов и названий блоков. В правом блоке (5) уменьшаем размер шрифта, а в блоках #4.1 и #4.2 выравниваем текст по правому краю.
/* добавляем размер шрифта, выравнивание текста */
#rightBox div{
...
font-size:75%;
text-align:right;
}
#rightBox p{
font-size:75%;
}
left:50px
top:30px
Параграф под блоком, смещенным за счет внешнего отступа:
margin-top: -30px;
margin-left: 30px;
При этом элемент продолжает занимать исходный участок страницы, не смотря на визуальное смещение (освободившееся место никто не занимает).
Cравнивая с блоками #4.1 и #4.2, размещенными справа, где блок #4.2 смещен вверх за счет отрицательного внешнего отступа, видим, что во втором случае элемент реально смещается, освобождая пространство для следующего за ним параграфа
Последние штрихи. Прозрачность
. Иногда в презентационных целях можно тот или иной элемент сделать полупрозрачным. Регулировать прозрачность можно, используется свойство opacity
, которому присваивается значение от 0 до 1 (1-не прозрачно). В браузерах IE свойство opacity
не работает, и для этих же целей используется свойство filter
, которому значение прозрачности присваивается следующим хитрым способом:
filter:alfa(opacity=80)
, соотвестственно, от 0 до 100
Какой же способ применить нам? Оба. В CSS
браузер игнорирует код, который не понимает, поэтому во всех браузерах, кроме IE, будет проигнорировано свойство filter
, а в IE наоборот - opacity
/* добавляем прозрачность */
#wrapper #test_box{
...
opacity:0.8;
filter:alpha(opacity=80); /** для браузеров IE **/
}
Порядок наложения
позиционированных элементов друг на друга определяет z-index
. Чем больше z-index
(целые числа), тем выше элемент по оси Z. Отрицательные числа применять можно, но не желательно... не все браузеры любят...
Чтобы блок #4.1 был сверху, нужно присвоить ему больший z-index
(по умолчанию - auto, т.е. последующие выводятся выше, чем предыдущие). Чтобы наложившийся блок не закрывал текст, делаем выравнивание по правому краю. Уменьшаем размер шрифта.
div#4.1
Оптимизация
В окончательном варианте документ будет выглядеть так:
Practicum 1
div#1
div#3
div#2
div#4.1
div#4.2
Параграф под блоком, смещенным за счет внешнего отступа:
margin-top: -30px; margin-left: 30px;
При этом элемент продолжает занимать исходный участок
страницы, не смотря на визуальное смещение (освободившееся
место никто не занимает).
Cравнивая с блоками #4.1 и #4.2,
размещенными справа, где блок #4.2 смещен вверх за
счет отрицательного внешнего отступа, видим, что во
втором случае элемент реально смещается, освобождая
пространство для следующего за ним параграфа
Оптимизируем код CSS
. В частности, когда многие элементы имеют относительное позиционирование, проще сделать это свойстов общим для всех, а потом, при необходимости, переопределить для отдельных.
В другом случае можно использовать множественные селекторы, например для группы селекторов - размер шрифта.
/* В начале страницы обычно указывают */ /* назначении таблицы CSS */
#wrapper{
border:1px solid yellow;
text-align:left;
width:610px;
}
#wrapper div{
background-color:#484f6c;
border:1px solid red;
float:left;
position:relative;/* делаем общим для всех DIV */
margin:2px 10px 0 0;
width:100px;
height:100px;
}
#wrapper p{
clear:left;
padding:2px;
}
div#rightBox{
background:transparent;
float:right;
height:180px;
width:137px;
}
#wrapper div.old_position{
background:transparent;
border-style:dashed;
}
#wrapper #test_box{
/* position:relative; -убираем */
right:174px;
top:30px;
opacity:0.8;
filter:alpha(opacity=80); /** for IE **/
}
div#pointer{
border-color:black;
border-width:0 1px 1px 0;
margin:0;
width:49px;
height:29px;
}
span.caption,div#rightBox{
font-size:75%; /* делаем общим для группы селекторов */
}
span.caption{
position:absolute;
}
#rightBox div{
float:none;
/* font-size:75%; -убираем */
margin:5px;
text-align:right;
width:50px;
height:30px;
}
#rightBox p{
/* font-size:75%; -убираем */
}
Прозрачность наследуется. Если элемент сделан полупрозрачным, то все дочерние элементы и текст тоже будут полупрозрачными. И вы не сможете сделать их непрозрачными, переопределив значение свойства.
Добиться определенного результата можно разными способами. Рассмотренный выше пример продемонстрировал всего лишь один из этих способов.
Классы и специфичность. С одной стороны, мы стараемся не плодить классы и идентификаторы, а за счет использования контекстных селекторов обходиться существующими. С другой, при большом уровне вложенности элементов (по принципу "матрешки"), специфичность может сильно усложнить стилевые правила и тем самым снизить читабельность кода. Нужно находить разумный компромисс. В нашем случае конструкцию #wrapper div
вполне можно было бы заменить классом .className
, указав его в атрибуте каждого блока (1) - (5), с последующим переопределением. Или вообще, вполне оправдано определить для каждого блока свой идентификатор, а общие значения свойств задать с помощью правила, использующего множественные селекторы.
Вы можете попробовать сделать это самостоятельно. Экспериментируйте.
В этой лекции рассказывается об элементах разметки тела HTML-документа, подробно разбирается их типизация, назначение и применение.
Теги тела документа
Теги тела документа предназначены для управления отображением информации в программе интерфейса пользователя. Они описывают гипертекстовую структуру базы данных при помощи встроенных в текст контекстных гипертекстовых ссылок. Тело документа состоит из:
- иерархических контейнеров и заставок;
- заголовков (от Н1 до Н6);
- блоков (параграфы, списки, формы, таблицы, картинки и т.п.);
- горизонтальных отчеркиваний и адресов;
- текста, разбитого на области действия стилей (подчеркивание, выделение, курсив);
- математических описаний, графики и гипертекстовых ссылок.
Тело документа – контейнер ВОDY
Описание тегов тела документа следует начать с тега ВОDY. В отличие от тега НEАD, тег ВОDY имеет атрибуты.
Атрибут BАСКGROUND определяет фон, на котором отображается текст документа. Так, если источником для фона HTML- документа является графический файл image.gif, то в открывающем теге тела BODY появляется соответствующий атрибут:
<ВОDY ВАСКGROUND="image.gif">
Как видно из этого примера, в качестве значения данного атрибута используется адрес в сокращенной форме URL. В данном случае это адрес локального файла. Следует заметить, что разные интерфейсы пользователя поддерживают различные дополнительные атрибуты для тега ВОDY.
В данной таблице строка #ХХХХХХ определяет цвет в терминах RGB в шестнадцатеричной нотации. Также имеется возможность задавать цвета по названию. Далее в таблице приведены названия цветов, определенные в стандарте HTML 4 и соответствующие им RGB-коды. Отметим, что многие современные браузеры выходят за рамки стандартов и поддерживают гораздо больше названий цветов.
Название
Код
Название
Код
aqua
#00FFFF
navy
#000080
black
#000000
olive
#808000
blue
#0000FF
purple
#800080
fuchsia
#FF00FF
red
#FF0000
gray
#808080
silver
#C0C0C0
green
#008000
teal
#008080
lime
#00FF00
white
#FFFFFF
maroon
#800000
yellow
#FFFF00
Так, значения атрибутов в таблице 3.1 определяют цвет текста как синий, фона - белый, пройденные ссылки красные, а новые ссылки зеленые. Если в качестве атрибутов тега ВОDY указать
<ВОDY ВGCOLOR=#FFFFFF ТЕХТ=#0000FF VLINK=#FF0000 LINK=#00FF00>,
то цвет фона будет белым, текст будет синим, ссылки - зелеными, а пройденные ссылки станут красными. Однако пользоваться этими атрибутами следует крайне осторожно, так как у пользователя может оказаться другой интерфейс, который эти параметры не интерпретирует.
Microsoft Internet Explorer и Netscape Navigator допускают применение атрибутов LEFTMARGIN=n и ТОРМАRGIN=n в теге <ВОDY>. Атрибут LEFTMARGIN= задает левое поле для всей страницы. ТОРМАRGIN= определяет верхнее поле. Число n показывает ширину поля в пикселах. Например, тег <ВОDY LEFTMARGIN =»40″> создаст на всей странице левое поле шириной 40 пикселов. При n, равном 0, левое поле отсутствует.
Теги управления разметкой
Заголовки
Заголовок обозначает начало раздела документа. В стандарте определено 6 уровней заголовков: от Н1 до Н6. Текст, окруженный тегами <Н1>Н1>, получается большим - это основной заголовок. Если текст окружен тегами <Н2>Н2>, то он выглядит несколько меньше (подзаголовок); текст внутри <НЗ>НЗ> еще меньше и так далее до <Н6>Н6>. Некоторые программы позволяют использовать большее число заголовков, однако реально более трех уровней встречается редко, а более 5 - крайне редко.
Ниже на рисунке показан результат использования следующих заголовков:
Заголовок 1
Заголовок 2
Тег
Тег
Применяется для разделения текста на параграфы. В нем используются те же атрибуты, что и в заголовках.
Атрибут АLIGN
Атрибут АLIGN позволяет выровнять текст по левому или правому краю, по центру или ширине. По умолчанию текст выравнивается по левому краю. Данный атрибут применим также к графике и таблицам.
АLIGN=justify
выравнивание по левому и правому краям. Реализовано не во всех программах интерпретации.
АLIGN=left
выравнивание по левому краю. По умолчанию текст HTML выравнивается по левому краю и не выравнивается по правому, то есть начало строк находится на одном уровне по вертикали, а концы - на разных. Чаще всего, получающийся при этом текст с равными промежутками между словами выглядит лучше. Поскольку выравнивание по левому краю задается автоматически, атрибут АLIGN=left можно опустить.
АLIGN=right
выравнивание по правому краю. Текст, выравненный по правому краю и не выравненный по левому - концы строк находятся на одном уровне, а начало на разных, - часто используется с целью создать оригинальный дизайн. Для этого задается атрибут АLIGN=right в обычных тегах, например в теге <Р>.
АLIGN=center
центрирование текста и графики. Есть несколько способов отцентрировать текст или графику. В спецификациях HTML 3.0 предлагается пользоваться тегом <АLIGN=сеntеr>. Однако этот тег применим не ко всем объектам HTML-страницы, поэтому разработчики Netscape добавили тег <СЕNТЕR>, который центрирует любые объекты и поддерживается браузерами Netscape Navigator 3.0, Microsoft Explorer 3.0 и другими. К тегу <СЕNТЕR> нужно относиться с осторожностью. Какой-нибудь браузер может его вообще проигнорировать, и на странице окажется текст, выравненный по левому краю.
Обтекание графики текстом. С помощью атрибута ALIGN можно заставить текст «обтекать» графический объект. Для этого следует поместить тег туда, где должен быть графический объект, и добавить атрибут ALIGN=left, ALIGN=right или АLIGN=center. Кроме того, с помощью атрибутов НSPAСЕ и VSPАСЕ (они описаны ниже) задается ширина горизонтальных и вертикальных полей, отделяющих изображение от текста. Можно также создать рамку вокруг картинки или обрамление таблицы текстом. Чтобы текст не «обтекал» графику, а прерывался, необходимо применить тег
c атрибутом СLEAR.
Использование тега <ВR>
Принудительный перевод строки используется для того, чтобы нарушить стандартный порядок отображения текста. При обычном режиме интерпретации программа интерфейса пользователя отображает текст в рабочем окне, автоматически разбивая его на строки. В этом режиме концы строк текста игнорируются. Иногда для большей выразительности требуется начать печать с новой строки. Для этого и нужен тег ВR. Атрибут СLЕАR в теге <ВR> используется для того, чтобы остановить в указанной точке обтекание объекта текстом и затем продолжить текст в пустой области за объектом. Продолжающийся за объектом текст выравнивается в соответствии со значениями LEFT, RIGHT или АLL атрибута СLЕАR:
Текст будет продолжен, начиная
с ближайшего пустого левого поля.
Текст будет продолжен, начиная
с ближайшего пустого правого поля.
Текст будет продолжен, как
только и левое, и правое поля окажутся пустыми.
Элемент разметки
Тег (Nо Вrеаk, без обрыва) дает браузеру команду отображать весь текст в одной строке, не обрывая ее. Если текст, заключенный в теги , не поместится на экране, браузер добавит в нижней части окна документа горизонтальную полосу прокрутки. Если вы хотите оборвать строку в определенном месте, поставьте там тег <ВR>.
Теги управления отображением символов
Все эти теги можно разбить на два класса: теги, управляющие формой отображения (font style), и теги, характеризующие тип информации (information type). Часто внешне разные теги при отображении дают одинаковый результат. Это зависит главным образом от настроек интерпретирующей программы и вкусов пользователя.
Теги, управляющие формой отображения
Курсив, усиление, подчеркивание, верхний индекс, нижний индекс, шрифт большой, маленький, красный, синий, различные комбинации - все это делает страницы более интересными. Microsoft Internet Explorer и Netscape Navigator позволяют определить шрифт с помощью тега FONT. Теперь можно объединять на одной странице несколько видов шрифтов, вне зависимости от того, какой из них задан по умолчанию в браузере пользователя.
Теги <ВIG> и - изменение размеров шрифта
Текст, расположенный между тегами <ВIG>ВIG> или , будет, соответственно, больше или меньше стандартного.
Верхние и нижние индексы
С помощью тегов и можно задавать верхние и нижние индексы, необходимые для записи торговых знаков, символов копирайта, ссылок и сносок. Рассматриваемые теги позволяют создать внутри текстовой области верхние или нижние индексы любого размера. Чтобы они казались меньше окружающего текста, можно использовать теги и с атрибутом FONT SIZE=-1, уменьшающим размер шрифта.
Атрибут SIZЕ
Атрибут SIZЕ тега позволяет задавать размер текста в данной области. Если вы не пользуетесь тегом для задания определенного размера шрифта на всей странице, то по умолчанию принимается 3. Некоторые браузеры тег не поддерживают, поэтому желательно употреблять его только внутри текстовой области. В других случаях лучше использовать теги <Н1>, <Н2>, <НЗ> и т.д. Главное преимущество тега состоит в том, что после окончания действия он не разбивает строку, как теги <Нn>. Поэтому тег бывает очень полезен для изменения размера шрифта в середине строки.
Атрибут СОLОR
Если вы хотите сделать свою страницу более красочной, можете воспользоваться атрибутом СОLОR в теге FONТ, и тогда единственным ограничением будет цветовая палитра на компьютере пользователя.
Теги, управляющие формой отображения, приведены в таблице.
Тег
Значение
…
Курсив (Italic)
…
Усиление (Вold)
…
Телетайп
…
Подчеркивание
…
Перечеркнутый текст
…
Увеличенный размер шрифта
…
Уменьшенный размер шрифта
…
Подстрочные символы
…
Надстрочные символы
<ЕМ>…ЕМ>
Типографское усиление
<СIТЕ>…СIТЕ>
Цитирование
…
Усиление
<СODE>…СODE>
Отображает примеры кода (например, "коды программ")
…
Последовательность литералов
<КВD>…КВD>
Пример ввода символов с клавиатуры
…
Переменная
…
Определение
…
Текст, заключенный в двойные кавычки
Эти теги допускают вложенность, поэтому все они имеют тег начала и конца. При использовании таких тегов следует помнить, что их отображение зависит от настроек программы-интерфейса пользователя, которые могут и не совпадать с настройками программы-разработчика гипертекста.
Создание списков в HTML
Списки являются важным средством структурирования текста и применяются во всех языках разметки. В НТМL имеются следующие виды списков: ненумерованный список (неупорядоченный) (Unordered Lists
), нумерованный список (упорядоченный) (Ordered Lists ) и список определений. Теги для ненумерованных и нумерованных списков - это основа HTML. HTML 3.2 добавляет несколько атрибутов к тегам списков для выбора разных типов маркеров в ненумерованных списках и разных схем нумерации в нумерованных. Можно включать такие атрибуты и в сами теги элементов списка (List Item - ), чтобы сменить тип маркера в середине списка. После появления нового атрибута все последующие маркеры в списке будут иметь такой же вид.
Неупорядоченные списки - тег
Ненумерованный список. Ненумерованный список предназначен для создания текста типа:
- первый элемент списка;
- второй элемент списка;
- третий элемент списка.
Записывается данный список в виде последовательности:
- первый элемент списка
- второй элемент списка
- третий элемент списка
Теги - это теги начала и конца ненумерованного списка, тег
- (List Item) задает тег элемента списка. Помимо этих тегов, существует тег, позволяющий именовать списки -
(List Header).
Атрибуты маркеров в ненумерованном списке
Чтобы не применять одни и те же маркеры на разных уровнях вложенности, можно использовать атрибут ТYРЕ. Вы можете задать любой тип маркера в произвольном месте списка. Можно даже смешивать разные типы маркеров в одном списке. Ниже перечислены теги с атрибутами стандартных маркеров:
Тег создает сплошные маркеры
такого типа, как в списках первого уровня по
умолчанию.
Тег создает маркеры в виде
окружностей.
Тег создает сплошные квадратные
маркеры.
Упорядоченные списки - тег
Нумерованные списки. Тег
вместе с атрибутом ТYРЕ= в HTML 3.2 позволяет создавать нумерованные списки, используя в качестве номеров не только обычные числа, но и строчные и прописные буквы, а также строчные и прописные римские цифры. При необходимости можно даже смешивать эти типы нумерации в одном списке:
<ОL ТYРЕ=l> Тег создает список с нумерацией
в формате 1., 2., 3., 4. и т.д.
<ОL ТYРЕ=А> Тег создает список с нумерацией
в формате А., В., С., D. и т.д.
Тег создает список с нумерацией
в формате а., b., с., d. и т.д.
<ОL ТYРЕ=I> Тег создает список с нумерацией
в формате I., II., III., IV. и т.д.
Список определений - тег
Теги списка (Definition List:
, - ,
- ) используют для создания списка терминов и их определений. Схема использования тега следующая.
- Термин
- Определение
Определяемый термин записывается на одной строке, а его определение - на следующей, с небольшим отступом вправо. Тег
позволяет создавать отдельные абзацы с отступом без нумерации или маркеров. Отступ делается от левого края. Если на странице несколько тегов , то текст постепенно сдвигается все больше вправо. В конце определения поместите закрывающий тег
. Помните, что тег lt;DL> сдвигает только левую границу абзаца.
Горизонтальные линейки - тег <НR>
Горизонтальное отчеркивание (Horizontal Rule) применяется для разделения документа на части. С помощью одного лишь тега <НR> можно придать странице оригинальный вид. Попробуйте поэкспериментировать с тегом <НR>, и вы получите линии, совсем не похожие на те, которыми обычно пользуетесь.
Преформатированный вывод - тег <РRЕ>
Применение этого тега позволяет отобразить текст «как есть» (без форматирования), теми же символами и с тем же разбиением на строки.
Применение тега
Текст, помещенный между тегами , мерцает. Данный тег поддерживается только браузером Netscape Navigator. Пользоваться им следует с большой осторожностью.
HTML (Hyper Text Markup Language) : язык гипертекстовой разметки, используется для создания интернет-страниц. Страница, написанная таким образом, представляет собой обычный текстовыи документ, в котором при помощи тегов определяются расположение и оформление текста, графики и др.
Все теги пишутся в угловых
скобках (< , >)
Все теги делятся на 2 группы:
-
требующие закрывающего тега (контейнеры
);
-
не имеющие закрывающего тега (одиночные).
Теги-контейнеры записываются так:
<тег>
подопытный объекттег>
. Косая черта (символ /) говорит о том, что тег закрывающий.
Одиночные теги записывают так:
одна хрень<тег>
другая хрень
Тег может иметь параметры. Параметры тега записываются после него, внутри его угловых скобок через пробел. Например,
Ниже приведены основные html-теги и их применение.
Обязательные теги
- тег-контейнер, открывающий тег пишется в самом начале документа; закрывающий- в самом конце. Заключает в себе всё содержимое документа и сообщает компьютеру, что это действительно html-документ.
- контейнер, заключает в себе голову html-документа, где пишутся специальные теги. Начинается сразу после , заканчивается между и
.
Простой текст, написанный внутри этого контейнера, в браузере никак не отобразится.
- контейнер внутри контейнера
.
Предназначен для написания в нём заголовка страницы.
- тело документа, где находится основное содержание. Контейнер должен распологаться между и .
Имеет много параметров:
text
-цвет текста на странице,
bgcolor
-цвет фона страницы,
link
-цвет ссылок на странице,
На этом список обязательных тегов заканчивается. Идём дальше...
Теги - контейнеры
-необязательный, но необходимый тег. Имеет ценнейший параметр
href
, без использования которого не обходится ни один сайт. Оно и понятно, ведь сочетанием a href
образуется ссылка
, а какой же сайт без ссылок?!
Пример:
текст, который увидит посетитель
-устаревший, но надёжный тег для текста. Вот его параметры:
color
-цвет шрифта,
size
-размер шрифта (в относительных единицах, от 1 до 7)
и др.
-используется для выравнивания текста и других объектов по горизонтальному центру страницы
-предназначен для написания заголовка внутри страницы. Текст внутри тега отображается большим жирным шрифтом и устанавливается по центру. Вообще-то на месте цифры 2 в моём примере может стоять цифра от 1 до 6 - получаются заголовки от самого большого до самого маленького.
-устанавливает жирное начертание текста.
-курсивный текст
-подчёркнутый текст
-перечёркнутый текст
-используется для отделения параграфа. Позволяет установить для текста различные отступы.
Одиночные теги
-переброс на другую строку
-горизонтальная черта.
-размещение картинки на странице.
У него несколько параметров:
src
, указывает путь к картинке (абсолютный или относительный);
align
, устанавливает расположение картинки. Этот параметр может принимать значения \"center\", \"left\", \"right\".
alt
, подпись к картинке, которая появляется при наведении на неё мышкой.
border
, устанавливает толщину рамки вокруг картинки. Принимает значение от 0 до сколько хочешь.
Займемся
контейнерным
Web-дизайном
- изучим элементы интернет-страниц - блочные контейнеры.
Освоим дополнительные атрибуты стилей, применяемых для задания параметров блочных контейнеров (их размеры и местоположение на Web-странице).
А в завершение получим от CSS средства управления переполнением.
В блочном контейнере могут быть размещены от одного до нескольких блочных элементов таких как заголовок, абзац, таблица и др.
Для создания блочного контейнера
применяется парный тег
, с помещенным внутри html-кодом - содержимым контейнера.
(листинги 10.1-10.3).
В этом блочном контейнере размещен заголовок и два абзаца.
Здесь - таблица.
В этом - видеоролик и абзац. А еще добавили встроенный стиль, выравнивающий текст по центру. Видеоролик так же будет размещен по центру.
Блочные контейнеры используются чаще, чем встроенные.
Web-дизайн прошедшего времени и его недостатки
Не так давно Web-программисты
пользовались
тремя основными направлениями
контейнерного
Web-дизайна
:
текстовым, фреймовым и табличным. Каждый по своему был хорош, но и имел недоработки. С появлением нового вида Web-дизайна - контейнерного, остальные уходят на второй план.
Текстовый контейнерный Web-дизайн
- обычный текстовый документ: абзацы, заголовки, большие цитаты, текст фиксированного формата и таблицы. Основное его преимущество - простой html-код. Недостатки: нудный вид web-страницы, отсутствие средств размещения элементов
на Web-странице - только следуют друг за другом.
Web-страница делится на четыре части: заголовок, полоса навигации, основной контент, сведения об авторе. Во всех страницах сайта все одинаково
за исключением основного контента, которое должно быть уникальным.
Получается, что HTML-код каждой web-страницы почти одинаков (кроме основного содержимого), и при загрузке каждой страницы идет загрузка одной и той же части кода. А чем больше объем файла, тем дольше он загружается (тем дольше ожидание пользователя). Вот бы загружать не весь html-код, а лишь часть - основной контент.
Вот эту проблему
текстовый Web-дизайн и не решает.
Фреймовый контейнерный Web-дизайн
- выход из создавшейся ситуации. Фрейм
-
выводит в отдельном месте страницы содержимое произвольной
Web-страницы,
адрес которой прописывается в его параметрах.
Страница сайта
-
набор фреймов. Некоторые участки содержимого выводились в отдельные Web-страницы, адреса которых прописывались в параметрах их фреймов. В других страницах размещался лишь основной материал. Преимущество фреймового контейнерного web-дизайна
- повысилась скорость загрузки страницы. Но есть и минусы: фреймы не
стандартизированы и нет возможности изменить их структуру. Позже появилась новая разновидность web-дизайна
- табличный.
Табличный контейнерный Web-дизайн
. При создании web-страницы применяется таблица. Заголовок, авторские права, полоса навигации размещались по отдельным ячейкам этой таблицы. В дальнейшем табличный web-дизайн стал более популярным, чем фреймовый.
Преимущества:
Возможность одинакового отображения web-страниц во всех web-браузерах.
Форматирование таблиц и их ячеек стилями CSS.
-
сложные Web-страницы - размещение различных фрагментов содержимого, увеличение числа колонок текста.
Недостатки:
Все страницы опять имели повторяющиеся части html-кода, что отразилось на снижении загрузки страницы.
Большой и сложный html-код.
Так давайте же перейдем к изучению новой разновидности web-дизайна.
Сущность контейнерного Web-дизайна
Для размещения отдельных фрагментов содержимого Web-страниц использует блочные контейнеры, с которыми мы познакомились в начале этой главы. Отдельные контейнеры создаются для заголовка Web-сайта, полосы навигации, основного содержимого и сведений об авторских правах. Если основное содержимое имеет сложную структуру и состоит из множества независимых частей, для каждой из них создают отдельный контейнер.
Для задания различных параметров блочных контейнеров предусмотрены специальные атрибуты стиля CSS. К таким параметрам относятся размеры (ширина и высота), местоположение контейнеров и их поведение при переполнении. Также мы можем задать для контейнеров цвет фона, создать отступы и рамки, чтобы их выделить (о параметрах отступов и рамок речь пойдет в главе 11).
И что, контейнерный Web-дизайн
так уж хорош? Давайте рассмотрим недостатки трех старых принципов Web-дизайна и выясним, сможет ли он их решить.
Непритязательный вид и линейное представление Web-страниц - у текстового Web-дизайна. Мы можем расположить контейнеры на Web-странице практически как угодно и поместить в них произвольное содержимое: текст, таблицы, изображения, аудио- и видеоролики и даже другие контейнеры. А CSS позволит нам задать для них практически любое представление.
- "Монолитность" Web-страниц - у текстового и табличного Web-дизайна. Современные Web-обозреватели позволяют с помощью специально созданного поведения загрузить в контейнер Web-страницу, сохраненную в отдельном файле, т. е. организовать подгружаемое содержимое. Мы займемся этим в главе 18.
- "Нестандартность" фреймов - у фреймового Web-дизайна. Контейнеры и соответствующие теги официально стандартизированы комитетом W3C и обрабатываются всеми Web-обозревателями одинаково.
Громоздкость HTML-кода - у табличного Web-дизайна. HTML-код, формирующий контейнеры, исключительно компактен. Как мы уже знаем, блочный контейнер формируется всего одним парным тегом
.
Медленная загрузка Web-страниц - у табличного Web-дизайна. Все Web-обозреватели отображают содержимое контейнеров прямо в процессе загрузки, так что Web-страницы визуально загружаются очень быстро.
И что, контейнерный Web-дизайн так хорош? И он совсем не имеет недостатков? Увы, ничего совершенного в мире нет...
Проигрывает табличному в возможности реализации сложного дизайна Web-страниц. Таблица позволяет создать на Web-странице множество колонок разной ширины, содержащих разное содержимое. Чтобы сделать это с помощью контейнеров, скорее всего, придется применять вложенные друг в друга контейнеры, сложные стили и, возможно, поведение, которое уже после окончания загрузки Web-страницы располагает контейнеры в нужных местах. Это, пожалуй, единственный недостаток контейнерного Web-дизайна.
Что ж, с контейнерным Web-дизайном все в основном ясно. Давайте попрактикуемся. Переделаем наши Web-страницы с применением контейнерного Web-дизайна - "легкого", простого, современного.
Представление для нашего Web-сайта
Сначала разработаем схему расположения на Web-страницах соответствующих контейнеров. Лучше всего нарисовать ее на бумаге или в программе графического редактора.
Классическая схема
контейнерного
Web-дизайна
(и не только контейнерного) показана на рис. 10.1. Как видим, в самом верху располагается заголовок Web-сайта, ниже него в одну линию по горизонтали выстроились полоса навигации и основное содержимое, а под ними пристроились сведения об авторских правах. Давайте используем именно эту схему.
Откроем в Блокноте Web-страницу index.htm. Найдем в ее HTML-коде четыре важных фрагмента любой Web-страницы: заголовок Web-сайта, полосу навигации, ос
новное содержимое и сведения об авторских правах. Поместим их в блочные контейнеры
.
На рис. 10.1 показано, что заголовок Web-сайта предшествует полосе навигации, а не наоборот. Поэтому поменяем местами фрагменты HTML-кода, создающие эти контейнеры и их содержимое.
Впоследствии мы привяжем к созданным контейнерам стили, задающие их размеры и местоположение на Web-странице. Поскольку каждый из этих контейнеров присутствует на каждой Web-странице в единственном экземпляре, применим для этого именованные стили. Дадим им такие имена:
Cheader - стиль для контейнера с заголовком Web-сайта;
Cnav - стиль для контейнера с полосой навигации;
Cmain - стиль для контейнера с основным содержимым;
Ccopyright - стиль для контейнера со сведениями об авторских правах.
Здесь буква "c" обозначает "container" - контейнер. Так мы сразу поймем, что данные стили применяются именно к контейнерам.
Привязка именованного стиля к тегу выполняется путем указания имени этого стиля в качестве значения атрибута тега ID. Сделаем это для всех контейнеров.
В листинге 10.4 приведен фрагмент HTML-кода Web-страницы index.htm со всеми нужными исправлениями.
Сохраним Web-страницу index.htm и откроем ее в Web-обозревателе. Что-то изменилось по сравнению с тем, что было ранее? Ничего.
Выделяют две основные категории HTML-элементов, которые соответствуют типам их содержимого и поведению в структуре веб-страницы — блочные
и строчные элементы
. С помощью блочных элементов можно создавать структуру веб-страницы, строчные элементы используются для форматирования текстовых фрагментов (за исключением элементов и ).
Разделение элементов на блочные и строчные используется в спецификации HTML до версии 4.01. В HTML5 эти понятия заменены более сложным набором , согласно которым каждый HTML-элемент должен следовать правилам, определяющим, какой контент для него допустим.
Модель визуального форматирования CSS в деталях
1. Модель визуального форматирования
Модель визуального форматирования CSS представляет собой алгоритм, который обрабатывает HTML-документ и выводит его на экран устройства. Данная модель преобразует каждый элемент документа таким образом, что он генерирует ноль или более прямоугольных блоков в соответствии с блочной моделью CSS. Положение этих блоков на странице определяется следующими факторами:
- размером элемента (с учётом того, заданы они явно или нет);
- типом элемента (строчный или блочный);
- схемой позиционирования (нормальный поток, позиционированные или плавающие элементы);
- отношениями между элементами в DOM (родительский — дочерний элемент);
- внутренними размерами содержащихся изображений;
- внешней информацией (например, размеры окна браузера).
2. Определение термина «содержащий блок»
Положение и размер блока(ов) элемента иногда вычисляются относительно некоторого прямоугольника, называемого содержащим блоком
элемента (containing block). Содержащий блок элемента определяется следующим образом:
- Содержащий блок, в котором находится корневой элемент, представляет собой прямоугольник — так называемый начальный содержащий блок
.
- Для элементов с position: relative или position: static содержащий блок формируется краем области содержимого ближайшего родительского блока-контейнера.
- Для элемент с position: fixed содержащий блок определяется областью просмотра.
- Для элемента с position: absolute содержащий блок устанавливается ближайшим предком с заданным position: absolute/relative/fixed
3. Блочные элементы и блочные контейнеры
Блочные элементы
— элементы высшего уровня, которые форматируются визуально как блоки, располагаясь на странице в окне браузера вертикально. Значения свойства display , такие как block , list-item и table делают элементы блочными. Блочные элементы генерируют основной блок, который содержит только блок элемента. Элементы со значением display: list-item генерируют дополнительные блоки для маркеров, которые позиционируются относительно основного блока.
, ,
Подготовка
Многие браузеры на основе своих таблиц стилей присваивают значения по умолчанию многим элементам страницы. Поэтому перед тем как писать код, рекомендуется сбросить эти значения. Для этого в папке css создадим файл reset.css , а в html-документе добавим на него ссылку.
Код файла reset.css /* сброс значений по умолчанию*/ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } body { line-height: 1; } table { border-collapse: collapse; border-spacing: 0; }
Как прописано в стандартах и скучных учебниках, тег div
(division) разбивает документ на отдельные части, разделы. Вот так вот скупо, тоска.... Видимо это писалось еще во времена тотальной табличной верстки, когда он был не очень популярен - как-то без него обходились.
А выглядит он вот так:
Контейнер div
На примере этого тега, о котором, в общем-то писать действительно нечего, кроме того, что это блочный элемент, как параграф или загловок, мы рассмотрим наиболее важные концепции CSS. При использовании его с атрибутами class и id , тег div является основным строительным материалом для блочной верстки страниц в современном веб-дизайне.
Код HTML
Контейнер div
На примере... (текст)..
Ну еще можно добавить, что в него можно вложить все! Заголовки, параграфы, таблицы, формы, другие теги div
... вобщем все, или почти все. Дескриптор div
используется для группирования блочных элементов на основе их функционального назначения, логически связанных.
Наша задача сделать код более чистым и осмысленным, поэтому применение слишком большого количесва тегов div
в презентационных целях, признак того, что код плохо структурирован и чрезмерно усложнен.
На этом лирическое отступление заканчиваем и переходим к наверно САМОЙ СЕРЬЕЗНОЙ главе раздела HTML&CSS
Модель контейнеров
Область содержимого
Модель контейнеров управляет размещением и выводом элементов на странице. В рамках этой модели каждый элемент страницы рассматривается, как прямоугольный контейнер, обладающий определенными параметрами. У контейнера может быть содержимое (это то, что мы в него положили) или он может быть пустым. Дальше я буду все объяснять очень подробно! Это важно .
Эксперемент #1 Создадим 2 контейнера - один с текстом, другой пустой. Цвет фона для них сделаем #a55. /* Стили CSS */ .test_num1{ background-color:#a55; /* цвет фона */ }
СОДЕРЖИМОЕ. Текст.
Из полученного делаем выводы:
- Без указания каких либо параметров контейнер с содержимым имеет высоту, достаточную для вмещения содержимого, и занимает максимально возможную ширину (ширина родительского элемента)
- Пустой контейнер мы не видим вообще!!! Он просто "схлопнулся" по высоте. (в браузере IE6 - видим....)
width:80px; /* ширина*/ height:60px; /* высота*/ }
СОДЕРЖИМОЕ. Текст.
Выводы:
- Пустой контейнер с явно заданными размерами выводится нормально
- Первый сюрприз. Браузер IE6 отображают контейнеры по другому, нежели все остальные... Специально задав недостаточную ширину, ожидалось, что содержимое выйдет за пределы блока. Так оно и случилось во всех браузерах, кроме IE6, который проигнорировал заданное значение width и увеличил ширину блока до размеров содержимого. Со свойством height то же самое, увеличивает размер контейнера по вертикали. Привыкайте.
- Обещаная подсказка (*) : Если вы сейча отключите объявление DOCTYPE, то сможете увидеть, что все версии браузеров IE увеличивают ширину контейнера и увеличат высоту, если текста будет больше (Opera, кстати, тоже увеличит высоту)
- При необходимости, когда ширины контейнера не хватает, текст переносится на следующую строку по пробелу.
- Свойсто CSS overflow , отвечает за способы отображения содержимого, если оно не вмещается. Что это такое - посмотрите, пожалуйста, в справочнике. Поэксперементируйте, добавляя разные значения свойства overflow в класс test_num2 , и посмотрите, что из этого получится
Отступы и рамки
В соответствии справилами CSS, свойства width и height устанавливают размер не контейнера, а области содержимого. По сути, мы имее дело с ЧЕТЫРЬМЯ(!) контейнерами, где содержимое является так называемым "ядром" (core content area) и помещается еще в 3 контейнера. Каждый из них имеет параметр, соответствующий значению одноименного свойства CSS (ни одно из этих свойств не является обязательным). В разных источниках используются разные термины для описания этих свойств. Схематически модель контейнеров можно представить так.
margin: 20px
border: 10px
padding: 30px
padding - внутренний отступ, или внутренняя полоска, или подложка. Обрамляет содержимое, отделяя его от границ контейнера. Заливается цветом фона вместе с содержимым.
border - рамка. Имеет цвет, толщину и стиль используемых линий. Чаще используются в декоративных целях.
margin
- внешний отступ, или внешняя полоска, или поле. Прозрачная полоска за пределами рамки. Используется для задания промежутков между элементами страницы.
Добавление padding
, border
и margin
не изменяет размеры области содержимого, но изменяет общий размер контейнера.
Вычисляем ширину контейнера:
width + 2 *(padding + border + margin) = 40+2*(30+10+20) = 160px
Высота вычисляется аналогично (height
вместо width
) и, в нашем случае, равна ширине.
А теперь простыми словами и более подробно
Свойства padding и border
Внутренний отступ нужен для того, чтобы содержимое не прижималось к внутренней границе контейнера. В качестве содержимого может быть параграф (текст), рисунок или любой другой элемент.
Рассмотрим пример:
Создаем контейнер div
с заданой шириной, внутренним отступом и рамкой. В качестве содержимого вставляем параграф, тоже с рамкой и внутренним отступом. Применяем фон к параграфу, отличный от фона контейнера div
, чтобы визуально видеть внутреннюю полоску.
Вычисляем общую …
Вычисляем общую ширину контейнера на основании имеющихся занчений свойств.
Так как высота не задана явно, она будет увеличиваться по мере заполнения контейнера содержимым.
Общая ширина контейнера = ширина содержимого +
отступ справа +отступ слева + толщина рамки*2
Размеры для параграфа можно во внимание не принимать, т.к. ширина его содержимого не задана явно. Следовательно, его размеры зададутся автоматически, чтобы вместить содержимое в отведенное для него пространство. Они не окажут влияния на общую ширину содержащего контейнера.
520+10+30+4*2 = 568px
Создаем еще один контейнер без внутренних отступов, чтобы он соответствовал по ширине первому. При этом для него тоже создаем рамку.
Так как внутренних отступов нет,
Общая ширина контейнера = ширина содержимого + толщина рамки*2
Width= 568- 1*2 = 566px
Где 568 – ширина первого контейнера, а 1 – толщина рамки нашего контейнера.
/* используем тот же класс ?! … */ div.smplBox{ width:520px ; /* ширина области содержимого*/ padding: 5px 10px 20px 30px; /* подложка: сверху-справа-снизу-слева */ border: 4px solid #565; /* рамка – толщина сплошная цвет */ background: #ddd; /* цвет фона*/ } /* переопределяющий класс для второго контейнера */ div.smplBox-reset{ width:566px ; /* ширина области содержимого (568-2) с запасом для рамки*/ padding: 0; /* подложка: обнуляем */ border-width: 1px; /* толщина рамки – переопределяем толщину */ } /* обнуляем свойства для параграфа p */ div.smplBox-reset p{ padding: 0; border: 0; }Вычисляем общую …
Повидимому, здесь необходимо сделать некоторые пояснения:
Значения некоторых свойств для 1-го и 2-го контейнеров совпадают, например цвет фона, стиль и цвет рамки. Поэтому мы можем воспользоваться этим классом, а потом ПЕРЕОПРЕДЕЛИТЬ (!) несовпадающие свойства. Этот прием достаточно часто используется веб-дизайнерами.
Фишка в том - как мы его переопределили. Оказывается, к одному селектору можно применять несколько классов, указывая их для атрибута class
через пробел! Причем, если в этих классах есть одинаковые свойства, то последнее переопределяет предыдущие. Соответственно, для контекстного селектора p
действуют те же правила.
И еще, мы не стали переопределять полностью свойство border
, а сделали это только для значения толщины рамки, использовав для этого свойство border-width
.
Свойство margin
Как уже говорилось, свойство margin
позволяет задать поля вокруг элемента, которые обеспечивают отступ от соседних элементов и границ родительского блока.
Создадим 2 блока одинакового размера, расположенных друг над другом и зададим им разные значения полей:
margin: 30px 20px;
Поля первого блока:
верхнее, нижнее - 30px
правое, левое - 20px
Ширина и высота блока, а так же рамка в данном примере значения не имеют.
Второй блок окружен полями - 50px;
Все достаточно просто, визуально разница в отступе от левого края хорошо заметна. Интерес представляет расстояние между блоками...
Логично было бы предположить, что расстояние между блоками, нижнее поле одного из которых равно 30px, а верхнее поле другого 50px, будет равно сумме этих полей, т.е. 80px. Но это не так. Смежные вертикальные полоски сливаются, принимая ширину большей из них. В нашем случае зазор между блоками будет 50px. Это очень полезное правило, позволяющее убирать не нужные вертикальные зазоры между абзацами, например. По горизонтали поля не сливаются.
Сейчас мы более подробно остановимся на этом очень важном для понимания моменте - слияние внешних полосок.
Html-код со встроенными стилями
Cлияние смежных вертикальных полей родительского и дочернего элементов.
Cлияние смежных вертикальных полей родительского и дочернего элементов.
Из вышепреведенного примера видно, что нижнее поле блока div
, равное 15px, и верхнее поле блока p
- 20px, "схлопнулись" и дали результирующее поле размером 20px. При этом горизонтальные поля остались на месте. (в браузере IE6 - нет...)
А теперь, если родительскому блоку div
добавить рамку border:1px solid #111
, или внутренний отступ padding:5px
, верхнее и нижнее поля вернутся на место! (проверьте самостоятельно)
Вывод: Слияние смежных вертикальных полей дочернего и родительского блоков просисходит, если у родителя нет рамки или внутреннего отступа (т.е. ничто не разделяет их внешние поля). Как видите, рамка иногда имеет не только декоративное значение .
Так же сливаются верхние и нижние вертикальные поля пустого элемента, а если пустых элементов несколько и они расположены друг над другом, то все их верикальные внешние полоски сольются в одну!
margin: 0px 20px;
Для свойства margin
можно задавать ОТРИЦАТЕЛЬНЫЕ значения. Их можно использовать для наслоения элементов друг на друга. Для второго блока мы задали поля 50px, а потом переопределили значение для верхнего поля
-30px;
. Еще отрицательные значения иногда используют для сокрытия элемента. Задав достаточно большой отрицательный отступ, например -2000px, мы смещаем элемент за пределы страницы, т.е. делаем его невидимым. Попробуйте самостоятельно.
Не увлекайтесь переопледелением свойств, можно запутаться. В этой главе я часто переопределял их чисто в показательных целях.
Если не хотите, чтобы поля "схлопывались" - задавайте рамки, совпадающие по цвету с фоном, при этом не забывая, что увеличиваете размер блока на удвоенную ширину рамки. Есть еще способы, но о них позже.
Старайтесь не задавать без необходимости свойство padding элементам с явно указанными размерами. Лучше применить его к родительскому или дочернему блоку
Установите, пожалуйста, на свой компьютер второй браузер (Opera, Mozilla, Safari, GoogleChrome,IE6-8). Один из них должен быть IE!
О кроссбраузерности мы будем говорить позже, а пока хотя бы фиксируйте для себя различия в поведении браузеров. По этой ссылке вы можете скачать IETester
Блохи и грабли
- Грабли, говорите.... Да они пофсюду!!!
- Если что-то не идет, хотя должно по идее... - внимательно проверьте, а еще лучше просто скопируйте по-новой объявление DOCTYPE
- К сожалению браузеры IE5 и IE6 считают размеры контейнера по своему. Они считают свойство width равным сумме области содержимого и отступов, как внеш. так и внутренних.
- Наибольшее количество проблем возникает в браузерах Internet Explorer, для которых иногда приходится писать параллельный код CSS. Уже скоро:)
Плавающие элементы. Свойство FLOAT
Создано 28.08.2010
Понимание этой, достаточно не простой концепции, поможет нам …. в общем, если вы хотите чтобы элементы на странице вели себя предсказуемо …. Блин! Как же написать-то???
Итак: что плавает, как плавает и зачем плавает.
Плавают элементы, определенные тегами, для которых задано свойство float
.
Float: left | right | none; /* Прим. если значение none - то элемент не плавающий */
В зависимости от значения, элемент прижимается соответствующей стороной (внешней кромкой) к внутренней кромке родительского элемента или к другому плавающему элементу. Строчные контейнеры (следующее за нашим тегом) будут обтекать плавающий контейнер с противоположной стороны и снизу.
Для примера берем рисунок и 2 параграфа с текстом. Помещаем все это в контейнер div . Контейнеру задаем рамку, для наглядности. Задаем для рисунка обтекание слева…. Не однозначный момент.…
Слева – это не значит, что содержимое будет обтекать наш рисунок слева, наоборот – справа! Иными словами, рисунок будет слева по отношению к последующему содержимому. Уф.… Как сложно иногда бывает описывать простые вещи. Вот так это выглядит.
А вот так это записывается: /*** код css ***/ .test-float { border:1px solid yellow; /* рамка контейнера (для наглядности)*/ } .test-float img { float:left; /* обтекание слева */ height:120px; /* высота рисунка */ margin:4px; /* внешние отступы со всех сторон */ }
первый параграф
второй параграф
Прежде, чем мы начнем подробно рассматривать чудеса, связанные с плавающими элементами, необходимо выяснить, как можно прекратить все это безобразие, т.е. прекратить обтекание. Для этого используется свойство clear – очистка.
Clear: both | left | right;
Соответственно отменяет обтекание: любое | слева | справа (в подавляющем большинстве случаев применяется значение both ). Ага, забыл ответить на свой же вопрос – "зачем плавает".
Все блочные элементы, вне зависимости от размеров, в потоке содержимого начинаются с новой строки, после чего поток возобновляется опять с новой строки. Иными словами, блоки располагаются друг под другом. Применение свойства float позволяет располагать блоки горизонтально, рядом друг с другом (элемент с заданным значением float автоматически становится блочным), что дает нам большие возможности при макетировании страницы. При этом плавающие элементы удаляются из общего потока и остальные блочные контейнеры ведут себя так, как будто плавающих элементов не существует.
Так вот, свойство clear
позволяет отменить обтекание. Для чего нам его отменять? Представьте себе, что в предыдущем примере у нас не 2 абзаца обтекают рисунок, а 1 абзац и 1 нумерованный список, причем список достаточно длинный. И если часть списка начнет обтекать рисунок снизу, а не с боку, то выглядеть это будет достаточно противно…. Представили? Поэтому лучше после первого параграфа очистить плавающие элементы, чтобы последующее содержимое начиналось ниже рисунка.
В нашем примере нужно просто очистить второй параграф, для этого добавим класс clear
в нашу таблицу css, а потом укажем этот класс в качестве атрибута второго параграфа.
Clear {clear: both;} /*---------------------*/ .......
второй параграф
Это всего лишь одна, причем не самая важная, причина, по которой мы применяем очистку. По большому счету в данном случае можно было обойтись и без очистки, просто задав для второго параграфа (или любого другого элемента на его месте) значение margin-top , достаточное для того, чтобы вытеснить параграф ниже рисунка.
Главная причина в том, что плавающий элемент оказывает влияние на все последующие элементы страницы, что при определенных условиях может вызвать непредсказуемые последствия. В одном из примеров (*) мы вернемся к этому.
В следующей серии примеров мы попытаемся более глубоко разобаться в поведении плавающих элементов.
Сначала создадим несколько стилевых классов для работы с контейнерами.
Пример 1
Три плавающих блока разной высоты. Поэтому значения высоты задаем непосредственно в атрибутах тегов.
Пример 2
К двум блокам добавляем через пробел второй класс:
class="float-box
test-box1
"
тем самым переопределяя значение свойства float
и width
. Все три блока заключены в контейнер-оболочку
Блоки div#2 и div#3 делаем обычными, они тут же перестают видеть блок div#1, которого нет в общем потоке, и спокойно занимают его место. Происходит наслоение контейнеров. (В браузере IE7 и ниже - все друг друга видят и никто ничье место не занимает.... Вот так)
Пример 3
Опять все три блока плавающие. Заключены в контейнер-оболочку. Увеличиваем ширину блока div#3.
div#3 - не поместился по горизонтали и был перенесен вниз. Но "зацепился" за div#1 (мы специально сделали контейнеры разной высоты) и пристыковался к его левой кромке. Вот, кстати, подходящий пример (*) того, как изменение размера плавающего элемента может разрушить страницу.
Если внимательно сравнить последний пример с предыдущим, то можно заметить, что расстояние по вертикали между блоками div#2 и div#3 разное. В прошлый раз мы сделали эти блоки обычными и, как мы помним из модели контейнеров, их внешние поля слились. У плавающих элементов слияния внешних полосок НЕ ПРОИСХОДИТ! Таким образом зазор по вертикали стал равен margin-bottom + margin-top , а не большему из них, как в обычной жизни... Не стоит про это забывать.
Ну и еще один сюрприз. Контейнер-обертка схлопнулся (горизонтальная черта над блоками - слившиеся верхняя и нижняя линии рамки), т.к. все содержащиеся в нем блоки плавающие, а значит их нет в общем потоке и отношение к ним соответствующее - как к пустому месту (опять же браузеры IE7 и ниже живут по своим законам...). Что делать?
Есть 3 варианта решения этой проблемы.
- Сделать содержащий контейнер-обертку тоже плавающим, задав для него свойство float . Тогда он будет относится к вложенным блокам как к "своим"
- Установить контейнеру-обертке для свойства overflow значение hidden . Это трюк. И, как большинство трюков, в некоторых ситуациях имеет побочные эффекты, о которых мы поговорим в главе "Позиционирование"
- Очистка с помощью свойства clear . Для этого должен быть элемент, которому это свойство можно было бы присвоить, например параграф p или блок div , в конце концов просто горизонтальная линия hr
По возможности старайтесь явно задавать ширину плавающих контейреров. В отличии от обычных блоков, которые пытаются занять всю доступную им ширину, плавающие элементы скромно устанавливают ширину достаточную, для вмещения содержимого. Поэтому при изменении содержимого будет меняться размер контейнера. Оно нам надо?
Плавающие элементы значительно усложняют разметку страницы, поэтому не стоит этим злоупотреблять.
Часто проблема заключается в том, что нам негде разместить свойство clear . С этой целью иногда даже создаются пустые элементы, исключительно с целью очистки. Создание пустых элементов - может оказаться не самым безобидным занятием... В этом плане неожиданно полезным может оказаться невзрачный тег br . Не занимая лишнего места с его помощью можно очистить обтекание.
Clear {clear: both;}
Блохи и грабли
- Вечная проблема - сползание блоков, которым надлежит распологаться горизонтально, вниз. Почему? Суммарный размер ширины блоков + отступы + рамки превышает ширину содержащего блока или страницы
- Браузер IE6 это отдельная, долгая и безумно печальная история (IE7 тоже, кстати, при благоприятных условиях может запросто разрушить вашу страницу). Пока мы на этом подробно останавливаться не будем
Позиционирование
Создано 02.09.2010
Мы рассмотрели две важных концепции модели визуального форматирования: модель контейнеров и плавающие элементы. Третий "краеугольный камень" верстки страниц на основе таблиц CSS - позиционирование.
В этой главе, как и в двух предыдущих, мы говорим о блочных элементах
. Остановимся на этом подробнее.
Блочные и строчные контейнеры
Строчные контейнеры (span, strong, i и другие..) выводятся в строке горизонтально. Блочные контейнеры (p, h1, div ... ) выводятся вертикально один над другим, если значение свойства float не определяет их как плавающие. Деление элементов на блочные и строчные достаточно условно, потому что задав определенное значение свойству элемента display , мы можем изменить тип генерируемого контейнера и переопределить элемент как:
- блочный - {display: block;}
- строчный - {display: inline;}
- ни контейнер ни его содержимое не выводится и не занимает места на странице - {display: none;}
- другие значения свойства смотрите в справочнике...
По умолчанию браузер выводит элементы документа последовательно, единым потоком. Изменить порядок следования мы можем с помощью свойства position (по умолчанию имеет значение static ).
Относительное позиционирование
Относительное позиционирование заключается в смещении элемента в потоке, относительно его начального положения.
div#2
position: relative;
margin-top: -30px;
margin-left: 30px;
Позиция элемента вычисляется с помощью свойств top, bottom, left, right .
Относительное позиционирование. CSS /* отсчет относительно изначальной позиции ! */ position: relative; left: 50px; top: 20px;
Абсолютное позиционирование
Если при относительном позиционировании элемент оставался в нормальном потоке, то при абсолютном он извлекается из нормального потока, не занимает в нем места и остальные элементы ведут себя так, как будто абсолютно-позиционированного элемента не существует. Этим он напоминает плавающий элемент.
Контейнер, свойству position которого присвоено значение absolute , смещается вверх и занимает верхний левый угол ближайшего позиционированного элемента, у которого position: absolute | relative .
(Кстати это важный момент. Если вы поместили абсолютно позиционированный блок в не позиционированный контейнер, то ваш блок из контейнера убежит... , если только он не находится в верхнем левом углу страницы. Вот так!)
Если такого не находится, то в качестве контейнера используется страница. Остальные элементы сдвигаются вверх, занимая освободившееся место.
Позиция вычисляется с помощью тех же свойств, что и при относительном позиционировании.
Абсолютное позиционирование. CSS /* отсчет относительно соответствующего угла позиционированного родительского контейнера ! */ position: absolute; right: 10px; top: 10px;
Можно сверстать страницу исключительно из абсолютно позиционированных элементов! И все бы хорошо, если бы не необходимость явно задать ВСЕ размеры. Иначе при увеличении размеров шрифта, или добавлении текста, в общем изменении размера контейнера, блоки будут наслаиваться и страница, вероятно, разрушится.
Ну и совсем немного про фиксированное позиционирование , даже не будем выводить отдельной темой.
Фиксированное позиционирование. CSS /* отсчет относительно соответствующего угла экрана */ position: fixed; left: 0px; bottom: 200px;
Это абсолютное позиционирование, с той разницей, что позиция фиксируется относительно экрана . Зафиксированный элемент как-бы плавает в одном и том же месте экрана (как пример - логотип этого сайта), не смотря на прокрутку страницы. Браузер IE6 не поддерживает фиксированное позиционирование.
Если при относительном позиционировании не задавать значения позиции, то такой контейнер ничем не будет отличаться от обычного. Этим можно пользоваться, чтобы в дальнейшем, в случае необходимости, можно было сместить элемент с помощью свойств позиционирования, а не отступов. Или разместить внутри абсолютно позиционированный элемент.
При наслоении контейнеров на переднем плане находится тот контейнер, у которого больше z-index. Свойство может принимать в качестве значений любые целые числа (в том числе отрицательные). Если известно, что элемент всегда должен находиться на поверхности, лучше задать значение побольше, с запасом, например: z-index: 2000;
Блохи и грабли
- Помните плавающие элементы? Чтобы предотвратить схлопывание содержащего контейнера, мы тогда задавали для него свойство overflow: hidden , и упоминали о возможных побочных эффектах. Так вот, если с помощью задания соответствующей позиции мы сместим какой либо блок (его часть) за границы содержащего контейнера, то "выступающую часть" просто обрежет .
- При абсолютном позиционировании в браузере IE6 родительскому элементу нужно явно задавать размеры, иначе блок будет позиционирован относительно страницы... Косяк браузера
- Часто забывают, что родительский элемент должен быть явно позиционирован! (при абс.поз.)
Практикум
Создано 19.10.2010
Подготовка
Создаем папку practicum
(корневой каталог), внутри нее создаем папку css
.
- В корневом каталоге создаем документ practicum1.html
- В папку css
создаем файл practicum_css
.css
- В начало документа вставляем объявление DOCTYPE
(пока просто вставляем, более подробно мы разберем его позже)
- Структурируем документ, определяя основные теги: html, head, body
- Пишем что-нибудь внятное в теге title
, а в разделе head
ссылаемся на нашу таблицу стилей в папке css
Чтобы протестировать документ и правильность подключения таблицы стилей, задаем для тега body цвет фона #ccc , вставляем в документ параграф с произвольным текстом и обновляем документ. Все.
Постановка задачи
С относительным позиционированием мы уже разобрались. Все было достаточно просто и понятно. Гораздо интереснее - как я это "нарисовал"... Похоже относительным позиционированием здесь дело не обошлось....
Да, все не так просто, хотя, в общем то, и не очень сложно. Верстаем макет, изображенный на иллюстрации. Поэтапно, подробно, внимательно. Иногда, в экспериментальных целях, наступем на грабли.
1-й этап
Родительский контейнер
/* задаем ширину и рамку */ #wrapper{ width:610px; border:1px solid yellow; }Не очень красиво, когда блоки прикасаются к внешнему контейнеру, поэтому стоит задать отступы. И сразу вопрос: что использовать, padding для родительского блока или margin для внутренних? При явно заданных размерах родителя, предпочтительнее, наверное, будет использовать второй вариант, потому что иначе размер родительского блока увеличится на величину соответствующих внутренних отступов. К тому же мы все равно будем использовать margin для зазоров между блоками.
Удобнее сначала для всех блоков задать общие свойства, а уже потом, при необходимости, для групп элементов или в индивидуальном порядке какие-то из них переопределить. Например, для всех блоков задать внешний отступ справа и сверху, и затем только для первого определить отступ слева, чтобы он не прижимался к содержащему контейнеру.
Для параграфов задаем внутренние отступы и очищаем элементы от обтекания. Для блоков у нас задано обтекание слева, поэтому давайте применим очистку слева: clear: left
. Для чего - станет понятно чуть позже.
параграф 1
/* Общие свойства. Потом переопределим. */ #wrapper div{ border:1px solid red; margin:2px 10px 0 0; background-color:#484f6c; float:left; width:100px; height:100px; } #wrapper p{ padding:2px; clear:left; }Параграф 1
2-й этап
Правый блока (5) . Увеличиваем высоту, убираем фон и прижимаем к правому краю. Для этого создаем идентификатор #rightBox . Если мы просто пропишем в таблице css идентификатор #rightBox и применим его к правому блоку, то с удивлением обнаружим, что ничего не изменилось! Типичная ошибка, связаная со специфичностью. Дело в том, что к блоку применимы сразу два стилевых правила: #wrapper div и #rightBox . Первое из них более специфично, т.к. использует контекстный селектор. Чтобы все-таки переопределить первое правило, записываем идентификатор применительно к элементу div, выглядеть это будет вот так: div#rightBox . Теперь правила имеют одинаковую специфичность и применено будет то, которое записано последним. Если в результате перестановки правил в таблице стилей нужное нам правило окажется ближе к началу страницы, то оно опять не сработает.... Чтобы наше правило было определяющим, вне зависимости раньше или позже оно прописано в таблице, нужно сделать его более специфичным, например записывать так:
/* правый блок (5) */ #wrapper div#rightBox{ background:transparent; float:right; height:180px; width:137px; }Параграф 1
Параграф 2
Второй блок (2) . Убираем фон, рамку делаем пунктирной. Класс - #old_position
/* второй блок (2) */ #wrapper div.old_position{ background:transparent; border-style:dashed; }Четвертый блок (4)
. Устанавливаем относительное позиционирование. Смещаем вниз-влево. Идентификатор - #test_box
. Вопрос - на сколько нужно сместить блок (4) влево (от начальной позиции), чтобы имитировать сдвиг блока (2) вправо на 50px?
Расчет.
Сначала вычислим расстояние от левого края блока (4):
отступ слева + 3 блока с правым отступом и удвоенной рамкой
2 + 3 * (100 + 10 + 2)= 338px
Потом вычислим положение сдвинутого вправо псевдоблока (2):
отступ слева + 1 блок с правым отступом и удвоенной рамкой + псевдосдвиг
2 + (100 + 10 + 2) + 50 = 164px
В результате получаем реальный сдвиг:
338 - 164 = 174px
#wrapper #test_box{ position:relative; right:174px; top:30px; }
Параграфы
. Почему на 1-ом этапе мы задали для параграфов clear:left
? Потому что нам нужно, чтобы они обтекали только правый блок (5). Можете поэкспериментировать: уберите очистку и сделайте ширину блоков меньшего размера. Текст параграфа "устремится" в образовавшийся зазор между блоками (4) и (5). Насчет блока (4): мы помним, что хоть визуально он и смещен, но продолжает занимать первоначальную позицию в потоке.
Второй параграф очищаем полностью и отменяем обтекание. Иногда, чтобы не создавать специально идентификатор или класс, проще прописать правило непосредственно в документе, в атрибуте соответствующего тега.
Параграф 1
Параграф 2
3-й этап
Рисуем указатели величины сдвига
. Для этого помещаем внутри блока (2) еще один блок с таким же атрибутом class="old_position"
. Чем повторять те же свойства в еще одном классе, правильнее применить уже существующий класс, а потом, путем добавлением к атрибуту нового класса или идентификатора, добавить недостающие свойства и переопределить имеющиеся. Еще раз напомню, что если мы планируем использовать какой-либо набор свойств многократно, то их нужно оформлять как класс, если однократно, то лучше как идентификатор.
Переопределять свойства будем в идентификаторе #pointer
. Переопределяем цвет рамки, убираем верхнюю и левую рамку и добавляем размеры блока (вернее тоже переопределяем, но те, которые были установлены еще во #wrapper div
)
left:50px top:30px
Параграф 1
Параграф 2
Параграф 1
Параграф 2
Надписи, указывающие величину сдвига
. Размещаем их внутри блока #pointer
, применяем абсолютное позиционирование и смещаем в заданную позицию уже снаружи (за счет величины сдвига, превышающей размеры родителя, который никак на это не реагирует, потому что не видит абсолютно позиционированные элементы). Надписи заключаем в теги span
, в качестве атрибута которых указываем класс caption
. Мы помним, что плавающий или абсолютно позиционированный строчный тег автоматически становится блочным! Почему в данном случае удобнее применить тег span
, а не div
. Этим мы избавляем себя от необходимости переопределять ранее установленные для тегов div
свойства, такие как рамка, фон и пр....
Если мы сейчас проверим, что у нас получилось, то, увы, не найдем своих надписей. Почему? Абсобютно позиционированные элементы находятся в не позиционированном родительском блоке! Значит они будут смещены относительно верхнего левого угла страницы. Вот там их и ищите.
Устанвливаем для родителя position:relative
.
Два блока внутри блока (5) . Здесь совсем просто. Для определения стилевых правил используем конструкцию #rightBox div . Отменяем обтекание, устанавливаем размеры и отступы. Индивидуальные правила для каждого блока задаем прямо в атрибутах тегов.
/* внутри блока (5) */ #rightBox div{ width:50px; height:30px; float:none; margin:5px; }4-й этап
Вставляем текст параграфов и названий блоков. В правом блоке (5) уменьшаем размер шрифта, а в блоках #4.1 и #4.2 выравниваем текст по правому краю.
/* добавляем размер шрифта, выравнивание текста */ #rightBox div{ ... font-size:75%; text-align:right; } #rightBox p{ font-size:75%; }
left:50px top:30px
Параграф под блоком, смещенным за счет внешнего отступа:
margin-top: -30px;
margin-left: 30px;
При этом элемент продолжает занимать исходный участок страницы, не смотря на визуальное смещение (освободившееся место никто не занимает).
Cравнивая с блоками #4.1 и #4.2, размещенными справа, где блок #4.2 смещен вверх за счет отрицательного внешнего отступа, видим, что во втором случае элемент реально смещается, освобождая пространство для следующего за ним параграфа
Последние штрихи. Прозрачность
. Иногда в презентационных целях можно тот или иной элемент сделать полупрозрачным. Регулировать прозрачность можно, используется свойство opacity
, которому присваивается значение от 0 до 1 (1-не прозрачно). В браузерах IE свойство opacity
не работает, и для этих же целей используется свойство filter
, которому значение прозрачности присваивается следующим хитрым способом:
filter:alfa(opacity=80)
, соотвестственно, от 0 до 100
Какой же способ применить нам? Оба. В CSS браузер игнорирует код, который не понимает, поэтому во всех браузерах, кроме IE, будет проигнорировано свойство filter , а в IE наоборот - opacity
/* добавляем прозрачность */ #wrapper #test_box{ ... opacity:0.8; filter:alpha(opacity=80); /** для браузеров IE **/ }Порядок наложения
позиционированных элементов друг на друга определяет z-index
. Чем больше z-index
(целые числа), тем выше элемент по оси Z. Отрицательные числа применять можно, но не желательно... не все браузеры любят...
Чтобы блок #4.1 был сверху, нужно присвоить ему больший z-index
(по умолчанию - auto, т.е. последующие выводятся выше, чем предыдущие). Чтобы наложившийся блок не закрывал текст, делаем выравнивание по правому краю. Уменьшаем размер шрифта.
Оптимизация
В окончательном варианте документ будет выглядеть так:
Параграф под блоком, смещенным за счет внешнего отступа: margin-top: -30px; margin-left: 30px;
При этом элемент продолжает занимать исходный участок страницы, не смотря на визуальное смещение (освободившееся место никто не занимает).
Cравнивая с блоками #4.1 и #4.2, размещенными справа, где блок #4.2 смещен вверх за счет отрицательного внешнего отступа, видим, что во втором случае элемент реально смещается, освобождая пространство для следующего за ним параграфа
Оптимизируем код CSS
. В частности, когда многие элементы имеют относительное позиционирование, проще сделать это свойстов общим для всех, а потом, при необходимости, переопределить для отдельных.
В другом случае можно использовать множественные селекторы, например для группы селекторов - размер шрифта.
Прозрачность наследуется. Если элемент сделан полупрозрачным, то все дочерние элементы и текст тоже будут полупрозрачными. И вы не сможете сделать их непрозрачными, переопределив значение свойства.
Добиться определенного результата можно разными способами. Рассмотренный выше пример продемонстрировал всего лишь один из этих способов.
Классы и специфичность. С одной стороны, мы стараемся не плодить классы и идентификаторы, а за счет использования контекстных селекторов обходиться существующими. С другой, при большом уровне вложенности элементов (по принципу "матрешки"), специфичность может сильно усложнить стилевые правила и тем самым снизить читабельность кода. Нужно находить разумный компромисс. В нашем случае конструкцию #wrapper div вполне можно было бы заменить классом .className , указав его в атрибуте каждого блока (1) - (5), с последующим переопределением. Или вообще, вполне оправдано определить для каждого блока свой идентификатор, а общие значения свойств задать с помощью правила, использующего множественные селекторы.
Вы можете попробовать сделать это самостоятельно. Экспериментируйте.
В этой лекции рассказывается об элементах разметки тела HTML-документа, подробно разбирается их типизация, назначение и применение.
Теги тела документа
Теги тела документа предназначены для управления отображением информации в программе интерфейса пользователя. Они описывают гипертекстовую структуру базы данных при помощи встроенных в текст контекстных гипертекстовых ссылок. Тело документа состоит из:
- иерархических контейнеров и заставок;
- заголовков (от Н1 до Н6);
- блоков (параграфы, списки, формы, таблицы, картинки и т.п.);
- горизонтальных отчеркиваний и адресов;
- текста, разбитого на области действия стилей (подчеркивание, выделение, курсив);
- математических описаний, графики и гипертекстовых ссылок.
Тело документа – контейнер ВОDY
Описание тегов тела документа следует начать с тега ВОDY. В отличие от тега НEАD, тег ВОDY имеет атрибуты.
Атрибут BАСКGROUND определяет фон, на котором отображается текст документа. Так, если источником для фона HTML- документа является графический файл image.gif, то в открывающем теге тела BODY появляется соответствующий атрибут:
<ВОDY ВАСКGROUND="image.gif">
Как видно из этого примера, в качестве значения данного атрибута используется адрес в сокращенной форме URL. В данном случае это адрес локального файла. Следует заметить, что разные интерфейсы пользователя поддерживают различные дополнительные атрибуты для тега ВОDY.
В данной таблице строка #ХХХХХХ определяет цвет в терминах RGB в шестнадцатеричной нотации. Также имеется возможность задавать цвета по названию. Далее в таблице приведены названия цветов, определенные в стандарте HTML 4 и соответствующие им RGB-коды. Отметим, что многие современные браузеры выходят за рамки стандартов и поддерживают гораздо больше названий цветов.
Название | Код | Название | Код |
aqua | #00FFFF | navy | #000080 |
black | #000000 | olive | #808000 |
blue | #0000FF | purple | #800080 |
fuchsia | #FF00FF | red | #FF0000 |
gray | #808080 | silver | #C0C0C0 |
green | #008000 | teal | #008080 |
lime | #00FF00 | white | #FFFFFF |
maroon | #800000 | yellow | #FFFF00 |
Так, значения атрибутов в таблице 3.1 определяют цвет текста как синий, фона - белый, пройденные ссылки красные, а новые ссылки зеленые. Если в качестве атрибутов тега ВОDY указать
<ВОDY ВGCOLOR=#FFFFFF ТЕХТ=#0000FF VLINK=#FF0000 LINK=#00FF00>,
то цвет фона будет белым, текст будет синим, ссылки - зелеными, а пройденные ссылки станут красными. Однако пользоваться этими атрибутами следует крайне осторожно, так как у пользователя может оказаться другой интерфейс, который эти параметры не интерпретирует.
Microsoft Internet Explorer и Netscape Navigator допускают применение атрибутов LEFTMARGIN=n и ТОРМАRGIN=n в теге <ВОDY>. Атрибут LEFTMARGIN= задает левое поле для всей страницы. ТОРМАRGIN= определяет верхнее поле. Число n показывает ширину поля в пикселах. Например, тег <ВОDY LEFTMARGIN =»40″> создаст на всей странице левое поле шириной 40 пикселов. При n, равном 0, левое поле отсутствует.
Теги управления разметкой
Заголовки
Заголовок обозначает начало раздела документа. В стандарте определено 6 уровней заголовков: от Н1 до Н6. Текст, окруженный тегами <Н1>Н1>, получается большим - это основной заголовок. Если текст окружен тегами <Н2>Н2>, то он выглядит несколько меньше (подзаголовок); текст внутри <НЗ>НЗ> еще меньше и так далее до <Н6>Н6>. Некоторые программы позволяют использовать большее число заголовков, однако реально более трех уровней встречается редко, а более 5 - крайне редко.
Ниже на рисунке показан результат использования следующих заголовков:
Заголовок 1
Заголовок 2
Тег
Тег
Применяется для разделения текста на параграфы. В нем используются те же атрибуты, что и в заголовках.
Атрибут АLIGN
Атрибут АLIGN позволяет выровнять текст по левому или правому краю, по центру или ширине. По умолчанию текст выравнивается по левому краю. Данный атрибут применим также к графике и таблицам.
АLIGN=justify выравнивание по левому и правому краям. Реализовано не во всех программах интерпретации.
АLIGN=left выравнивание по левому краю. По умолчанию текст HTML выравнивается по левому краю и не выравнивается по правому, то есть начало строк находится на одном уровне по вертикали, а концы - на разных. Чаще всего, получающийся при этом текст с равными промежутками между словами выглядит лучше. Поскольку выравнивание по левому краю задается автоматически, атрибут АLIGN=left можно опустить.
АLIGN=right выравнивание по правому краю. Текст, выравненный по правому краю и не выравненный по левому - концы строк находятся на одном уровне, а начало на разных, - часто используется с целью создать оригинальный дизайн. Для этого задается атрибут АLIGN=right в обычных тегах, например в теге <Р>.
АLIGN=center центрирование текста и графики. Есть несколько способов отцентрировать текст или графику. В спецификациях HTML 3.0 предлагается пользоваться тегом <АLIGN=сеntеr>. Однако этот тег применим не ко всем объектам HTML-страницы, поэтому разработчики Netscape добавили тег <СЕNТЕR>, который центрирует любые объекты и поддерживается браузерами Netscape Navigator 3.0, Microsoft Explorer 3.0 и другими. К тегу <СЕNТЕR> нужно относиться с осторожностью. Какой-нибудь браузер может его вообще проигнорировать, и на странице окажется текст, выравненный по левому краю.
Обтекание графики текстом. С помощью атрибута ALIGN можно заставить текст «обтекать» графический объект. Для этого следует поместить тег туда, где должен быть графический объект, и добавить атрибут ALIGN=left, ALIGN=right или АLIGN=center. Кроме того, с помощью атрибутов НSPAСЕ и VSPАСЕ (они описаны ниже) задается ширина горизонтальных и вертикальных полей, отделяющих изображение от текста. Можно также создать рамку вокруг картинки или обрамление таблицы текстом. Чтобы текст не «обтекал» графику, а прерывался, необходимо применить тег
c атрибутом СLEAR.
Использование тега <ВR>
Принудительный перевод строки используется для того, чтобы нарушить стандартный порядок отображения текста. При обычном режиме интерпретации программа интерфейса пользователя отображает текст в рабочем окне, автоматически разбивая его на строки. В этом режиме концы строк текста игнорируются. Иногда для большей выразительности требуется начать печать с новой строки. Для этого и нужен тег ВR. Атрибут СLЕАR в теге <ВR> используется для того, чтобы остановить в указанной точке обтекание объекта текстом и затем продолжить текст в пустой области за объектом. Продолжающийся за объектом текст выравнивается в соответствии со значениями LEFT, RIGHT или АLL атрибута СLЕАR:
Текст будет продолжен, начиная
с ближайшего пустого левого поля.
Текст будет продолжен, начиная
с ближайшего пустого правого поля.
Текст будет продолжен, как
только и левое, и правое поля окажутся пустыми.
Элемент разметки
Тег
Теги управления отображением символов
Все эти теги можно разбить на два класса: теги, управляющие формой отображения (font style), и теги, характеризующие тип информации (information type). Часто внешне разные теги при отображении дают одинаковый результат. Это зависит главным образом от настроек интерпретирующей программы и вкусов пользователя.
Теги, управляющие формой отображения
Курсив, усиление, подчеркивание, верхний индекс, нижний индекс, шрифт большой, маленький, красный, синий, различные комбинации - все это делает страницы более интересными. Microsoft Internet Explorer и Netscape Navigator позволяют определить шрифт с помощью тега FONT. Теперь можно объединять на одной странице несколько видов шрифтов, вне зависимости от того, какой из них задан по умолчанию в браузере пользователя.
Теги <ВIG> и - изменение размеров шрифта
Текст, расположенный между тегами <ВIG>ВIG> или , будет, соответственно, больше или меньше стандартного.
Верхние и нижние индексы
С помощью тегов
Атрибут SIZЕ
Атрибут SIZЕ тега
Атрибут СОLОR
Если вы хотите сделать свою страницу более красочной, можете воспользоваться атрибутом СОLОR в теге FONТ, и тогда единственным ограничением будет цветовая палитра на компьютере пользователя.
Теги, управляющие формой отображения, приведены в таблице.
Тег | Значение |
… | Курсив (Italic) |
… | Усиление (Вold) |
… | Телетайп |
… | Подчеркивание |
Перечеркнутый текст | |
… | Увеличенный размер шрифта |
… | Уменьшенный размер шрифта |
… | Подстрочные символы |
… | Надстрочные символы |
<ЕМ>…ЕМ> | Типографское усиление |
<СIТЕ>…СIТЕ> | Цитирование |
… | Усиление |
<СODE>…СODE> | Отображает примеры кода (например, "коды программ") |
Последовательность литералов | |
<КВD>…КВD> | Пример ввода символов с клавиатуры |
… | Переменная |
… | Определение |
… |
Текст, заключенный в двойные кавычки |
Эти теги допускают вложенность, поэтому все они имеют тег начала и конца. При использовании таких тегов следует помнить, что их отображение зависит от настроек программы-интерфейса пользователя, которые могут и не совпадать с настройками программы-разработчика гипертекста.
Создание списков в HTML
Списки являются важным средством структурирования текста и применяются во всех языках разметки. В НТМL имеются следующие виды списков: ненумерованный список (неупорядоченный) (Unordered Lists
- ), нумерованный список (упорядоченный) (Ordered Lists
- ), чтобы сменить тип маркера в середине списка. После появления нового атрибута все последующие маркеры в списке будут иметь такой же вид.
Неупорядоченные списки - тег
Ненумерованный список. Ненумерованный список предназначен для создания текста типа:
- первый элемент списка;
- второй элемент списка;
- третий элемент списка.
Записывается данный список в виде последовательности:
- первый элемент списка
- второй элемент списка
- третий элемент списка
Теги - это теги начала и конца ненумерованного списка, тег
- (List Item) задает тег элемента списка. Помимо этих тегов, существует тег, позволяющий именовать списки -
(List Header). Атрибуты маркеров в ненумерованном списке
Чтобы не применять одни и те же маркеры на разных уровнях вложенности, можно использовать атрибут ТYРЕ. Вы можете задать любой тип маркера в произвольном месте списка. Можно даже смешивать разные типы маркеров в одном списке. Ниже перечислены теги с атрибутами стандартных маркеров:
- Тег создает сплошные маркеры
такого типа, как в списках первого уровня по
умолчанию.
- ,
- ) используют для создания списка терминов и их определений. Схема использования тега следующая.
- Термин
- Определение
Определяемый термин записывается на одной строке, а его определение - на следующей, с небольшим отступом вправо. Тег
- позволяет создавать отдельные абзацы с отступом без нумерации или маркеров. Отступ делается от левого края. Если на странице несколько тегов
- размером элемента (с учётом того, заданы они явно или нет);
- типом элемента (строчный или блочный);
- схемой позиционирования (нормальный поток, позиционированные или плавающие элементы);
- отношениями между элементами в DOM (родительский — дочерний элемент);
- внутренними размерами содержащихся изображений;
- внешней информацией (например, размеры окна браузера).
- Содержащий блок, в котором находится корневой элемент, представляет собой прямоугольник — так называемый начальный содержащий блок .
- Для элементов с position: relative или position: static содержащий блок формируется краем области содержимого ближайшего родительского блока-контейнера.
- Для элемент с position: fixed содержащий блок определяется областью просмотра.
- Для элемента с position: absolute содержащий блок устанавливается ближайшим предком с заданным position: absolute/relative/fixed
- , то текст постепенно сдвигается все больше вправо. В конце определения поместите закрывающий тег
Горизонтальные линейки - тег <НR>
Горизонтальное отчеркивание (Horizontal Rule) применяется для разделения документа на части. С помощью одного лишь тега <НR> можно придать странице оригинальный вид. Попробуйте поэкспериментировать с тегом <НR>, и вы получите линии, совсем не похожие на те, которыми обычно пользуетесь.
Преформатированный вывод - тег <РRЕ>
Применение этого тега позволяет отобразить текст «как есть» (без форматирования), теми же символами и с тем же разбиением на строки.
Применение тега
Текст, помещенный между тегами , мерцает. Данный тег поддерживается только браузером Netscape Navigator. Пользоваться им следует с большой осторожностью.
HTML (Hyper Text Markup Language) : язык гипертекстовой разметки, используется для создания интернет-страниц. Страница, написанная таким образом, представляет собой обычный текстовыи документ, в котором при помощи тегов определяются расположение и оформление текста, графики и др. Все теги пишутся в угловых скобках (< , >)
Все теги делятся на 2 группы:
- требующие закрывающего тега (контейнеры );
- не имеющие закрывающего тега (одиночные).Теги-контейнеры записываются так:
<тег> подопытный объекттег> . Косая черта (символ /) говорит о том, что тег закрывающий.Одиночные теги записывают так:
одна хрень<тег> другая хреньТег может иметь параметры. Параметры тега записываются после него, внутри его угловых скобок через пробел. Например,
Ниже приведены основные html-теги и их применение.
Обязательные теги
- тег-контейнер, открывающий тег пишется в самом начале документа; закрывающий- в самом конце. Заключает в себе всё содержимое документа и сообщает компьютеру, что это действительно html-документ.
- контейнер, заключает в себе голову html-документа, где пишутся специальные теги. Начинается сразу после , заканчивается между и
Простой текст, написанный внутри этого контейнера, в браузере никак не отобразится.
.
- контейнер внутри контейнера
Предназначен для написания в нём заголовка страницы.
- тело документа, где находится основное содержание. Контейнер должен распологаться между и .
Имеет много параметров:text
-цвет текста на странице,bgcolor
-цвет фона страницы,link
-цвет ссылок на странице,На этом список обязательных тегов заканчивается. Идём дальше...
Теги - контейнеры
-необязательный, но необходимый тег. Имеет ценнейший параметрhref , без использования которого не обходится ни один сайт. Оно и понятно, ведь сочетанием a href образуется ссылка , а какой же сайт без ссылок?!
Пример: текст, который увидит посетитель
-устаревший, но надёжный тег для текста. Вот его параметры:color
-цвет шрифта,size
-размер шрифта (в относительных единицах, от 1 до 7)
и др.
-используется для выравнивания текста и других объектов по горизонтальному центру страницы
-предназначен для написания заголовка внутри страницы. Текст внутри тега отображается большим жирным шрифтом и устанавливается по центру. Вообще-то на месте цифры 2 в моём примере может стоять цифра от 1 до 6 - получаются заголовки от самого большого до самого маленького.
-устанавливает жирное начертание текста.
-курсивный текст
-подчёркнутый текст
-перечёркнутый текст
-используется для отделения параграфа. Позволяет установить для текста различные отступы.
Одиночные теги
-переброс на другую строку
-горизонтальная черта.
-размещение картинки на странице.
У него несколько параметров:src , указывает путь к картинке (абсолютный или относительный);
align , устанавливает расположение картинки. Этот параметр может принимать значения \"center\", \"left\", \"right\".
alt , подпись к картинке, которая появляется при наведении на неё мышкой.
border , устанавливает толщину рамки вокруг картинки. Принимает значение от 0 до сколько хочешь.
Займемся контейнерным Web-дизайном - изучим элементы интернет-страниц - блочные контейнеры.
Освоим дополнительные атрибуты стилей, применяемых для задания параметров блочных контейнеров (их размеры и местоположение на Web-странице).
А в завершение получим от CSS средства управления переполнением.
В блочном контейнере могут быть размещены от одного до нескольких блочных элементов таких как заголовок, абзац, таблица и др.
Для создания блочного контейнера применяется парный тег
, с помещенным внутри html-кодом - содержимым контейнера. (листинги 10.1-10.3).В этом блочном контейнере размещен заголовок и два абзаца.
Здесь - таблица.
В этом - видеоролик и абзац. А еще добавили встроенный стиль, выравнивающий текст по центру. Видеоролик так же будет размещен по центру.
Блочные контейнеры используются чаще, чем встроенные.
Web-дизайн прошедшего времени и его недостатки
Не так давно Web-программисты
пользовались тремя основными направлениями контейнерного Web-дизайна : текстовым, фреймовым и табличным. Каждый по своему был хорош, но и имел недоработки. С появлением нового вида Web-дизайна - контейнерного, остальные уходят на второй план.
Текстовый контейнерный Web-дизайн - обычный текстовый документ: абзацы, заголовки, большие цитаты, текст фиксированного формата и таблицы. Основное его преимущество - простой html-код. Недостатки: нудный вид web-страницы, отсутствие средств размещения элементов
на Web-странице - только следуют друг за другом.Web-страница делится на четыре части: заголовок, полоса навигации, основной контент, сведения об авторе. Во всех страницах сайта все одинаково
за исключением основного контента, которое должно быть уникальным.Получается, что HTML-код каждой web-страницы почти одинаков (кроме основного содержимого), и при загрузке каждой страницы идет загрузка одной и той же части кода. А чем больше объем файла, тем дольше он загружается (тем дольше ожидание пользователя). Вот бы загружать не весь html-код, а лишь часть - основной контент.
Вот эту проблему
текстовый Web-дизайн и не решает.Фреймовый контейнерный Web-дизайн
- выход из создавшейся ситуации. Фрейм - выводит в отдельном месте страницы содержимое произвольной Web-страницы, адрес которой прописывается в его параметрах.Страница сайта - набор фреймов. Некоторые участки содержимого выводились в отдельные Web-страницы, адреса которых прописывались в параметрах их фреймов. В других страницах размещался лишь основной материал. Преимущество фреймового контейнерного web-дизайна - повысилась скорость загрузки страницы. Но есть и минусы: фреймы не стандартизированы и нет возможности изменить их структуру. Позже появилась новая разновидность web-дизайна - табличный.
Табличный контейнерный Web-дизайн . При создании web-страницы применяется таблица. Заголовок, авторские права, полоса навигации размещались по отдельным ячейкам этой таблицы. В дальнейшем табличный web-дизайн стал более популярным, чем фреймовый.
Преимущества:
Возможность одинакового отображения web-страниц во всех web-браузерах.
Форматирование таблиц и их ячеек стилями CSS.
- сложные Web-страницы - размещение различных фрагментов содержимого, увеличение числа колонок текста.
Недостатки:
Все страницы опять имели повторяющиеся части html-кода, что отразилось на снижении загрузки страницы.
Большой и сложный html-код.
Так давайте же перейдем к изучению новой разновидности web-дизайна.
Сущность контейнерного Web-дизайна
Для размещения отдельных фрагментов содержимого Web-страниц использует блочные контейнеры, с которыми мы познакомились в начале этой главы. Отдельные контейнеры создаются для заголовка Web-сайта, полосы навигации, основного содержимого и сведений об авторских правах. Если основное содержимое имеет сложную структуру и состоит из множества независимых частей, для каждой из них создают отдельный контейнер.
Для задания различных параметров блочных контейнеров предусмотрены специальные атрибуты стиля CSS. К таким параметрам относятся размеры (ширина и высота), местоположение контейнеров и их поведение при переполнении. Также мы можем задать для контейнеров цвет фона, создать отступы и рамки, чтобы их выделить (о параметрах отступов и рамок речь пойдет в главе 11).
И что, контейнерный Web-дизайн так уж хорош? Давайте рассмотрим недостатки трех старых принципов Web-дизайна и выясним, сможет ли он их решить.
Непритязательный вид и линейное представление Web-страниц - у текстового Web-дизайна. Мы можем расположить контейнеры на Web-странице практически как угодно и поместить в них произвольное содержимое: текст, таблицы, изображения, аудио- и видеоролики и даже другие контейнеры. А CSS позволит нам задать для них практически любое представление.
- "Монолитность" Web-страниц - у текстового и табличного Web-дизайна. Современные Web-обозреватели позволяют с помощью специально созданного поведения загрузить в контейнер Web-страницу, сохраненную в отдельном файле, т. е. организовать подгружаемое содержимое. Мы займемся этим в главе 18.
- "Нестандартность" фреймов - у фреймового Web-дизайна. Контейнеры и соответствующие теги официально стандартизированы комитетом W3C и обрабатываются всеми Web-обозревателями одинаково.
Громоздкость HTML-кода - у табличного Web-дизайна. HTML-код, формирующий контейнеры, исключительно компактен. Как мы уже знаем, блочный контейнер формируется всего одним парным тегом
.Медленная загрузка Web-страниц - у табличного Web-дизайна. Все Web-обозреватели отображают содержимое контейнеров прямо в процессе загрузки, так что Web-страницы визуально загружаются очень быстро.
И что, контейнерный Web-дизайн так хорош? И он совсем не имеет недостатков? Увы, ничего совершенного в мире нет...
Проигрывает табличному в возможности реализации сложного дизайна Web-страниц. Таблица позволяет создать на Web-странице множество колонок разной ширины, содержащих разное содержимое. Чтобы сделать это с помощью контейнеров, скорее всего, придется применять вложенные друг в друга контейнеры, сложные стили и, возможно, поведение, которое уже после окончания загрузки Web-страницы располагает контейнеры в нужных местах. Это, пожалуй, единственный недостаток контейнерного Web-дизайна.
Что ж, с контейнерным Web-дизайном все в основном ясно. Давайте попрактикуемся. Переделаем наши Web-страницы с применением контейнерного Web-дизайна - "легкого", простого, современного.
Представление для нашего Web-сайта
Сначала разработаем схему расположения на Web-страницах соответствующих контейнеров. Лучше всего нарисовать ее на бумаге или в программе графического редактора.
Классическая схема контейнерного Web-дизайна (и не только контейнерного) показана на рис. 10.1. Как видим, в самом верху располагается заголовок Web-сайта, ниже него в одну линию по горизонтали выстроились полоса навигации и основное содержимое, а под ними пристроились сведения об авторских правах. Давайте используем именно эту схему.
Откроем в Блокноте Web-страницу index.htm. Найдем в ее HTML-коде четыре важных фрагмента любой Web-страницы: заголовок Web-сайта, полосу навигации, ос новное содержимое и сведения об авторских правах. Поместим их в блочные контейнеры .
На рис. 10.1 показано, что заголовок Web-сайта предшествует полосе навигации, а не наоборот. Поэтому поменяем местами фрагменты HTML-кода, создающие эти контейнеры и их содержимое.
Впоследствии мы привяжем к созданным контейнерам стили, задающие их размеры и местоположение на Web-странице. Поскольку каждый из этих контейнеров присутствует на каждой Web-странице в единственном экземпляре, применим для этого именованные стили. Дадим им такие имена:
Cheader - стиль для контейнера с заголовком Web-сайта;
Cnav - стиль для контейнера с полосой навигации;
Cmain - стиль для контейнера с основным содержимым;
Ccopyright - стиль для контейнера со сведениями об авторских правах.
Здесь буква "c" обозначает "container" - контейнер. Так мы сразу поймем, что данные стили применяются именно к контейнерам.
Привязка именованного стиля к тегу выполняется путем указания имени этого стиля в качестве значения атрибута тега ID. Сделаем это для всех контейнеров.
В листинге 10.4 приведен фрагмент HTML-кода Web-страницы index.htm со всеми нужными исправлениями.
Сохраним Web-страницу index.htm и откроем ее в Web-обозревателе. Что-то изменилось по сравнению с тем, что было ранее? Ничего.
Выделяют две основные категории HTML-элементов, которые соответствуют типам их содержимого и поведению в структуре веб-страницы — блочные и строчные элементы . С помощью блочных элементов можно создавать структуру веб-страницы, строчные элементы используются для форматирования текстовых фрагментов (за исключением элементов и ).
Разделение элементов на блочные и строчные используется в спецификации HTML до версии 4.01. В HTML5 эти понятия заменены более сложным набором , согласно которым каждый HTML-элемент должен следовать правилам, определяющим, какой контент для него допустим.
Модель визуального форматирования CSS в деталях
1. Модель визуального форматирования
Модель визуального форматирования CSS представляет собой алгоритм, который обрабатывает HTML-документ и выводит его на экран устройства. Данная модель преобразует каждый элемент документа таким образом, что он генерирует ноль или более прямоугольных блоков в соответствии с блочной моделью CSS. Положение этих блоков на странице определяется следующими факторами:
2. Определение термина «содержащий блок»
Положение и размер блока(ов) элемента иногда вычисляются относительно некоторого прямоугольника, называемого содержащим блоком элемента (containing block). Содержащий блок элемента определяется следующим образом:
3. Блочные элементы и блочные контейнеры
Блочные элементы — элементы высшего уровня, которые форматируются визуально как блоки, располагаясь на странице в окне браузера вертикально. Значения свойства display , такие как block , list-item и table делают элементы блочными. Блочные элементы генерируют основной блок, который содержит только блок элемента. Элементы со значением display: list-item генерируют дополнительные блоки для маркеров, которые позиционируются относительно основного блока.
,,
- Тег создает маркеры в виде
окружностей.
- Тег создает сплошные квадратные
маркеры.
Упорядоченные списки - тег
Нумерованные списки. Тег
- вместе с атрибутом ТYРЕ= в HTML 3.2 позволяет создавать нумерованные списки, используя в качестве номеров не только обычные числа, но и строчные и прописные буквы, а также строчные и прописные римские цифры. При необходимости можно даже смешивать эти типы нумерации в одном списке:
<ОL ТYРЕ=l> Тег создает список с нумерацией в формате 1., 2., 3., 4. и т.д. <ОL ТYРЕ=А> Тег создает список с нумерацией в формате А., В., С., D. и т.д.
- Тег создает список с нумерацией
в формате а., b., с., d. и т.д.
<ОL ТYРЕ=I> Тег создает список с нумерацией
в формате I., II., III., IV. и т.д.
Список определений - тег
Теги списка (Definition List:
- ,
- ) и список определений. Теги для ненумерованных и нумерованных списков - это основа HTML. HTML 3.2 добавляет несколько атрибутов к тегам списков для выбора разных типов маркеров в ненумерованных списках и разных схем нумерации в нумерованных. Можно включать такие атрибуты и в сами теги элементов списка (List Item