10 Подробное описание модели визуального форматирования

Содержание

10.1 Определение "контейнера"

Позиция и размер блока(ов) элемента иногда вычисляются относительно определенного прямоугольника, называемого контейнер элемента. Контейнер определяется следующим образом:

  1. Контейнер, в котором корневой элемент находится в прямоугольнике с размерами области просмотра, привязывается к области представления источника для устройств без разбивки, и к области страницы для устройств с постраничной разбивкой. Такой контейнер называется начальный контейнер. Свойство 'direction' начального контейнера такое же, что и у корневого элемента.
  2. Для любого другого элемента, если позиция элемента – 'relative' или 'static', контейнер определяется краевой линией области содержимого ближайшего блока предка уровня блока, ячейки таблицы или уровня строки.
  3. Если элемент имеет свойство 'position: fixed', то контейнер задается областью просмотра при использовании устройств без разбивки или блоком страницы при использовании устройств с постраничной разбивкой
  4. Если элемент имеет свойство 'position: absolute', то контейнер назначается ближайшим предком со свойством 'position', имеющим значение 'absolute', 'relative' или 'fixed', следующим образом:
    1. Если предок принадлежит строковому уровню, то контейнер определяется значением свойства предка 'direction':
      1. Если свойство 'direction' принимает значение 'ltr', то верхний и левый край контейнера являются верхним и левым краем области отступа первого блока, порожденного предком, а нижний и правый его края являются нижним и правым краем области отступа последнего блока, порожденного предком.
      2. Если свойство 'direction' принимает значение 'rtl', то верхний и правый края контейнера являются верхним и правым краями области отступов первого блока, порожденного предком, а нижний и левый край являются нижним и левым краем области отступов последнего блока, порожденного предком.

      Примечание: Это может привести к тому, что ширина контейнера станет отрицательной.

    2. В противном случае, контейнер формируется краем области отступа предка.

    Если нет таких предков, то контейнер является начальным контейнером.

В устройствах с постраничной разбивкой, абсолютно позиционированные элементы размещаются относительно их контейнеров, игнорируя любые разрывы страниц (как если бы документ был без разбивки на страницы). Элемент может впоследствии быть разбит на несколько страниц.

Для абсолютно позиционированного содержимого, которое решено поместить на странице, отличной от выводимой страницы (текущей страницы), или решено поместить на текущей странице, которая уже была представлена для печати, принтеры могут поместить содержимое

Примите во внимание, что элемент уровня блока, который разбит на несколько страниц, может иметь различную ширину на каждой странице и что могут быть зависящие от устройств ограничения.

Пример(ы):

Без позиционирования, контейнера в следующем документе:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
   <HEAD>
      <TITLE>Иллюстрация контейнера</TITLE>
   </HEAD>
   <BODY id="body">
      <DIV id="div1">
      <P id="p1">Это текст в первом абзаце...</P>
      <P id="p2">Это текст <EM id="em1"> во 
      <STRONG id="strong1">втором</STRONG> абзаце.</EM></P>
      </DIV>
   </BODY>
</HTML>

назначаются следующим образом:

Для блока, порожденного элементом Контейнер назначается элементом
htmlначальный контейнер (назначается агентом пользователя)
bodyhtml
div1body
p1div1
p2div1
em1p2
strong1p2

Если осуществить позиционирование элемента "div1":

   #div1 { position: absolute; left: 50px; top: 50px }

то после этого роль его контейнера будет выполнять не "body"; он становится начальным контейнером (т.к. при этом не найдется ни одного позиционированного блока, порожденного его предком).

Если осуществить позиционирование элемента "em1":

   #div1 { position: absolute; left: 50px; top: 50px }
   #em1  { position: absolute; left: 100px; top: 100px }

то таблица контейнеров примет вид:

Для блока, порожденного элементом Контейнер назначается элементом
htmlначальный контейнер (назначается агентом пользователя)
bodyhtml
div1начальный контейнер
p1div1
p2div1
em1div1
strong1em1

После позиционирования "em1" его контейнером становится ближайшим позиционированным блоком предка (т.е. того, который сгенерирован элементом "div1").

10.2 Ширина содержимого: свойство 'width'

'width'
Значение:  <длина> | <проценты> | auto | inherit
Начальное значение:  auto
Область применения:  все элементы, кроме незамещаемых элементов строкового уровня, строк таблиц и групп строк
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  процентное или 'auto', как определено или абсолютная длина; 'auto', если свойство не применяется

Это свойство задает ширину содержимого блоков, порожденных элементами уровня блока и замещаемыми элементами.

Данное свойство не применяется к незамещаемым элементам строкового уровня. Ширина содержимого блоков незамещаемых элементов строкового уровня, равна ширине отображаемого внутри них содержимого (до момента любого относительного смещения дочерних элементов). Говорят, что строковые блоки перемещаются в линейные блоки. Ширина линейных блоков задается их контейнером, но может быть укорочена имеющимися перемещаемыми объектами.

Ширина блока замещаемого элемента является его внутренним параметром и может масштабироваться агентом пользователя, если значение этого свойства отлично от 'auto'.

Значения имеют следующий смысл:

<длина>
Определяет ширину области содержимого используя единицы измерения длины.
<проценты>
Определяет значение ширины в процентах. Процентное соотношение вычисляется относительно ширины контейнера генерируемого блока. Если ширина контейнера зависит от ширины этого элемента, то результирующее расположение не определяется в CSS 2.1. Примечание: Для абсолютно позиционированных элементов, контейнера которых основывается на элементе уровня блока, вычисляется в процентах от ширины блока отступа этого элемента. Это отличается от CSS1, где ширины всегда вычислялась в процентах от блока содержимого родительского элемента.
auto
Ширина основана на значениях других свойств. См. следующие ниже разделы.

Отрицательные значения свойства 'width' недопустимы.

Пример(ы):

Например, согласно следующему правилу ширина содержимого абзацев устанавливается равной 100 пикселам:

p { width: 100px }

10.3 Вычисление значений ширины и полей

