8 Модель представления документа в виде блоков

Содержание

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

8.1 Размеры блока

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

Рисунок, иллюстрирующий взаимное расположение содержимого, отступов, границ и полей.   [D]

Поля, границы и отступы могут быть разбиты на левые, правые, верхние и нижние сегменты (например, на приведенном рисунке "LM" обозначает левое поле, "RP" - отступ справа, а "TB" - верхнюю границу).

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

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

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

Размеры области содержимого блока – ширина содержимого и высота содержимого – зависят от нескольких факторов: установлены ли у элемента, генерирующего блок, такие свойства, как 'width' и 'height', содержит ли блок текст или другие блоки, является ли блок таблицей и т.д. Ширина и высота блока обсуждаются в разделе Подробное описание модели визуального форматирования.

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

8.2 Примеры полей, отступов и границ

Приводимый далее пример иллюстрирует сосуществование полей, отступов и границ. Следующий HTML-документ:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
  <HEAD>
    <TITLE>Примеры полей, отступов и границ</TITLE>
    <STYLE type="text/css">
      UL { 
        background: yellow; 
        margin: 12px 12px 12px 12px;
        padding: 3px 3px 3px 3px;
                                     /* Границы не определены */
      }
      LI { 
        color: white;                /* цвет текста – белый */ 
        background: blue;            /* Содержимое, отступы будут синими */
        margin: 12px 12px 12px 12px;
        padding: 12px 0px 12px 12px; /* Обратите внимание: правый отступ - 0px */
        list-style: none             /* без глифов перед элементами списка */
                                     /* Границы не установлены */
      }
      LI.withborder {
        border-style: dashed;
        border-width: medium;        /* определяется ширина границы со всех сторон */
        border-color: lime;
      }
    </STYLE>
  </HEAD>
  <BODY>
    <UL>
      <LI>Первый элемент списка
      <LI class="withborder">Второй элемент списка имеет большую длину,
           для того чтобы проиллюстрировать процесс переноса.
    </UL>
  </BODY>
</HTML>

порождает дерево документа, в котором, помимо прочего, имеется элемент UL, обладающий двумя дочерними элементами LI.

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

Взаимосвязь между полями, отступами и границами родительского и дочернего элементов.   [D]

Обратите внимание на следующее:

8.3 Свойства полей: 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', и 'margin'

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

Свойства, описанные в этом разделе, относятся к типу значений <ширина поля>, которое может принимать одно из следующих значений:

<длина>
Определяет фиксированное значение ширины.
<проценты>
Процентное соотношение, вычисляемое относительно ширины контейнера сгенерированного блока. Примите во внимание, что это так же справедливо для свойств 'margin-top' и 'margin-bottom'. Ширина контейнера зависит от этого элемента, поэтому результирующее расположение не определяется в CSS 2.1.
auto
Подробную информацию можно найти в разделе об определении поперечных размеров и полей.

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

'margin-top', 'margin-bottom'
Значение:  <ширина поля> | inherit
Начальное значение:  0
Область применения:  все элементы, за исключением элементов с типом отображения в таблице, отличном от table-caption, table и inline-table
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина

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

'margin-right', 'margin-left'
Значение:  <ширина поля> | inherit
Начальное значение:  0
Область применения:  все элементы, за исключением элементов с типом отображения в таблице, отличном от table-caption, table и inline-table
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина

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

Пример(ы):

h1 { margin-top: 2em }
'margin'
Значение:  <ширина поля>{1,4} | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  все элементы, за исключением элементов с типом отображения в таблице, отличном от table-caption, table и inline-table
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Свойство 'margin' является стенографическим и используется в таблицах стилей для одновременной настройки следующих свойств: 'margin-top', 'margin-right', 'margin-bottom', и 'margin-left'.

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

Пример(ы):

body { margin: 2em }         /* ширина всех полей установлена в 2em */
body { margin: 1em 2em }     /* верхнее и нижнее = 1em, правое и левое = 2em */
body { margin: 1em 2em 3em } /* верхнее = 1em, правое = 2em, нижнее = 3em, левое = 2em, */

Последнее правило верхнего примера равнозначно следующему:

body {
  margin-top: 1em;
  margin-right: 2em;
  margin-bottom: 3em;
  margin-left: 2em;        /* копируется значение противоположной стороны (правой) */
}

8.3.1 Перекрывающиеся поля

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

В CSS 2.1 горизонтальные поля никогда не перекрываются.

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

Нижнее поле in-flow элемента уровня блока всегда соседствует с верхним полем его следующего in-flow сестринского элемента уровня блока, кроме случая, когда у сестринского элемента имеется зазор.

Верхнее поле in-flow элемента уровня блока соседствует с верхним полем его первого in-flow дочернего элемента уровня блока, если у элемента нет верхней границы, нет верхнего отступа, и если дочерний элемент не имеет зазора.

