Ответ 1
Это правильное поведение. 1body
не сразу занимает всю высоту viewport, даже если он появляется, когда вы используете только фон для последнего. Фактически элемент html
будет зависеть от фона body
, если вы не дадите ему свой собственный фон, а html
передаст это в окно просмотра:
Тем не менее, вы можете наложить любое фоновое изображение на фоновый цвет на один элемент (либоФон корневого элемента становится фоном холста, а его область рисования фона распространяется на весь холст, хотя любые изображения имеют размер и расположение относительно корневого элемента, как если бы они были нарисованы только для этого элемента. (Другими словами, область фонового позиционирования определяется как для корневого элемента.) Если значение "background-color" для корня "прозрачно", цвет фона холста зависит от UA. Корневой элемент снова не нарисовал этот фон, т.е. Используемое значение его фона прозрачно.
Для документов, корневым элементом которых является элемент HTML
html
или элемент XHTMLhtml
: если вычисленное значение "background-image на корневом элементе" равно "none", а его "фоновый цвет" прозрачен, пользователь агенты должны вместо этого распространять вычисленные значения свойств фона из этого элемента сначала HTMLbody
или XHTMLbody
дочерний элемент. Используемые значения этих свойств фона элементаbody
являются их начальными значениями, а распространяемые значения обрабатываются так, как если бы они были указаны в корневом элементе. Рекомендуется, чтобы авторы HTML-документов указывали фон canvas для элементаbody
, а не элементhtml
.
html
или body
), не полагаясь на два элемента - просто используйте background-color
и background-image
или объединить их в сокращенном свойстве background
:
body {
background: #ddd url(background.png) center top no-repeat;
}
Если вы хотите объединить два фоновых изображения, вам нужно опираться на несколько фонов. Для этого есть всего два дня:
-
В CSS2, это то, где удобно стилизовать оба элемента: просто установите фоновое изображение на
html
и другое изображение наbody
, которое вы хотите наложить поверх первого. Чтобы фоновое изображение на дисплеяхbody
отображалось на полной высоте окна просмотра, вам необходимо также применитьheight
иmin-height
:html { height: 100%; background: #ddd url(background1.png) repeat; } body { min-height: 100%; background: transparent url(background2.png) center top no-repeat; }
Кстати, причина, по которой вам нужно указывать
height
иmin-height
наhtml
иbody
соответственно, - это потому, что ни один элемент не имеет внутренней высоты. Оба по умолчанию равныheight: auto
. Он имеет высоту 100%, поэтомуheight: 100%
берется из окна просмотра, а затем применяется кbody
как минимум, чтобы разрешить прокрутку содержимого. -
В CSS3 синтаксис был расширен, поэтому вы можете объявить несколько значений фона в одном свойстве, устраняя необходимость применить фоны к нескольким элементам (или отрегулировать
height
/min-height
):body { background: url(background2.png) center top no-repeat, #ddd url(background1.png) repeat; }
Единственное предостережение заключается в том, что на одном многослойном фоне только нижний слой может иметь фоновый цвет. В этом примере вы можете увидеть, что значение
transparent
отсутствует на верхнем уровне.И не волнуйтесь - описанное выше поведение с распространенными значениями фона работает точно так же, даже если вы используете многослойные фоны.
Если вам нужно поддерживать старые браузеры, вам нужно перейти с помощью метода CSS2, который поддерживается полностью на IE7.
Мои комментарии в этом другом ответе объясняют с сопровождающим fiddle, как body
на самом деле смещается от html
по умолчанию, несмотря на то, что похоже, что он был дополнен вместо этого снова из-за этого, казалось бы, странного явления.
1 Это может иметь свои корни в настройке атрибутов HTML background
и bgcolor
body
, заставляя атрибут фона применяться ко всему окну просмотра. Подробнее об этом здесь.