Значения свойств 'width', 'margin-left', 'margin-right', 'left' и 'right' элементов как используемые для размещения, зависят от типа генерируемого блока и друг от друга. (Значение, используемое для размещения, иногда называют используемым значением.) В принципе, используемые значения равны вычисляемым значениям, со значением 'auto' заменяется некоторым более подходящим значением, а процентное значение вычисляется основываясь на контейнере, но есть исключения. При этом необходимо различать следующие ситуации:

  1. незамещаемые элементы строкового уровня;
  2. замещаемые элементы строкового уровня;
  3. незамещаемые элементы уровня блока в нормальном потоке;
  4. замещаемые элементы уровня блока в нормальном потоке;
  5. незамещаемые перемещаемые элементы;
  6. замещаемые перемещаемые элементы;
  7. незамещаемые абсолютно позиционируемые элементы;
  8. замещаемые абсолютно позиционируемые элементы;
  9. незамещаемые 'inline-block' элементы в нормальном потоке
  10. замещаемые 'inline-block' элементы в нормальном потоке

Для позиций 1-6 и 9-10, значение 'left' и 'right', используемое для размещения, определяется правилами, изложенными в разделе 9.4.3.

10.3.1 Незамещаемые элементы строкового уровня

Свойство 'width' не применяется. Вычисляемое значения 'auto' для свойств 'left', 'right', 'margin-left' или 'margin-right' становится используемым значением '0'.

10.3.2 Замещаемые элементы строкового уровня

Вычисляемое значения 'auto' для свойств 'margin-left' или 'margin-right' становится используемым значением '0'.

Если и 'height' и 'width' имеют вычисленное значение 'auto' и элемент также имеет внутреннюю ширину, то эта внутренняя ширина является используемым значением свойства 'width'.

Если и 'height' и 'width' имеют вычисленное значение 'auto', а элемент не имеет внутреннюю ширину, но имеет внутреннюю высоту или внутреннее соотношение; или если 'width' имеет вычисленное значение 'auto', 'height' имеет некоторое другое вычисленное значение, а элемент имеет внутреннее соотношение; тогда используемое значение свойства 'width' равно:

(используемая высота) * (внутреннее соотношение)

В противном случае, если 'width' имеет вычисленное значение 'auto', но ни одно из условий, изложенных выше не имеет место, тогда используемое значение свойства 'width' равно 300px. Если значение 300px слишком большое для ширины устройства, агентам пользователей вместо этого следует использовать ширину наибольшего прямоугольника, который имеет соотношение 2:1 и соответствует ширине устройства.

Процентные внутренние ширины вначале оцениваются относительно ширины контейнера, если эта ширина сама не зависит от ширины замещаемого элемента. Если это имеет место, то процентные внутренние ширины такого элемента не могут быть разрешены и считается, что элемент не имеет внутренней ширины.

10.3.3 Незамещаемые элементы уровня блока в нормальном потоке

Следующие ограничения должно сжать используемые значения других свойств:

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + ширина полосы прокрутки (если присутствует) = ширина контейнера

Если значение 'width' отлично от 'auto', и 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + ширина полосы прокрутки (если присутствует) (плюс любые 'margin-left' или 'margin-right', значения которых отличны от 'auto') больше ширины контейнера, тогда любые значения 'auto' свойств 'margin-left' или 'margin-right' для следующих правил рассматриваются как нулевые.

Если все из вышеперечисленных свойств имеют вычисленное значение, отличное от 'auto', то говорят, что значения "перегружены", и одно из используемых значение будет не совпадать с его вычисленным значением. Если свойство 'direction' контейнера принимает значение 'ltr', то заданное значение свойства 'margin-right' игнорируется, а значение вычисляется, исходя из справедливости вышеописанного равенства. Если свойство 'direction' принимает значение 'rtl', то аналогичные действия вместо этого осуществляются со свойством 'margin-left'.

Если из всех вышеназванных свойств только одно принимает значение 'auto', то его используемое значение определяется путем решения данного равенства.

Если свойство 'width' принимает значение 'auto', то значения 'auto' всех других свойств устанавливаются равными '0', а значение свойства 'width' вычисляется из получившегося в результате этого равенства.

Если и свойство 'margin-left' и свойство 'margin-right' принимают значение 'auto', то их используемые значения совпадают. Это приводить к горизонтальному центрированию элемента относительно краев контейнера.

Значение "ширина полосы прокрутки" применимо только если агент пользователя использует полосы прокрутки как свой механизм прокрутки. См. описание свойства 'overflow'.

10.3.4 Заменяемые элементы уровня блока в нормальном потоке

Используемое значение свойства 'width' определяется также, как и для замещаемых строковых элементов. Затем применяются правила для замещаемых элементов уровня блока для определения полей.

10.3.5 Перемещаемые незамещаемые элементы

Если значение свойства 'margin-left' или 'margin-right' вычисляются как 'auto', то их используемое становится равным '0'.

Если значение свойства 'width' вычисляется как 'auto', то используемое значение равно ширине "уменьшить-для-заполнения".

Вычисление ширины "уменьшить-для-заполнения" подобно вычислению ширины ячейки таблицы с использованием алгоритма автоматического размещения таблицы. Примерно: вычисляется необходимая ширина путем форматирования содержимого без разрыва строк кроме случаев, когда разрывы строк указаны явно, а затем вычисляется необходимая минимальная ширина, например, пробуя применить все возможные разрывы строк. CSS 2.1 не определяет точный алгоритм. Проще говоря, находится доступная ширина: в данном случае, это ширина контейнера минус используемое значение свойств 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right', и ширина любых соответствующих полос прокрутки.

Затем ширина "уменьшить-для-заполнения" определяется в соответствии с условием: min(max(необходимая минимальная ширина, доступная ширина), необходимая ширина).

10.3.6 Перемещаемые замещаемые элементы

Если значение свойства 'margin-left' или 'margin-right' вычисляются как 'auto', то их используемое становится равным '0'. Используемое значение свойства 'width' определяется также, как и для замещаемых строковых элементов.

10.3.7 Абсолютно позиционированные незамещаемые элементы

