Концептуально правила 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
, но для этого требуется установить фиксированную высоту для дочернего элемента.
Я предполагаю, что это потому, что браузер может легко узнать ширину страницы, но длина изменяется в соответствии с содержанием. – imgx64
Это то, что я имею в виду с помощью алгоритмов - ширина также может быть изменена динамически, но CSS продолжает работать. Почему не для вертикальных изменений? – Ben