Нижнее поле in-flow элемента уровня блока со свойством 'height', установленным в 'auto', и свойством 'min-height', имеющим значение меньше, чем используемая высота элемента, и свойство 'max-height' имеет значение выше, чем используемая высота элемента, соседствует с нижним полем его последнего in-flow дочернего элемента уровня блока, если элемент не имеет нижнего отступа или границы.

Собственные поля элемента примыкают друг к другу если свойство 'min-height' имеет нулевое значение, и он не имеет ни вертикальных границ, ни вертикальных отступов, и его свойство 'height' имеет значение или 0 или 'auto', и он не продолжает линейный блок, и все поля (если имеются) его in-flow дочерних элементов – смежные.

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

Перекрытие основывается на используемом значении свойств 'padding', 'margin', и 'border' (т.е., после разрешения любых процентных соотношений). Перекрывающееся поле рассчитывается через используемое значение различных полей.

Более подробную информацию о перекрывающихся полях можно найти в примерах полей, отступов и границ.

8.4 Свойства отступов: 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', и 'padding'

Свойства отступов позволяют определять ширину области отступов блока. Свойство 'padding' является стенографическим и позволяет устанавливать ширину всех четырех сегментов отступа одновременно, в то время как остальные свойства относятся только к отдельным сегментам.

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

<длина>
Определяет фиксированное значение ширины.
<проценты>
Процентное соотношение, вычисляемое относительно ширины контейнера сгенерированного блока, даже для 'padding-top' и 'padding-bottom'. Ширина контейнера зависит от этого элемента, поэтому результирующее расположение не определяется в CSS 2.1.

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

'padding-top', 'padding-right', 'padding-bottom', 'padding-left'
Значение:  <ширина отступа> | inherit
Начальное значение:  0
Область применения:  Все элементы, кроме table-row-group, table-header-group, table-footer-group, table-row, table-column-group и table-column
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  процентное соотношение как определено, или абсолютная длина

Эти свойства устанавливают значение ширины верхнего, правого, нижнего и левого отступов блока.

Пример(ы):

blockquote { padding-top: 0.3em }
'padding'
Значение:  <ширина отступа>{1,4} | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  Все элементы, кроме table-row-group, table-header-group, table-footer-group, table-row, table-column-group и table-column
Наследование:  нет
Процентное задание значений:  относительно ширины контейнера
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Свойство 'padding' является стенографическим и используется в таблицах стилей для одновременной настройки следующих свойств: 'padding-top', 'padding-right', 'padding-bottom', и 'padding-left'.

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

Цвет или изображение, используемые для оформления фона отступов, задаются с помощью свойства 'background':

Пример(ы):

h1 { 
  background: white; 
  padding: 1em 2em;
} 

В приведенном примере ширина вертикальных отступов ('padding-top' и 'padding-bottom') равна '1em', а горизонтальных ('padding-right' и 'padding-left') – '2em'. Единица измерения 'em' задается относительно размера шрифта элемента: '1em' эквивалентно размеру используемого шрифта.

8.5 Свойства границы

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

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

8.5.1 Ширина границы: 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width', и 'border-width'

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

thin
Тонкая граница.
medium
Граница средней толщины.
thick
Толстая граница.
<длина>
Толщина границы задается явным значением. Явные значения ширины границы не могут быть отрицательными.

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

'thin' <='medium' <= 'thick'.

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

'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width'
Значение:  <ширина границы> | inherit
Начальное значение:  medium
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  абсолютная длина; '0' если стиль границ – 'none' или 'hidden'

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

'border-width'
Значение:  <ширина границы>{1,4} | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Это свойство является стенографическим и используется в таблицах стилей для одновременной установки следующих свойств: 'border-top-width', 'border-right-width', 'border-bottom-width', и 'border-left-width'.

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

Пример(ы):

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

h1 { border-width: thin }                   /* thin thin thin thin */
h1 { border-width: thin thick }             /* thin thick thin thick */
h1 { border-width: thin thick medium }      /* thin thick medium thick */

8.5.2 Цвет границы: 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color', и 'border-color'

Свойства цвета границы определяют цвет границы блока.

'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color'
Значение:  <цвет> | transparent | inherit
Начальное значение:  значение свойства 'color'
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  если берется из свойства 'color', то вычисленное значение свойства 'color'; в противном случае - как определено
'border-color'
Значение:  [ <цвет> | transparent ]{1,4} | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Свойство 'border-color' определяет цвет четырех границ. Значения имеют следующий смысл:

<color>
Определяет значение цвета.
transparent
Граница прозрачна (хотя она и может иметь ширину).