В контексте данного раздела и последующих, термин "статическое положение" (элемента) означает, проще говоря, то какое положение элемент имел бы в нормальном потоке. Вернее:

Вместо того чтобы в действительности вычислять размеры этого гипотетического блока, агенты пользователей свободно могут осуществлять приблизительную оценку его возможного положения.)

В контексте вычисления статического положения, контейнер фиксировано позиционированного элемента является начальным контейнером вместо области просмотра, и следует предполагать, что все прокручиваемые блоки прокручены к из первоначальному положению.

Ограничение, которое определяет используемые значения этих элементов состоит в следующем:

'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' + ширина полосы прокрутки (если присутствует) = высота контейнера

Если все три свойства 'left', 'width', и 'right' имеют значение 'auto': Сначала любые значения 'auto' свойств 'margin-left' и 'margin-right' устанавливаются равными 0. Затем, если свойство 'direction' контейнера равно 'ltr' устанавливается значение 'left' в статическое положения и применяются правила номер три, приведенное ниже; в противном случае устанавливается значение 'right' в статическое положения и применяются правила номер один, приведенное ниже.

Если не все трех имеют значение 'auto': Если и 'margin-left' и 'margin-right' имеют значение 'auto', решается уравнение при дополнительном условии, что эти два поля имеют равные значения, если они при этом не примут отрицательные значения, в этом случае когда значение свойство 'direction' контейнера равно 'ltr' ('rtl'), значения свойств 'margin-left' ('margin-right') устанавливаются равными нулю и решается уравнение относительно 'margin-right' ('margin-left'). Если одно из свойств 'margin-left' или 'margin-right' имеет значение 'auto', то решается уравнение для этого значения. Если значения являются перегруженными, то игнорируются значения для 'left' (в случае, если свойство 'direction' контейнера имеет значение 'rtl') или 'right' (в случае, если свойство 'direction' имеет значение 'ltr') и решается для этого значения.

В противном случае, значения 'auto' свойств 'margin-left' и 'margin-right' устанавливаются равными 0, и выбирается одно из следующих шести правил, которое и применяется.

  1. 'left' и 'width' – 'auto', а 'right' – не 'auto', тогда ширина – уменьшить-для-заполнения. Затем проводят вычисления для 'left'
  2. 'left' и 'right' – 'auto', а 'width' – не 'auto', тогда если свойство 'direction' контейнера имеет значение 'ltr' устанавливается значение 'left' в статическое положение, в противном случае – устанавливается 'right' в статическое положение. Затем проводятся вычисления для 'left' (если 'direction' – 'rtl') или 'right' (если 'direction' – 'ltr').
  3. 'width' и 'right' – 'auto', а 'left' – не 'auto', тогда ширина – уменьшить-для-заполнения. Затем проводят вычисления для 'right'
  4. 'left' – 'auto', 'width' и 'right' – не 'auto', тогда проводят вычисления для 'left'
  5. 'width' – 'auto', 'left' и 'right' – не 'auto', тогда проводят вычисления для 'width'
  6. 'right' – 'auto', 'left' и 'width' – не 'auto', тогда проводят вычисления для 'width'

Вычисление ширины "уменьшить-для-заполнения" подобно вычислению ширины ячейки таблицы с использованием алгоритма автоматического размещения таблицы. Примерно: вычисляется необходимая ширина путем форматирования содержимого без разрыва строк кроме случаев, когда разрывы строк указаны явно, а затем вычисляется необходимая минимальная ширина, например, пробуя применить все возможные разрывы строк. CSS 2.1 не определяет точный алгоритм. Проще говоря, находится доступная ширина: она находится путем решения уравнения для 'width' после установки значения 'left' (в случае 1) или 'right' (в случае 3) равным 0.

Затем ширина "уменьшить-для-заполнения" определяется как: min(max(необходимая минимальная ширина, доступная ширина), необходимая ширина).

Значение "ширина полосы прокрутки" применимо только если агент пользователя использует полосы прокрутки как свой механизм прокрутки. См. описание свойства 'overflow'.

10.3.8 Абсолютно позиционируемые замещаемые элементы

В этом случае ситуация аналогична предыдущей за исключением того, что теперь элемент имеет внутреннее значение ширины. При этом последовательность подстановок имеет следующий вид:

  1. Используемое значение свойства 'width' определяется также, как и для замещаемых строковых элементов.
  2. Если и 'left' и 'right' имеют значение 'auto', то если свойство 'direction' контейнера имеет значение 'ltr', устанавливается 'left' в статическое положение; если же 'direction' – 'rtl', то 'right' устанавливается в статическое положение.
  3. Если свойство 'left' или 'right' имеет значение 'auto', то все значения 'auto' в свойствах 'margin-left' или 'margin-right' заменяются на '0'.
  4. Если в этом случае и 'margin-left' и 'margin-right' все еще имеют значение 'auto', уравнение решается с учетом дополнительного ограничения, согласно которому значения ширины обоих полей совпадают, если это не приведет к тому, что они примут отрицательные значения, в этом случае когда свойство 'direction' контейнера имеет значение 'ltr' ('rtl'), значение свойства 'margin-left' ('margin-right') устанавливается равным нулю и уравнение решается относительно 'margin-right' ('margin-left').
  5. Если на данном этапе в левой части уравнения имеется свойство со значением 'auto', то уравнение решается относительно этого значения.
  6. Если на этом этапе значения остаются перегруженными, то игнорируется также значение свойства 'left' (в случае, когда свойство 'direction' контейнера принимает значение 'rtl') или свойства 'right' (в случае, когда свойство 'direction' – 'ltr'), и решается уравнение относительно этого значения.

10.3.9 Незамещаемые 'inline-block' элементы в нормальном потоке

Если значение свойства 'width' – 'auto', то используемое значение равно ширине уменьшить-для-заполнения как для перемещаемого элемента.

Вычисляемое значение 'auto' для свойств 'margin-left' или 'margin-right' становится используемым значением '0'.

10.3.10 Заменяемые 'inline-block' элементы в нормальном потоке

