Концептуально правила CSS применяются к элементам документа в том порядке, в котором они появляются в HTML, т. Е. При предварительном обходе дерева DOM. Исторически сложилось так, что CSS можно было применять во время загрузки документа, но даже с динамическим HTML и динамическим CSS, есть преимущества в производительности для возможности применения CSS за один проход.
Именно поэтому в CSS нет селекторов для «A, за которым следует B» или «A, который содержит B», тогда как можно сказать «A, которому предшествует B» или «A, содержащийся внутри B». ", потому что в последних случаях A предшествует B в обходе предзаказа.
Вертикальное центрирование затруднено, потому что во время обработки CSS для дочернего элемента (элемента, который должен быть центрирован), высоты родительского и дочернего элементов (два значения, необходимые для вычисления верхнего смещения дочернего элемента) неизвестны, поскольку они оба зависят от элементов, которые еще не были обработаны.
Зависимость от высоты родительского элемента преодолевается абсолютным позиционированием: top: 50%
. Это эффективно откладывает вычисление вертикального смещения до тех пор, пока не будет известна высота родительского элемента.
Аналогично, CSS3-преобразования могут учитывать рост потомка: transform: translateY(-50%)
. До CSS3 вместо этого обычно использовался отрицательный margin-top
, но для этого требовалось установить фиксированную высоту дочернего элемента.