Свойство 'border-color' может иметь от одного до четырех значений, каждое из которых присваивается различным сегментам границы подобно тому, как это происходит у свойства 'border-width'.

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

Пример(ы):

В следующем примере граница представляется сплошной черной линией.

p { 
  color: black; 
  background: white; 
  border: solid;
}

8.5.3 Стиль границы: 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style' и 'border-style'

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

none
Нет границ; нулевая ширина границы.
hidden
Подобно значению 'none', за исключением сценария разрешения конфликтов для элементов таблиц.
dotted
Границей является ряд точек.
dashed
Границей является пунктирная линия.
solid
Границей является сплошная линия.
double
Границей является двойная сплошная линия. Сумма толщин двух линий и расстояния между ними равна значению 'border-width'.
groove
Граница отображается вдавленной линией..
ridge
Противоположно значению 'groove': граница отображается выпуклой линией.
inset
Границы делают блок как бы вдавленным.
outset
Противоположно значению 'inset': границы делают блок как бы выпуклым.

Все границы прорисовываются поверх фона блока. Цвет прорисовки границ для значений 'groove', 'ridge', 'inset' и 'outset' следует выбирать исходя из свойства 'border-color' элемента, но агенты пользователей могут использовать свои собственные алгоритмы для вычисления используемого значения цвета. Например, если свойство 'border-color' имеет значение 'silver', то агент пользователя может использовать градиент цвета от белого до темно-серого для отображения границ.

'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style'
Значение:  <стиль границы> | inherit
Начальное значение:  none
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  как определено
'border-style'
Значение:  <стиль границы>{1,4} | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Свойство 'border-style' определяет стиль всех четырех границ. Оно может иметь от одного до четырех значений, каждое из которых присваивается различным сегментам границы подобно тому, как это происходит у свойства 'border-width', описанного выше.

Пример(ы):

#xy34 { border-style: solid dotted }

В примере, приведенном выше, горизонтальные границы будут иметь стиль 'solid', а вертикальные - стиль 'dotted'.

Так как начальное значение стиля границы равно 'none', то она не будет видна до тех пор, пока для нее не будет установлен какой-либо стиль.

8.5.4 Стенографические свойства границ: 'border-top', 'border-right', 'border-bottom', 'border-left' и 'border'

'border-top', 'border-right', 'border-bottom', 'border-left'
Значение:  [ <ширина границы> || <стиль границы> || <'border-top-color'> ] | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Данное свойство является стенографическим свойством для настроек ширины, стиля и цвета для верхнего, правого, нижнего и левого сегментов границы блока.

Пример(ы):

h1 { border-bottom: thick solid red }

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

H1 { border-bottom: thick solid }
'border'
Значение:  [ <ширина границы> || <стиль границы> || <'border-top-color'> ] | inherit
Начальное значение:  см. каждое свойство в отдельности
Область применения:  все элементы
Наследование:  нет
Процентное задание значений:  Н/Д
Устройства:  визуальные
Вычисляемое значение:  см. каждое свойство в отдельности

Свойство 'border' является стенографическим для одновременного определения ширины, цвета и стиля всех четырех границ блока. В отличие от стенографических свойств 'margin' и 'padding', свойство 'border' не может устанавливать различные значения для четырех сегментов границы. Чтобы это сделать, необходимо использовать другие свойства границы.

Пример(ы):

Например, первое правило эквивалентно набору четырех правил, приведенных после него:

p { border: solid red }
p {
  border-top: solid red;
  border-right: solid red;
  border-bottom: solid red;
  border-left: solid red
}

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

Пример(ы):

Рассмотрим следующий пример:

blockquote {
  border: solid red;
  border-left: double;
  color: black;
}

В этом примере левый сегмент границы отображается черным цветом, в то время как все остальные сегменты - красным. Это обусловлено действием свойства 'border-left', определяющего ширину, стиль и цвет левого сегмента. Так как свойство 'border-left' не указывает значение цвета, то последнее будет заимствовано из свойства 'color'. Тот факт, что свойство 'color' было определено после свойства 'border-left' , в данном случае не имеет особого значения.

8.6 Модель представления документа в виде блоков для строковых элементов в двунаправленном содержимом

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

Если свойство элемента 'direction' имеет значение 'ltr', то крайний левый сгенерированный блок первого линейного блока, в котором представлен элемент, имеет левое поле, левую границу и левый отступ, а крайний правый сгенерированный блок последнего линейного блока, в котором представлен элемент, имеет правый отступ, правую границу и правое поле.

Если свойство элемента 'direction' имеет значение 'rtl', то крайний правый сгенерированный блок первого линейного блока, в котором представлен элемент, имеет правый отступ, правую границу и правое поле, а крайний левый сгенерированный блок последнего линейного блока, в котором представлен элемент, имеет левое поле, левую границу и левый отступ.