Аналогично замещаемым строковым элементам.

10.4 Минимальное и максимальное значения ширины: 'min-width' и 'max-width'

'min-width'
Значение:  <длина> | <проценты> | inherit
Начальное значение:  0
Область применения:  все элементы, кроме незамещаемых элементов строкового уровня, строк таблиц и групп строк
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина
'max-width'
Значение:  <длина> | <проценты> | none | inherit
Начальное значение:  none
Область применения:  все элементы, кроме незамещаемых элементов строкового уровня, строк таблиц и групп строк
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина или 'none'

Эти два свойства позволяют разработчикам ограничивать диапазон значений ширины содержимого. Значения имеют следующий смысл:

<длина>
Задает фиксированное минимальное или максимальное используемое значение ширины.
<проценты>
Задает процентное соотношение для определения используемого значения. Процентное соотношение вычисляется относительно ширины сгенерированного контейнера блока. Если ширина контейнера отрицательная величина, то используемое значение равно нулю. Если ширина контейнера зависит от ширины этого элемента, то результирующее расположение не определяется в CSS 2.1.
none
(Только для свойства 'max-width') На ширину блока не накладывается никаких ограничений.

Отрицательные значения свойства 'min-width' и 'max-width' недопустимы.

В следующим алгоритме описано, как эти два свойства влияют на используемое значение свойства 'width':

  1. Предполагаемое используемое значение ширины (кроме 'min-width' и 'max-width') вычисляется по правилам, описанным далее в разделе "Вычисление значений ширины и полей".
  2. Если предполагаемое используемое значение ширины превышает значение свойства 'max-width', то снова применяются описанные выше правила, но на этот раз в качестве вычисляемого значения для свойства 'width' используется вычисляемое значение свойства 'max-width'.
  3. Если полученное в результате значение ширины не превышает значение свойства 'min-width', то применяются описанные выше правила, но на этот раз в качестве вычисляемого значения для свойства 'width' используется значение свойства 'min-width'.

Эти шаги не отражаются на действительных вычисляемых значениях вышеуказанных свойств.

Однако, для замещаемых элементов с внутренним соотношением и значениями свойств 'width' и 'height', установленными в 'auto', алгоритм вычислений следующий:

Выбираются из таблицы решенные значения ширины и высоты для соответствующих ограничений. Берется max-width и max-height как max(min, max) так, чтобы соблюдалось неравенство min ? max. В данной таблице w и h проставлены для результатов вычислений ширины и высоты с игнорированием свойств 'min-width', 'min-height', 'max-width' и 'max-height'. Обычно это внутренняя ширина и высота, но их может не быть для замещаемых элементов с внутренними соотношениями.

В случаях, когда ширина или высота задана явно, а остальные размеры установлены в 'auto', применение минимального или максимального ограничения к сторонам со значением 'auto' может вызвать конфликт между соблюдением явно заданного размера и соблюдением (неявного) соотношения сторон. Мнения в Рабочей группе по поводу решения данной проблемы расходятся: результату следует быть насколько возможно ближе (но не обязательно) к сохранению соотношения сторон, всегда соблюдая явно заданные ширину и высоту, или результату следует быть насколько возможно ближе (но не обязательно) к соблюдению явно заданного размера, всегда соблюдая соотношение сторон?

Это пример сценария такого случая: Рисунку с соотношением сторон 1:1 даны следующие объявления стиля;

width: 200px; min-height: 300px;

Если соблюдать первенство ширины над соотношением сторон, то изображение растянется до 200px в ширину и 300px в высоту. Если соблюдать первенство соотношения сторон над шириной, то изображение растянется до 300px в ширину и 300px в высоту.

Данный проект определяет первое поведение. Ни одному из этих способов еще не отдано предпочтений, и будут рассматриваться отклики от сообщества авторов по этой проблеме.

ОграничениеРешенная ширинаРешенная высота
none w h
w > max-width max-width max(max-width * h/w, min-height)
w < min-width min-width min(min-width * h/w, max-height)
h > max-height max(max-height * w/h, min-width) max-height
h < min-height min(min-height * w/h, max-width) min-height
(w > max-width) и (h > max-height), где (max-width/w ? max-height/h) max-width max(min-height, max-width * h/w)
(w > max-width) и (h > max-height), где (max-width/w > max-height/h) max(min-width, max-height * w/h) max-height
(w < min-width) и (h < min-height), где (min-width/w ? min-height/h) min(max-width, min-height * w/h) min-height
(w < min-width) и (h < min-height), где (min-width/w > min-height/h) min-width min(max-height, min-width * h/w)
(w < min-width) и (h > max-height) min-width max-height
(w > max-width) и (h < min-height) max-width min-height

Затем применяются правила из вышеизложенного раздела "Вычисления ширины и полей", как будто 'width' вычислено как это значение.

10.5 Высота содержимого: свойство 'height'

'height'
Значение:  <длина> | <проценты> | auto | inherit
Начальное значение:  auto
Область применения:  все элементы, кроме незамещаемых элементов строкового уровня, столбцов таблиц и групп столбцов
Наследование:  нет
Процентное задание значений:  см. нижеследующий текст
Устройства:  визуальные
Вычисляемое значение:  процентное или 'auto' (см. описание значения <percentage>) или абсолютная длина; 'auto', если свойство не применяется

Это свойство задает высоту содержимого блоков, порождаемых элементами уровня блока, строковыми блоками и замещаемыми элементами.

Данное свойство не применяется к незамещаемым элементам строкового уровня. Используемые вместо этого правила см. в разделе о вычислении высоты и полей для незамещаемых строковых элементов.

Значения имеют следующий смысл:

<длина>
Определяет высоту области содержимого используя значение длины.
<проценты>
Определяет высоту в процентах. Процентное соотношение вычисляется относительно высоты контейнера генерируемого блока. Если высота контейнера не задана явно (т.е. она зависит от высоты содержимого), и данный элемент не является абсолютно позиционированным, то значение вычисляется как 'auto'. Процентное соотношение высоты корневого элемента определяется относительно начального контейнера.
auto
Высота зависит от значений остальных свойств. См. следующие далее разделы.

