8.3.1 Объединение полей.

Опубликовано: 7 марта 2013      Перевод:

Перевод параграфа 8.3.1 спецификации CSS2.1 : Collapsing margins.

В CSS прилегающие поля двух или более боксов (которые как могут быть, так могут и не быть дочерними боксами одного предка) могут «сливаться», образуя одно поле. О полях, которые таким образом «сливаются» говорят, что они объединяются, а полученное в результате этого поле называют объединённым.

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

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

Прилегающие поля горизонтально расположенных блоков не объединяются.

Два поля являются прилегающими тогда и только тогда:

  • когда оба принадлежат боксам блочного уровня, находящимся в общем потоке документа и одном блочном контексте форматирования;
  • когда их не разделяет граница элемента, его внутренний отступ, а также отсутствует отменяющий обтекание интервал и строчные боксы (Имейте в виду, что некоторые фантомные, строчные боксы с нулевой высотой, предусмотренные параграфом 9.4.2 в данном случае игнорируются.);
  • когда оба образуют грани вертикально прилегающих боксов, то есть являются участниками одной из следующих комбинаций:
    • верхнее поле бокса элемента и верхнее поле, образуемое его первым дочерним поточным элементом;
    • нижнее поле бокса элемента и верхнее поле, образуемое боксом его следующего поточного родственного элемента одного уровня;
    • нижнее поле бокса последнего поточного дочернего элемента и нижнее поле, образуемое его родительским элементом, вычисленным значением высоты которого является auto;
    • верхнее и нижнее поля бокса элемента, который не образует новый контекст блочного форматирования, вычисленное значение для свойства min-height которого равно нулю, для свойства height равно нулю или auto, а также не имеющего поточных дочерних элементов;

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

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

Из вышеупомянутых правил следует что:

  • Поля плавающего бокса не объединяются с полями каких-либо других боксов (даже с полями его собственных дочерних элементов).
  • Поля элементов, создающих новый контекст блочного форматирования (такие как плавающие и элементы, значение свойства overflow которых отлично от visible) не объединяются с полями их собственных дочерних поточных элементов.
  • Поля абсолютно позиционированных боксов никогда не участвуют в слиянии полей (даже с полями, образуемыми их собственными дочерними поточными элементами).
  • Поля внутристрочных блочных боксов никогда не объединяются (даже с полями их собственных дочерних поточных элементов).
  • Нижнее поле поточного блочного элемента всегда объединяется с верхним полем блочного соседнего родственного элемента того же уровня, входящего в общий поток документа, за исключением случая, когда этот родственный элемент предусматривает наличие отменяющего обтекание интервала.
  • Верхнее поле поточного блочного элемента объединяется с верхним полем его первого дочернего элемента блочного уровня, также входящего в общий поток в том случае, если у этого элемента нет верхней границы, верхнего отступа и его дочерний элемент не образует отменяющего обтекание интервала.
  • Нижнее поле поточного блочного бокса, свойство height которого имеет значение auto и свойство min-height равно нулю, сливается с нижним полем его последнего поточного дочернего элемента, если рассматриваемый бокс не содержит нижнего отступа, нижней границы и нижнее поле его дочернего элемента не объединяется с верхним полем, которое принадлежит отменяющему обтекание элементу.
  • Поля, образуемые боксом одного элемента, объединяются в том случае, если он не содержит верхних и нижних внутренних отступов и границ, его свойство min-height равно нулю, свойство height принимает значение auto или равно нулю, а также, если этот элемент не содержит ни одного строчного бокса и поля всех его дочерних поточных элементов (если таковые имеются) сливаются.

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

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

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

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