Корневой элемент дерева документа порождает блок, который выступает в качестве начального контейнера для последующего вывода.
Ширину начального контейнера можно установить с помощью свойства ‘width’ корневого элемента site1. Если данному свойству присвоено значение ‘auto’, то агент пользователя использует начальное значение ширины (например, агент использует текущее значение шириныобласти просмотра).
Высоту начального контейнера можно установить с помощью свойства ‘height’ корневого элемента. Если данному свойству присвоено значение ‘auto’, то высота контейнера увеличится до размеров, позволяющих вмещать содержание документа.
Начальный контейнер нельзя позиционировать или перемещать (т.е. агенты пользователей игнорируют свойства ‘position’ и ‘float’ корневого элемента).
К элементам уровня блока относятся элементы исходного документа, которые визуально форматируются в виде неких структурных единиц текста (например, абзацев). Принадлежность уровню блока определяется значениями свойства’display’: ‘block’, ‘list-item’, ‘compact’ и ‘run-in’ (см. разделы, посвященные компактным и инициальным блокам), а также ‘table’.
Элементы уровня блока порождают главный блок, который содержит только структурные блоки. Главный блок может участвовать в рамках любой схемы позиционирования и вместе с этим назначатьконтейнер для блоков, выступающих в качестве его потомков, и для генерируемого содержимого. Главные блоки используются в контексте форматирования блоков.
Некоторые элементы уровня блока порождают дополнительные блоки за пределами главного: элементы ‘list-item’ и элементы с маркерами. Дополнительные блоки размещаются относительно главного блока.
В документе
<DIV>
Тект
<P>Еще текст
</DIV>
(считается, что для элементов DIV и P установлено значение ‘display: block’) элемент DIV имеет два типа содержимого: принадлежащего строке и принадлежащего блоку. Чтобы упростить процесс форматирования, предполагается, что надпись “Текст” заключена в безымянный структурный блок.
Рисунок, представляющий три типа блоков, один из которых является безымянным, например, верхний.
Другими словами, если структурный блок (подобный сгенерированному для элемента DIV) содержит в себе другой структурный блок (например, сгенерированный для элемента P), то он не должен содержать ничего, кроме структурных блоков. При этом каждый строковый блок вкладывается в безымянный структурный блок.
Такая модель в следующем примере может реализоваться, если использовать правила:
/* Замечание: учет этих правил не является обязательным для */
/* пользовательских агентов, управляющих отображением HTML-долкументов */
BODY { display: inline }
P { display: block }
в приведенном ниже HTML-документе:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<HEAD>
<TITLE>Безымянный текст, разорванный блоком</TITLE>
</HEAD>
<BODY>
Это безымянный текст, расположенный до элемента P.
<P>Это содержимое элемента P.</>
Это безымянный текст, расположенный после элемента P.
</BODY>
Элемент BODY содержит отрывок (C1) безымянного текста, после которого следует элемент уровня блока, за которым, в свою очередь, следует другой отрывок (C2) безымянного текста. В результате будут сгенерированы безымянный структурный блок для элемента BODY, который содержит безымянный структурный блок, заключающий в себя отрывок C1, структурный блок для элемента P и другой безымянный структурный блок, заключающий в себя отрывок C2.
Свойства безымянных блоков наследуются от содержащего их блока (например, порожденного элементом DIV), который не является безымянным. Ненаследуемые свойства принимают значения, используемые по умолчанию. Например, шрифт, используемый для отображения безымянного блока, наследуется от элемента DIV, но значение ширины его полей будет равно нулю.
Элементы строкового уровня – это элементы исходного документа, которые не формируют новых структурных единиц текста. Их содержимое выводится в строке (например, выделенные отрывки текста в абзаце или графические объекты, импортированные в текст). Определенные значения свойства’display’ делают элемент принадлежащим строке: ‘inline’, ‘inline-table’, ‘compact’ и ‘run-in’ (см. разделы, посвященные компактным и инициальным блокам). Элементы строкового уровня порождают строковые блоки.
Строковые блоки могут использоваться в контексте различных методологий форматирования:
- в рамках структурного блока строковые блоки используются в контексте строкового форматирования;
- компактный строковый блок располагается в поле структурного блока;
- блоки, порожденные маркерами, также располагаются за пределами структурного блока.
Безымянные строковые блоки
В документе типа:
<P>Отрывок <EM>выделенного</em> текста</P>
Элемент P порождает структурный блок, который содержит несколько строковых блоков. Блок, содержащий слово “выделенного”, является строковым блоком, порожденным строковым элементом EM. Блоки, содержащие слова “Отрывок” и “текста”, являются строковыми блоками, порожденными элементом P структурного уровня. Последние называются безымянными строковыми блоками, т.к. не существует элемента строкового уровня, который был бы связан с ними.
Наследуемые свойства безымянных строковых блоков принимают значения соответствующих свойств родительского структурного блока. Ненаследуемые свойства принимают значения, используемые по умолчанию. В этом примере цвет исходных безымянных блоков наследуется от элемента P, но фон остается прозрачным.
Если из контекста очевидно, о каком типе безымянных блоков идет речь, то безымянные строковые и структурные блоки в данной спецификации называются просто безымянными блоками.
Тип блока определяет свойство display
Значения этого свойства:
block – при этом значении свойства элемент порождает главный структурный блок.
inline – при этом значении свойства элемент порождает один или несколько строковых блоков.
list-item – при этом значении свойства элемент (например, LI в HTML) порождает главный структурный блок и строковый блок элемента списка.
marker – при этом значении свойства генерируемое содержимое, располагающееся до или после блока, становится маркером. Данное значение должно использоваться только с псевдоэлементами :before и :after, прикрепленным к элементам структурного уровня. В остальных случаях данное значение интерпретируется как ‘inline’.
none – при этом значении свойства элемент не порождает ни одного блока в структуре форматирования (т.е. элемент никак не влияет на отображение документа). Потомки этого элемента тем более не будут порождать никаких блоков, даже если для их свойства ‘display’ установлено другое значение.
table, inline-table, table-row-group, table-column, table-column-group, table-header-group, table-footer-group, table-row, table-cell и table-caption – при этих значениях свойства элемент ведет себя как элемент таблицы
Необходимо помнить, что хотя в качестве начального значения свойства ‘display’ используется значение ‘inline’, правила, содержащиеся в таблице стилей, используемой агентом пользователя по умолчанию, могут переназначить его.
В CSS2 блок может размещаться согласно трем схемам позиционирования:
- Нормальный поток. В CSS2 модель нормального потока включает форматирование блока структурного уровня, строковое форматирование строковых блоков, относительное позиционирование структурных или строковых блоков, а также позиционирование компактных и инициальных блоков.
- Перемещаемые объекты. Согласно этой модели блок сначала размещается в соответствии с нормальным потоком, а затем изымается из него и перемещаются максимально влево или вправо насколько это возможно. Отображаемое содержимое может располагаться по сторонам перемещаемого элемента.
- Абсолютное позиционирование. В модели абсолютного позиционирования блок полностью удаляется из нормального потока (и не влияет на последующие сестринские элементы), а затем ему назначается положение относительно контейнера.
Свойства ‘position’ и ‘float’ определяют алгоритм позиционирования CSS2, используемый для определения положения блока.
Значения свойства ‘position’:
static – Данный блок является обычным блоком, позиционируемым в соответствии с нормальным потоком. Свойства ‘left’ и ‘top’ не применяются.
relative – положение блока рассчитывается в соответствии с нормальным потоком (оно называется нормальным положением). Затем блок смещается относительно своего нормального положения. Когда для расположения блока B используется модель относительного позиционирования, тогда положение следующего блока рассчитывается так, как будто блок B не был смещен.
absolute -положение блока (возможно и размер) указывается с помощью свойств ‘left’, ‘right’, ‘top’ и ‘bottom’. Они указывают величину смещения относительно контейнера блока. Абсолютно позиционируемые блоки изымаются из нормального потока. Это значит, что они не влияют на размещение последующих сестринских элементов. Следует заметить, что поляабсолютно позиционируемых блоков не перекрываются ни с какими другими полями.
fixed – положение блока рассчитывается в соответствии с моделью абсолютного позиционирования, а затем он фиксируется относительно некоторого объекта. При использовании устройств без разбивки блок фиксируется относительно области просмотра (и не перемещается при прокрутке). При использовании устройств с постраничной разбивкой блок фиксируется относительно страницы, даже если она отображается в области просмотра (например, при предварительном просмотре печати). У разработчиков существует возможность сделать определение значения ‘fixed’ аппаратно-зависимым. Например, разработчик может сделать так, чтобы на экране блок всегда отображался в верхней частиобласти просмотра, но не печатной страницы этого бы не происходило.
Два объявления могут быть отделены друг от друга с помощью правила @media, как это показано ниже:
@media screen {
H1#first { position: fixed }
}
@media print {
H1#first { position: static }
}
Говорят, что элементу была присвоена позиция, если для свойства ‘position’ устанавливается значение, отличное от ‘static’. Позиционированные элементы порождают позиционированные блоки, положение которых регулируется с помощью следующих четырех свойств:
‘top’ – это свойство задает смещение верхнего сегмента внутренней краевой линии относительно верхнего сегмента краевой линии контейнера блока.
‘right’ – это свойство задает смещение правого сегмента внутренней краевой линии влево относительно правого сегмента краевой линии контейнера блока.
‘bottom’ – это свойство определяет смещение нижнего сегмента внутренней краевой линии вверх относительно нижнего сегмента краевой линии контейнера блока.
‘left’ – это свойство определяет смещение левого сегмента внутренней краевой линии вправо относительно левого сегмента краевой линии контейнера блока.
Значения этих четырех свойств имеют следующий смысл:
<длина> – смещение задается фиксированным значением расстояния от исходной краевой линии.
<проценты> – смещение задается процентным соотношением относительно ширины (для свойств ‘left’ и ‘right’) или высоты (для свойств ‘top’ и ‘bottom’) контейнера. Если высота контейнера не указана точно (т.е. зависит от высоты содержимого), то процентное соотношение, определяющее значение свойств ‘top’ и ‘bottom’, интерпретируется как значение ‘auto’.
auto – действие данного значения зависит от того, какие из свойств, близких по своему содержанию к рассматриваемым, также имеют значение ‘auto’. Подробную информацию можно найти в разделах, посвященныхширине и высоте абсолютно позиционируемых и неперемещаемых элементов.
Для абсолютно позиционируемых блоков смещение осуществляется относительно контейнера. Для относительно позиционируемых блоков смещение осуществляется относительно внешней краевой линии самого блока (сначала блоку присваивается положение в нормальном потоке, а затем с использованием названных свойств указывается смещение относительно этого положения).
Блоки, содержащиеся в нормальном потоке, принадлежат контексту форматирования, который может быть либо блоковым, либо строковым, но не тем и ни другим одновременно.Структурные блоки участвуют в контексте форматирования блоков. Блоки строкового уровня участвуют в контексте форматирования строк.
В контексте форматирования блоков блоки располагаются друг за другом вертикально, начиная с верхнего края контейнера. Вертикальное расстояние между двумя сестринскими блоками определяется с помощью свойства’margin’. В контексте форматирования блоков вертикальные поля между соседними структурными блоками перекрываются.
В контексте форматирования блоков каждый левый сегмент внешнего края блока соприкасается с левым сегментом краевой линии контейнера (при форматировании справа налево соприкасаются правые края). Это справедливо и при наличии перемещаемых объектов (хотя при этом область содержимого блока может сократиться).
Информацию о разделителях страниц, используемых в устройствах с постраничной разбивкой, можно найти в разделе о допустимых разделителях страниц.
В контексте форматирования строк блоки располагаются горизонтально, один за другим, начиная с верхнего края контейнера. Горизонтальные поля, границы и отступы внутри этих блоков сохраняются. Существуют различные способы вертикального выравнивания блоков: по нижнему или по верхнему краю или по уровню содержащегося в них текста. Прямоугольная область, которая содержит блоки, формирующие одну строку, называется линейным блоком.
Ширина линейного блока определяется шириной контейнера. Высота линейного блока регулируется правилами, описанными в разделе “Вычисление высоты строк”. Линейный блок всегда имеет высоту достаточную, чтобы вместить все блоки. Однако он может быть выше, чем самый высокий блок, содержащийся внутри, (если, например, блоки выровнены таким образом, что подошвы текста находятся на одной оси). Если высота блока B меньше, чем высота линейного блока, в котором он находится, то вертикальное выравнивание блока B внутри последнего определяется свойством’vertical- align’.
Если несколько строковых блоков не могут разместиться горизонтально в пределах одного линейного блока, то они распределяются по двум или более вертикально расположенными линейным блоками. Таким образом, абзац представляет собой набор вертикально расположенных линейных блоков. Линейные блоки не находят друг на друга и не разделаются никакими вертикальными промежутками.
Обычно левый край линейного блока соприкасается с левым краем контейнера, а правый край – с правым краем контейнера. Однако иногда между их соответствующими краями могут располагаться перемещаемые блоки. Поэтому, хотя в одном контексте строкового форматирования линейные блоки обычно имеют одинаковую ширину (равную ширине контейнера), она все же может изменяться в зависимости от размеров доступного горизонтального пространства, оставляемогоперемещаемым объектом . Линейные блоки в одном и том же контексте строкового форматирования зачастую различаются по высоте (например, одна строка может содержать вытянутый графический объект, в то время как другая – только текст).
Когда суммарная ширина строковых блоков, упорядоченных в строку, меньше ширины содержащего их линейного блока, то горизонтальное распределение этих блоков определяется с помощью свойства’text-align’. Если ему присвоено значение ‘justify’, то агент пользователя может увеличить длину строковых блоков.
Поскольку ширина строкового блока не может превышать ширину линейного блока, длинные строковые блоки разбиваются на несколько отдельных сегментов, которые затем распределяются по нескольким линейным блокам. Когда строковый блок разбивается на части, то в месте разбиения поля границы и отступы визуально не отображаются. Форматирование полей, границ и отступов будет определено не полностью, если разбиение производится внутри двунаправленной вставки.
Разбиение строковых блоков может осуществляться также и внутри одного линейного блока за счет использования двунаправленной обработки текста.
После того как блок был размещен в соответствии с моделью нормального потока, он может быть смещен относительно исходного положения. Данная процедура называется относительным позиционированием. Подобное смещение блока (B1) не влияет на следующий за ним блок (B2): блоку B2 назначается положение так, как если бы смещение блока B1 не производилось, и это положение не изменяется, даже если блок B1 после этого будет перемещен. Отсюда следует, что при относительном позиционировании может происходить наложение блоков.
Относительно позиционируемые блоки сохраняют типичные размеры перемещаемых объектов, включая разрывы строк и отведенное для них пространство. Относительно позиционируемый блок назначает новыйконтейнер для дочерних элементов нормального потока и размещаемых потомков.
Элемент порождает относительно позиционируемый блок, если для его свойства ‘position’ установлено значение ‘relative’. Смещение определяется с помощью свойств ‘top’, ‘bottom’, ‘left’ и ‘right’.
Динамическое перемещение относительно позиционируемых блоков способно порождать эффекты анимации в текстовом окружении (см. также свойство’visibility’ ). Относительное позиционирование можно использовать как основное средство для создания верхних и нижних индексов, если только высота строки не регулируется автоматически, препятствуя осуществлению позиционирования. Дополнительную информацию можно найти в разделе овычислении высоты строк.
Примеры относительного позиционирования представлены в разделе, где производится сравнение моделей, описывающих нормальный поток, перемещаемые объекты и абсолютное позиционирование.
Перемещаемый объект – это блок, который смещается по строке в левую или правую сторону. Самым интересным свойством перемещаемого объекта является то, что содержимое может передвигаться вдоль одной из его сторон (либо не делать этого, если существует запрет, устанавливаемый свойством’clear’ ). Содержимое может передвигаться вдоль правой стороны левостороннего перемещаемого блока и вдоль левой стороны правостороннего перемещаемого блока. Далее приводится описание принципов позиционирования перемещаемых объектов и потока содержимого. Конкретныеправила, управляющие поведением перемещаемых объектов, приводятся в описании свойства ‘float’.
У перемещаемого блока должна быть явно задана ширина (назначается с помощью свойства ‘width’ или у него должно быть собственное значение ширины в случае, когда он является заменяемым элементом). Любой перемещаемый блок становится структурным блоком, сдвинутым влево или вправо, если его внешний край не соприкасается с краем контейнера или другого перемещаемого блока. Верхняя часть перемещаемого блока выравнивается по верхней части текущего линейного блока (или, в случае его отсутствия, по нижней части предшествующего структурного блока). Если в текущей строке недостаточно свободного места для перемещаемого объекта, то он последовательно, строка за строкой, перемещается вниз до тех пор, пока не найдется строка, в которой для него найдется достаточное количество места.
Т.к. перемещаемый объект не принадлежит потоку, то вертикальное передвижение непозиционированных блоков, созданных до и после него, будет осуществляться так, как если бы он отсутствовал. Линейные блоки, следующие непосредственно за перемещаемым объектом, укорачиваются, чтобы освободить для него место. Содержимое строки, находящейся перед перемещаемым объектом, выводится заново с другой стороны от него в самой первой доступной строке.
Эта модель применима и к перемещаемым объектам, соседствующим друг с другом в одной и той же строке.
Свойство ‘float’ определяет, будет ли блок перемещен влево, вправо или вообще не будет перемещен. Оно может устанавливаться для элементов, порождающих блоки, не являющиесяабсолютно позиционируемыми. Значения данного свойства имеют следующий смысл:
left – элемент порождает структурный блок, перемещаемый влево. Содержимое выводится вдоль правой стороны блока, начиная с самого верха (за счет свойства ‘clear’). Свойство ‘display’ игнорируется, если ему не присвоено значение ‘none’.
right – подобно значению ‘left’ с той лишь разницей, что содержимое выводится вдоль левой стороны блока, начиная с самого верха.
none – блок не перемещается.
Ниже приведены четкие правила, определяющие поведение перемещаемых объектов:
- Левый внешний край левостороннего перемещаемого блока не может находиться слева от левого края контейнера. Подобное правило имеет место и для правостороннего перемещаемого блока.
- Если текущий перемещаемый блок является левосторонним и существует хотя бы один левосторонний перемещаемый блок, который был сгенерирован в исходном документе раньше него, то левыйвнешний край текущего блока должен находиться справа от правого внешнего края предыдущего блока, или верхний его край должен быть ниже, чем нижний край предыдущего блока. Подобное правило имеет место и для правостороннего перемещаемого блока.
- Правый внешний край левостороннего перемещаемого блока не может находиться справа от левого внешнего края любого правостороннего перемещаемого блока. Подобное правило имеет место и для правостороннего перемещаемого блока.
- Верхний сегмент внешнего края перемещаемого блока не может быть выше аналогичной границы контейнера.
- Верхний сегмент внешнего края перемещаемого блока не может быть выше аналогичной границы любого структурного или перемещаемого блока, который был сгенерирован в исходном документе раньше рассматриваемого перемещаемого блока.
- Верхний сегмент внешнего края перемещаемого блока не может быть выше аналогичной границы любого линейного блока, содержащего блок, который был сгенерирован в исходном документе раньше рассматриваемого перемещаемого блока.
- Левосторонний перемещаемый блок, слева от которого расположен другой левосторонний перемещаемый блок, может не иметь правого внешнего края, расположенного справа от правого края его контейнера. (Иногда левосторонний перемещаемый блок может не выдаваться справа до тех пор, пока он не будет помещен как можно левее). Подобное правило имеет место и для правостороннего перемещаемого блока.
- Перемещаемый блок должен быть помещен как можно выше.
- Левосторонний перемещаемый блок должен быть помещен как можно левее, а правосторонний перемещаемый блок – как можно правее. Самое верхнее положение должен занимать блок, который занимает более крайнее левое/правое положение.
В модели абсолютного позиционирования величина смещения блока относительно его контейнера задается явно. Он полностью удаляется из нормального потока (так что не влияет на последующие сестринские элементы). Абсолютно позиционированный блок назначает новый контейнер для дочерних элементов из нормального потока и позиционируемых потомков. Содержимое абсолютно позиционируемого элемента не перемещается вокруг других блоков. Оно может затенять (или не затенять) содержимое другого блока в зависимости отуровней расположения накладывающихся блоков.
Если в данной спецификации элемент (или порожденные ими блоки) называется абсолютно позиционируемым, это означает, что для свойства’position’ данного элемента установлено значение ‘absolute’ или ‘fixed’.
Фиксированное позиционирование является разновидностью абсолютного позиционирования. Единственным его отличием является то, что при фиксированном позиционировании контейнер определяетсяобластью просмотра. Для устройств без разбивки фиксированные блоки не перемещаются при прокрутке документа. В этом отношении они схожи с фиксированными фоновыми изображениями. Для устройств с постраничной разбивкой блоки с фиксированным положением повторяются на каждой странице. Это оказывается удобным, например, при размещении подписей в нижней части каждой страницы.
Обычно содержимое структурного блока ограничивается краями его информативной области. В некоторых случаях блок может переполняться, что означает частичный или полный выход содержимого за его пределы. Например, это может происходить, когда:
- строка не может быть разбита на части, в результате чего линейный блок оказывается шире структурного блока;
- блок структурного уровня оказывается намного шире контейнера. Это происходит тогда, когда свойство ‘width’ элемента принимает значение, приводящее к выходу генерируемого структурного блока за пределы контейнера;
- значение высоты элемента превышает явно заданное значение высоты контейнера (т.е. высота контейнера определяется свойством ‘height’, а не высотой содержимого);
- блок является абсолютно позиционируемым;
- ширина полей блока принимает отрицательные значения.
Каждый раз при переполнении блока то, как осуществляется усечение блока (и выполняется ли оно вообще), определяется свойством ‘overflow’. Свойство ‘clip’ определяет размер и форму усекаемой области. Если размеры усекаемой области невелики, то при усечении может случиться, что содержимое остается видимым.
Свойство ‘overflow’ определяет, будет ли осуществляться усечение содержимого элемента уровня блока при его выходе за пределы порожденного им блока (выступающего в качестве контейнера упомянутого содержимого) или нет. Значения данного свойства имеют следующий смысл:
visible – это значение указывает на то, что содержимое не может усекаться, т.е. не может отображаться за пределами структурного блока.
hidden – это значение указывает на то, что содержимое может усекается и что для просмотра содержимого, находящегося в области усечения, не предусмотрен никакой механизм прокрутки. Т.е. пользователи не будут иметь доступа к отсеченному содержимому. Размер и форма области усечения определяются свойством’clip’.
scroll – это значение указывает на то, что содержимое может усекается и что агент пользователя в случае использования явно отображаемого на экране механизма прокрутки (например, полосы прокрутки) должен отобразить этот механизм в пределах блока независимо от того, было ли произведено усечение его содержимого или нет. Это позволяет избегать связанных с появлением или исчезновением полос прокрутки проблем в динамическом окружении. Если свойству присвоено именно это значение, а конечным является устройство типа ‘print’ или ‘projection’, то содержимое, выходящее за пределы блока, будет напечатано.
auto – поведение, обусловленное заданием значения ‘auto’, определяется агентом пользователя и должно предусматривать возможность использования полосы прокрутки для переполняемых блоков.
Даже если свойство ‘overflow’ принимает значение ‘visible’, содержимое может быть усечено рабочим окружением, исходя из размеров окна документа агента пользователя.
Свойство ‘visibility’ определяет, будет ли осуществляться отображение блоков, порождаемых элементом, или нет. Невидимые блоки по-прежнему влияют на отображение (для запрета генерации блоков свойству’display’ необходимо присвоить значение ‘none’). Значения данного свойства имеют следующий смысл:
visible – генерируемый блок является видимым.
hidden – генерируемый блок является невидимым (полностью прозрачным), но по-прежнему влияет на отображение.
Данное свойство можно использовать в сочетании со сценариями для создания динамических эффектов.