Примите во внимание, что высота контейнера абсолютно позиционированного элемента зависит от размера самого элемента, и таким образом процентное соотношение высоты в таком элементе всегда может быть решено. Однако, может получиться так, что высота не будет известна до тех пор, пока не будут обработаны элементы, следующие в документе далее.

Использование отрицательных значений для свойства 'height' не допускается.

Пример(ы):

Например, следующее правило устанавливает высоту содержимого абзаца равной 100 пикселам:

p { height: 100px }

Абзацы, содержимым которых в высоту необходимо больше 100 пикселов, при отображении будут выходить за допустимые пределы в соответствии со свойством 'overflow'.

10.6 Вычисление значений высоты и полей

В зависимости от типа блока должны быть введено различие в вычислении значения свойств 'top', 'margin-top', 'height', 'margin-bottom' и 'bottom' для:

  1. незамещаемые элементы строкового уровня;
  2. замещаемые элементы строкового уровня;
  3. незамещаемые элементы уровня блока в нормальном потоке;
  4. замещаемые элементы уровня блока в нормальном потоке;
  5. незамещаемые перемещаемые элементы;
  6. замещаемые перемещаемые элементы;
  7. незамещаемые абсолютно позиционируемые элементы;
  8. замещаемые абсолютно позиционируемые элементы;
  9. незамещаемые 'inline-block' элементы в нормальном потоке
  10. замещаемые 'inline-block' элементы в нормальном потоке

Для пунктов 1-6 и 9-10, используемые значения 'top' и 'bottom', определяется правилами, изложенными в разделе 9.4.3.

Примечание: эти правила применяются к корневым элементам так же, как и к остальным элементам.

10.6.1 Незамещаемые элементы строкового уровня

Свойство 'height' не применяется. Высоту области содержимого следует основывать на шрифте, но данная спецификация не определяет то, как это делается. Агенты пользователя могут, например, использовать em-блок или максимально выступающий надстрочный и подстрочный элементы шрифта. (Последнее гарантировало бы, что глифы, выступающие выше или ниже em-блока будут находиться в пределах области содержимого, но приведет к созданию блоков с различными размерами для различных шрифтов; первое гарантировало бы, что авторы могут управлять стилями фона относительно свойства 'line-height', но приведет к тому, что глифы будут прорисовываться за пределами их области содержимого.)

Примечание: уровень 3 CSS будет вероятно включать свойство для выбора того, какой из размеров в шрифте будет использоваться для высоты содержимого.

Вертикальный отступ, граница и поле незамещаемых строковых блоков начинаются от верха и низа области содержимого, но не 'line-height'. Но только 'line-height' используется при вычислении высоты линейного блока.

В данной спецификации не определяется вычисление высоты области содержимого если используется более одного шрифта (это может произойти когда глифы находятся в различных шрифтах). Однако, предполагается, что высота выбрана такой, что область содержимого достаточно высока или для (1) em-блоков, или для (2) максимально выступающих надстрочных и подстрочных символов всех шрифтов в элементе. Примите во внимание, что в зависимости от выравнивания шрифта по базовой линии, она может быть большим чем любой из содержащихся размеров шрифта.

10.6.2 Заменяемые элементы строкового уровня, замещаемые элементы уровня блока в нормальном потоке, перемещаемые 'inline-block' элементы в нормальном потоке и перемещаемые замещаемые элементы

Если 'margin-top', или 'margin-bottom' имеют значение 'auto', их используемое значение равно 0.

Если и 'height' и 'width' имеют вычисленное значение 'auto' и элемент также имеет внутреннюю высоту, то эта внутренняя высота является используемым значением свойства 'height'.

Если и 'height' и 'width' имеют вычисленное значение 'auto', а элемент не имеет внутреннюю высоту, но имеет внутреннюю ширину или внутреннее соотношение; или если 'height' имеет вычисленное значение 'auto', 'width' имеет некоторое другое вычисленное значение, а элемент имеет внутреннее соотношение; тогда используемое значение свойства 'height' равно:

(используемая ширина) / (внутреннее соотношение)

В противном случае, если 'height' имеет вычисленное значение 'auto', но ни одно из вышеизложенных условий не соблюдено, то используемое значение свойства 'height' должно быть установлено равным высоте наибольшего прямоугольника с соотношением сторон 2:1, имеющего высоту, не превышающую 150px, и ширину, не превышающую ширину устройства.

Если эта высота задана явно, или если замещаемый элемент абсолютно позиционирован, то заданные в процентах внутренние высоты оцениваются относительно высоты контейнера. Если не имеет место ни одно из этих ограничений, то значения, заданные в процентах, для таких элементов не могут быть решены и такие элементы считается как не имеющие внутренней высоты.

Для элементов 'inline' и 'inline-block', блок поля используется при вычислении высоты линейного блока.

10.6.3 Незамещаемые элементы уровня блока в нормальном потоке со свойством 'overflow', вычисленным как 'visible'

Данный раздел также применим к незамещаемые элементы уровня блока в нормальном потоке, когда их свойство 'overflow' не вычислено как 'visible', но было распространено на область просмотра.

Если 'margin-top', или 'margin-bottom' имеют значение 'auto', их используемое значение равно 0. Если свойство 'height' имеет значение 'auto', то высота зависит от того, имеет ли элемент какие-либо дочерние элементы уровня блока и имеет ли он отступ или границы:

Если у него имеются только дочерние элементы строкового уровня, то высота равна расстоянию от верха самого верхнего линейного блока до низа самого нижнего линейного блока.

Если он имеет дочерние элементы уровня блока, то высота равна расстоянию от края верхней границы блока, сгенерированного самым верхним дочерним элементом уровня блока, который не имеет полей, перекрывающихся с ним, до края нижней границы блока, сгенерированного самым нижним дочерним элементом уровня блока, который не имеет полей, перекрывающихся с ним. Однако, если элемент имеет ненулевой верхний отступ и/или верхнюю границу, или является корневым элементом, то содержимое начинается от края верхнего поля самого верхнего дочернего элемента. (Первый случай выражает тот факт, что верхние и нижние поля элемента перекрываются с полями самого верхнего и самого нижнего дочерних элементов, в то время как во втором случае присутствие отступа/границы предотвращает верхние поля от перекрытия.) Аналогично, если элемент имеет ненулевой нижний отступ и/или нижнюю границу, тогда содержимое заканчивается на краю нижнего поля самого нижнего дочернего элемента.

При этом учитываются только дочерние элементы, принадлежащие нормальному потоку (т.е. перемещаемые и абсолютно позиционируемые блоки игнорируются, а относительно позиционируемые блоки рассматриваются без их смещений). Примите во внимание, что дочерние блоки могут быть безымянными структурными блоками.

10.6.4 Незамещаемые абсолютно позиционируемые элементы

В контексте данного раздела и последующих, термин "статическое положение" (элемента) означает, проще говоря, то какое положение элемент имел бы в нормальном потоке. Вернее, статическое положение для значения 'top' равно расстоянию от верхнего края контейнера до края верхнего поля гипотетического блока, который являлся бы первым блоком элемента, если бы его свойство 'position' имело значение 'static', а свойство 'float' – 'none'. Если гипотетический блок находится над контейнером, то упомянутое расстояние принимает отрицательное значение.

Вместо того чтобы в действительности вычислять размеры этого гипотетического блока, агенты пользователей свободно могут осуществлять приблизительную оценку его возможного положения.

В контексте вычисления статического положения, контейнер фиксировано позиционированного элемента является начальным контейнером вместо области просмотра.

Для абсолютно позиционируемых элементов используемые значения вертикальных размеров должны удовлетворять следующему ограничению:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' + высота полосы прокрутки (если присутствует) = высота контейнера

Если все три свойства 'top', 'height', и 'bottom' имеют значение 'auto', то значение 'top' устанавливается в статическое положение и применяется правило номер три, приведенное ниже.

Если ни одно из трех не имеет значение 'auto': Если и 'margin-top' и 'margin-bottom' имеют значения 'auto', то осуществляется решение уравнения с учетом дополнительного ограничения, согласно которому значения обоих полей совпадают. Если одно из свойств 'margin-top' или 'margin-bottom' имеет значение 'auto', то решается уравнение для этого значения. Если на данном этапе значения остаются перегруженными, то значение, принимаемое свойством 'bottom', игнорируется и решается уравнение относительно этого значения.

В противном случае, выбирается одно из следующих шести правил, которое и применяется.

  1. 'top' и 'height' – 'auto', а 'bottom' – не 'auto', тогда высота основана на содержимом, значения 'auto' для свойств 'margin-top' и 'margin-bottom' устанавливаются равными 0, и уравнение решается относительно 'top'
  2. 'top' и 'bottom' – 'auto', а 'height' – не 'auto', тогда 'top' устанавливается в статическое положение, значения 'auto' для свойств 'margin-top' и 'margin-bottom' устанавливаются равными 0, и уравнение решается относительно 'bottom'
  3. 'height' и 'bottom' – 'auto', а 'top' – не 'auto', тогда высота основана на содержимом, значения 'auto' для свойств 'margin-top' и 'margin-bottom' устанавливаются равными 0, и уравнение решается относительно 'bottom'
  4. 'top' – 'auto', а 'height' и 'bottom' – не 'auto', тогда значения 'auto' для свойств 'margin-top' и 'margin-bottom' устанавливаются равными 0, и уравнение решается относительно 'top'
  5. 'height' – 'auto', 'top' и 'bottom' – не 'auto', тогда значения 'auto' для свойств 'margin-top' и 'margin-bottom' устанавливаются равными 0, и уравнение решается относительно 'height'
  6. 'bottom' – 'auto', 'top' и 'height' – не 'auto', тогда значения 'auto' для свойств 'margin-top' и 'margin-bottom' устанавливаются равными 0, и уравнение решается относительно 'bottom'

Значение "ширина полосы прокрутки" применимо только если агент пользователя использует полосы прокрутки как свой механизм прокрутки. См. описание свойства 'overflow'.

10.6.5 Абсолютно позиционированные перемещаемые элементы

В этом случае ситуация аналогична предыдущей, за исключением того, что теперь элемент имеет внутреннее значение высоты. При этом последовательность подстановок имеет следующий вид:

  1. Используемое значение свойства 'height' определяется также, как и для замещаемых строковых элементов.
  2. Если и 'top' и 'bottom' имеют значение 'auto', свойство 'top' заменяется статическим положением элемента.
  3. Если 'bottom' имеет значение 'auto', любые значения 'auto' в свойствах 'margin-top' или 'margin-bottom' заменяются на '0'.
  4. Если на данном этапе и 'margin-top' и 'margin-bottom' все еще принимают значения 'auto', то осуществляется решение уравнения с учетом дополнительного ограничения, согласно которому значения обоих полей имеют одинаковое значение.
  5. Если на данном этапе в левой части уравнения имеется только одно свойство, принимающее значение 'auto', то осуществляется решение уравнения относительно этого значения.
  6. Если на данном этапе значения остаются перегруженными, то значение свойства 'bottom' игнорируется и решается уравнение относительно этого значения.

10.6.6 Сложные случаи

Данный раздел применяется к:

Если 'margin-top', или 'margin-bottom' имеют значение 'auto', их используемое значение равно 0. Если свойство 'height' имеет значение 'auto', то высота зависит от потомков элемента.

Для элементов 'inline-block', блок поля используется при вычислении высоты линейного блока.

10.6.7 Высота, установленная в 'auto' для корневых элементов контекста форматирования блока

В некоторых случаях (см. предыдущий раздел), высота элемента вычисляется следующим образом:

Если у него имеются только дочерние элементы строкового уровня, то высота равна расстоянию от верха самого верхнего линейного блока до низа самого нижнего линейного блока.

Если у него имеются дочерние элементы уровня блока, то высота равна расстоянию от края верхней границы самого верхнего блока дочернего элемента уровня блока до края нижней границы самого нижнего блока дочернего элемента уровня блока.

Абсолютно позиционированные дочерние элементы игнорируются, а относительно позиционированные блоки рассматриваются без их смещений. Примите во внимание, что дочерние блоки могут быть безымянными структурными блоками.

Дополнительно, если у элемента имеются любые перемещаемые потомки, край нижнего поля которых находится ниже низа, то высота увеличивается для того, чтобы вместить эти края. Принимаются во внимание только перемещаемые объекты, которые являются дочерними для самого элемента или для потомков в нормальном потоке, т.е. перемещаемые объекты внутри абсолютно позиционированных потомков или другие перемещаемые объекты во внимание не принимаются.

10.7 Минимальное и максимальное значения высоты: 'min-height' и 'max-height'

Иногда оказывается полезным ограничивать диапазон значений высоты элементов. Эту возможность предоставляют следующие два свойства:

'min-height'
Значение:  <длина> | <проценты> | inherit
Начальное значение:  0
Область применения:  все элементы, кроме незамещаемых элементов строкового уровня, столбцов таблиц и групп столбцов
Наследование:  нет
Процентное задание значений:  см. описание
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина
'max-height'
Значение:  <длина> | <проценты> | none | inherit
Начальное значение:  none
Область применения:  все элементы, кроме незамещаемых элементов строкового уровня, столбцов таблиц и групп столбцов
Наследование:  нет
Процентное задание значений:  см. описание
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина или 'none'

Эти два свойства позволяют разработчикам ограничивать диапазон значений высоты блоков. Значения имеют следующий смысл:

<длина>
Задает фиксированное минимальное и максимальное вычисляемое значение высоты.
<проценты>
Задает процентное соотношение для определения используемого значения. Процентное соотношение вычисляется относительно высоты контейнера генерируемого блока. Если высота контейнера не определена явно (например, если она зависит от высоты содержимого), и этот элемент не является абсолютно позиционированным, процентное значение рассматривается как '0' (для 'min-height') или 'none' (для 'max-height').
none
(Только для свойства 'max-height') На высоту блока не накладывается никаких ограничений.

Отрицательные значения свойств 'min-height' и 'max-height' недопустимы.

В следующим алгоритме описано, как эти два свойства влияют на используемое значение свойства 'height':

  1. Предполагаемое используемое значение высоты (кроме 'min-height' и 'max-height') вычисляется по правилам, описанным выше в разделе "Вычисление значений высоты и полей".
  2. Если предполагаемое значение высоты превышает значение свойства 'max-height', то снова применяются описанные выше правила, но на этот раз в качестве вычисляемого значения свойства 'height' используется значение свойства 'max-height'.
  3. Если вычисленная высота не превосходит значение свойства 'min-height', то снова применяются описанные выше правила, но на этот раз в качестве вычисляемого значения свойства 'height' используется значение свойства 'min-height'.

Эти шаги не отражаются на действительных вычисляемых значениях вышеуказанных свойств.

Однако, для замещаемых элементов, значения свойств и 'width' и 'height' которых вычислено как 'auto', используется алгоритм, изложенный выше в разделе Минимальное и максимальное значения ширины, для того, чтобы найти используемые значения ширины и высоты. Затем применяются правила, изложенные выше в разделе "Определение значений высоты и полей", используя получившиеся в результате значения ширины и высоты так, как будто они являются вычисляемыми значениями.

10.8 Вычисление высоты строки: свойства 'line-height' и 'vertical-align'

Как описано в разделе, посвященном контексту форматирования строк, агенты пользователей преобразуют строковые блоки в набор вертикально упорядоченных линейных блоков. Высота линейных блоков определяется следующим образом:

  1. Вычисляется высота каждого строкового блока в линейном блоке (см. раздел "Вычисление значений высоты и полей" и описание свойства 'line-height').
  2. В соответствии с их свойствами 'vertical-align' осуществляется вертикальное упорядочение строковых блоков.
  3. Высота линейного блока равна расстоянию от наивысшего верха блока до самого нижнего низа блока.
  4. Если получившаяся в результате высота меньше минимальной высоты линейных блоков для этого блока, как определено свойством line-height, то высота увеличивается до этой минимальной высоты.

Пустые элементы строкового уровня генерируют пустые строковые блоки, которые, тем не менее, по-прежнему имеют поля, границы, отступы и высоту строк, а поэтому оказывают влияние на вышеописанные вычисления ничуть не меньше, чем блоки, обладающие содержимым.

10.8.1 Межстрочный интервал и полуинтервал

Так как значение свойства 'line-height' может отличаться от высоты области содержимого, то может иметь место пустое пространство выше и ниже представленного глифа. Разность между высотой содержимого и вычисляемым значением свойства 'line-height' называется межстрочным интервалом. Половина межстрочного интервала называется полуинтервалом.

Агенты пользователей осуществляют вертикальное центрирование глифов в строковых блоках, добавляя сверху и снизу полуинтервал. Например, если высота части текста равна '12pt', а значение свойства 'line-height' равно '14pt', то следует добавить 2pt дополнительного пространства: 1pt сверху и 1pt снизу от букв. (Эта процедура также применяется и к пустым блокам, если предположить, что пустой блок содержит бесконечно узкую букву.)

Если значение свойства 'line-height' меньше высоты содержимого, то в итоге высота строкового блока будет меньше размера шрифта, а отображаемые глифы "расплывутся" за пределы этого блока. Если такой блок соприкасается с краями линейного блока, то отображаемые глифы могут также "наплывать" на границы смежного линейного блока.

Несмотря на то, что поля, границы и отступы незамещаемых элементов не учитываются при вычислении высоты линейного блока, он все равно отображаются вокруг строкового блока. Это означает, что если высота, определенная свойством 'line-height', меньше высоты содержимого контейнеров, то фон и цвет отступов и границ могут "наплывать" на смежные линейные блоки. Агентам пользователей следует представлять блоки в порядке их следования в документе. В этом случае границы следующих строк будут прорисовываться после границ и текста предыдущих строк.

'line-height'
Значение:  normal | <число> | <длина> | <проценты> | inherit
Начальное значение:  normal
Область применения:  все элементы
Наследование:  да
Процентное задание значений:  относительно размера шрифта элемента
Устройства:  визуальные
Вычисляемое значение:  для <длины> и <процентов> – абсолютное значение; в остальных случаях – как определено

Для элементов уровня блока, ячеек таблицы, заголовка таблицы или строковых блоков, содержимое которого состоит из элементов строкового уровня, 'line-height' определяет минимальную высоту линейных блоков в элементе. Минимальная высота состоит из минимальной высоты выше базовой линии блока и минимальной глубины ниже ее, как будто каждый линейный блок начинается со строкового блока нулевой ширины со свойствами шрифта и высоты строки, которые имеет блок (чей TEX называется "подпорка").

В элементе строкового уровня, 'line-height' определяет высоту, которая используется при вычислении высоты линейного блока (за исключением замещаемых элементов, для которых высота блока задается свойством 'height').

Значения данного свойства имеют следующий смысл:

normal
Сообщает агентам пользователей о необходимости задать "адекватную" величину используемого значения, исходя из размера шрифта элемента. Это значение означает то же, что и <число>. Для 'normal' рекомендуется задавать используемое значение в диапазоне от 1.0 до 1.2. Вычисляемое значение равно 'normal'.
<длина>
Заданная длина используется в вычислении высоты линейного блока. Отрицательные значения не допускаются.
<число>
Используемым значением данного свойства является некоторое число, умноженное на значение размера шрифта данного элемента. Отрицательные значения не допускаются. Вычисляемое значение такое же, как и заданное значение.
<проценты>
Вычисляемым значением данного свойства является соответствующее процентное значение, умноженное на вычисленное значение размера шрифта данного элемента. Отрицательные значения не допускаются.

Пример(ы):

В представленном ниже примере в результате выполнения любого из трех правил получается одно и то же значение высоты строки:

div { line-height: 1.2; font-size: 10pt }     /* число */
div { line-height: 1.2em; font-size: 10pt }   /* длина */
div { line-height: 120%; font-size: 10pt }    /* проценты */

Если элемент содержит текст, отображаемый с использованием нескольких типов шрифтов, то значение свойства 'line-height' агент пользователя может определить, исходя из наибольшего значения размера шрифта.

Обычно если свойство 'line-height' принимает только одно значение для всех строковых блоков в абзаце (и в нем нет высоких графических объектов), то согласно вышесказанному базовые линии следующих друг за другом строк будут находиться друг от друга на расстоянии, в точности равном значению свойства 'line-height'. Это оказывается важным, когда необходимо осуществить выравнивание столбцов текста, отображаемого разными шрифтами, например, в таблице.

'vertical-align'
Значение:  baseline | sub | super | top | text-top | middle | bottom | text-bottom | <проценты> | <длина> | inherit
Начальное значение:  baseline
Область применения:  строковые и элементы 'table-cell'
Наследование:  нет
Процентное задание значений:  относительно значения свойства 'line-height' самого элемента
Устройства:  визуальные
Вычисляемое значение:  для <длины> и <процентов> – абсолютное значение; в остальных случаях – как определено

Данное свойство влияет на то, как блокам, порожденным строковыми элементами, будет назначаться позиция в вертикальной плоскости внутри линейного блока.

Примечание. Значения данного свойства имеют несколько иной смысл применительно к таблицам. Дополнительную информацию можно найти в разделе об алгоритмах определения высоты таблицы.

Следующие значения имеют значение только при рассмотрении относительно родительского элемента строкового уровня, или относительно подпорки родительского элемента уровня блока, ячейки таблицы, заголовка таблицы или строкового уровня.

baseline
Осуществляется выравнивание базовой линий блока относительно базовой линии его родительского блока. Если у блока нет базовой линии, то выполняется выравнивание его края нижней границы с базовой линией родительского блока.
middle
Осуществляется выравнивание средней по вертикали точки блока относительно уровня базовой линии родительского блока в сумме с половиной x-высоты родительского блока.
sub
Осуществляется смещение базовой линии блока вниз до надлежащего уровня, отведенного для нижних индексов блока, порожденного родительским элементом. (Это значение не влияет на размер шрифта текста элемента.)
super
Осуществляется смещение базовой линии блока вверх до надлежащего уровня, отведенного для верхних индексов блока, порожденного родительским элементом. (Это значение не влияет на размер шрифта текста элемента.)
text-top
Выравнивается верх блока с верхом области содержимого родительского элемента (см. 10.6.1).
text-bottom
Выравнивается низ блока с низом области содержимого родительского элемента (см. 10.6.1).
<проценты>
Осуществляется смещение блока на заданную величину (процент от значения свойства 'line-height') вверх (положительное значение) или вниз (отрицательное значение). Значение '0%' аналогично значению 'baseline'.
<длина>
Осуществляется смещение блока на заданную величину вверх (положительное значение) или вниз (отрицательное значение). Значение '0cm' аналогично значению 'baseline'.

Следующие значения выравнивают элемент относительно линейного блока. Так как элемент может иметь дочерние элементы, выровненные относительно него (которые в свою очередь могут иметь потомков, выровненных относительно них), эти значения используют ограничения поддерева выравнивания. Поддерево выравнивания строкового элемента содержит этот элемент и поддерево выравнивания всех дочерних строковых элементов, вычисленное значение свойства 'vertical-align' которых не равно 'top' или 'bottom'. Верх дерева выравнивания выше верха блоков в поддереве, а низ – аналогично.

top
Осуществляется выравнивание верха поддерева выравнивания с верхом линейного блока.
bottom
Осуществляется выравнивание низа поддерева выравнивания с низом линейного блока.

Базовая линия элемента 'inline-table' является базовой линией первой строки таблицы.

Базовая линия элемента 'inline-block' является базовой линией его последнего линейного блока в нормальном потоке, если он не имеет также и in-flow линейные блоки или если его свойство 'overflow' имеет вычисленное значение, отличное от 'visible', то тогда в этом случае базовая линия является краем нижнего поля.