Два фоновых изображения

Как добавить две фоновые картинки на веб-страницу?

Кроссбраузерно добавить два фоновых изображения к веб-странице.

Решение

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

В CSS3 два фона добавляются достаточно легко с помощью стилевого свойства background , при этом настройки каждого фона задаются через запятую. Однако старые браузеры не поддерживают подобную возможность, поэтому придется воспользоваться проверенным методом. В данном случае фоновый рисунок задается для каждого элемента отдельно, а таких элементов у нас два — HTML и BODY . К этим селекторам достаточно добавить универсальное свойство background , установив путь к графическому файлу (пример 1).

Пример 1. Селекторы HTML и BODY

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

  • При одновременном добавлении фоновой картинки к селекторам HTML и BODY , фон последнего занимает высоту, равную содержимому веб-страницы. Если имеется только одна текстовая строка, то фон будет равен ее высоте, а никак не занимать всю высоту окна браузера.
  • Отступы на странице, а также вокруг элементов (например, тега

    ) заставляют фон отходить от края окна. Получается, что фон отстоит от края окна на некотором расстоянии.

  • Добавление цвета фона к селектору BODY приводит к сокрытию одного из фоновых изображений.

Проблема с высотой решается добавлением свойства height со значением 100% к селектору HTML и BODY . Отступы придется обнулить, причем сделать это на самой странице и у абзаца, добавив margin: 0 к селектору BODY и P . Также можно обойтись и без обнуления отступов у абзацев, если создать контейнер с необходимыми отступами и все остальные элементы разместить в нем. Вопрос с цветом фона обходится легко, достаточно задать цвет у селектора HTML .

Рассмотрим добавление двух фоновых картинок на конкретном примере. Имеется два изображения, которые должны повторяться по вертикали, их необходимо пустить фоном по левому и правому краю веб-страницы. Также следует задать цвет фона оранжевым со значением #fc0 . На рис. 1 приведено изображение для левого края (назовем его hand.png ), а на рис. 2 для правого ( bg-right.png ).

Рис. 1. Фон для левого края

Рис. 2. Фон для правого края

Окончательный код с учетом всех замечаний приведен в примере 2.

Пример 2. Два фоновых изображения

HTML5 CSS 2.1 IE Cr Op Sa Fx

       

Содержимое веб-страницы

Результат данного примера показан на рис. 3.

Веб-страница с двумя фоновыми картинками

Рис. 3. Веб-страница с двумя фоновыми картинками

Источник

Using multiple backgrounds

You can apply multiple backgrounds to elements. These are layered atop one another with the first background you provide on top and the last background listed in the back. Only the last background can include a background color.

Specifying multiple backgrounds is easy:

.myclass  background: background1, background2, /* … ,*/ backgroundN; > 

You can do this with both the shorthand background property and the individual properties thereof except for background-color . That is, the following background properties can be specified as a list, one per background: background , background-attachment , background-clip , background-image , background-origin , background-position , background-repeat , background-size .

Example

In this example, three backgrounds are stacked: the Firefox logo, an image of bubbles, and a linear gradient:

HTML

div class="multi-bg-example">div> 

CSS

.multi-bg-example  width: 100%; height: 400px; background-image: url(firefox.png), url(bubbles.png), linear-gradient(to right, rgba(30, 75, 115, 1), rgba(255, 255, 255, 0)); background-repeat: no-repeat, no-repeat, no-repeat; background-position: bottom right, left, right; > 

Result

(If image does not appear in CodePen, click the ‘Tidy’ button in the CSS section)

As you can see here, the Firefox logo (listed first within background-image ) is on top, directly above the bubbles graphic, followed by the gradient (listed last) sitting underneath all previous ‘images’. Each subsequent sub-property ( background-repeat and background-position ) applies to the corresponding backgrounds. So the first listed value for background-repeat applies to the first (frontmost) background, and so forth.

See also

Found a content problem with this page?

This page was last modified on Jul 17, 2023 by MDN contributors.

Your blueprint for a better internet.

Источник

CSS3. Работа с множественными фонами

Мы уже ранее затрагивали возможности модуля CSS3 Backgrounds and Borders, рассматривая работу с тенями (box-shadow). Сегодня мы немного поговорим о еще одной интересной возможности — использовании нескольких изображений в фоне.

Композиция фонов

Существует множество причин, по которым, вам вообще может потребоваться композиция нескольких изображений в фоне, среди них наиболее важные — это:

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

Могут быть и другие разумные причины 🙂

Классический подход

Итак, нам нужно разместить несколько фоновых изображений одно над другим. Как обычно решается эта задача? Очень просто: на каждое фоновое изображение создается блок, которому прописывается соответствующее фоновое изображение. Блоки либо вкладываются друг в друга, либо размещаются подряд с соответствующими правилами позиционирования. Вот простой пример:

Блок с классом «fishing» внутри «mermaid» исключительно для демонстрационных целей.

.sample1 .sea, .sample1 .mermaid, .sample1 .fishing < height:300px; width:480px; position: relative; >.sample1 .sea < background: url(media/sea.png) repeat-x top left; >.sample1 .mermaid < background: url(media/mermaid.svg) repeat-x bottom left; >.sample1 .fish < background: url(media/fish.svg) no-repeat; height:70px; width:100px; left: 30px; top: 90px; position: absolute; >.sample1 .fishing < background: url(media/fishing.svg) no-repeat top right 10px; >

Sample 1. Classic nested divs

Результат:

В данном примере три вложенных фона и один блок с рыбками, расположенный рядом с «фоновыми» блоками. В теории, рыбок можно перемещать, например, с помощью JavaScript или CSS3 Transitions/Animations.

Кстати, в этом примере для «.fishing» используется новый синтаксис для позиционирования фона, также определенный в CSS3:

background: url(media/fishing.svg) no-repeat top right 10px;

На текущий момент он поддерживается в IE9+ и Opera 11+, но не поддерживается в Firefox 10 и Chrome 16. Так что пользователи последних двух браузов поймать рыбку пока не смогут.

Поехали дальше. Как упростить эту конструкцию?

Множественные фоны

На помощь приходит новая опция, добавленная в CSS3, — возможность определять сразу несколько фоновых изображений для одного элемента. Выглядит это следующим образом:

Для определения множественных изображений необходимо использовать правило background-image, перечисляя отдельные изображения через запятую. Дополнительными правилами, также списком, можно задать позиционирование, повторы и другие параметры для каждого из изображений. Обратите внимание на порядок перечисления изображений: слои перечисляются слева направо от самого верхнего к самом нижнему.

Sample 2. Using multiple backgrounds

Результат полностью совпадает:

Одним правилом

Если рыбок не нужно выделять в отдельный блок для последующих манипуляций, всю картинку можно переписать одним простым правилом:

Картинку с результатом приводить не буду — поверьте, она совпадает с двумя картинками выше. А вот на стили обратите внимание еще раз, особенно на «background-repeat» — согласно спецификации, если часть списка в конце пропущена, то браузер должен повторить указанный список нужное число раз, чтобы соответствовать количеству изображений в списке.

В данном случае, это эквивалентно такому описанию:

background-repeat: no-repeat, repeat-x, no-repeat, repeat-x;

Еще короче

Если вы помните CSS 2.1, в нем определена возможность описывать фоновые изображения в краткой форме. Как на счет множественных изображений? Это также возможно:

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

Динамичные изображения

Если композиция статична или динамична не более, чем в зависимости от размеров контейнера, тогда множественные фоны очевидно упрощают конструкцию страницы. А что делать, если с отдельными элементами композиции нужно работать независимо из javascript (перемещать, прокручивать и т.п.)?

Yandex

Кстати, вот пример из жизни — тема с одуванчиком в Яндексе:

Если вы залезете в код, вы увидите там примерно следующее:

Блоки с классами «b-fluff-bg», «b-fluff__cloud» и «b-fluff__item» содержат фоновые изображения, накладывающиеся друг на друга. Причем фон с облаками постоянно прокручивается, а одуванчики летают по экрану.

Можно ли это переписать с использованием множественных фонов? В принципе, да, но при условии 1) поддержки этой возможности в целевых браузерах и… 2) читайте дальше 😉

Как добавить динамики множественным фонам? В такой ситуации оказывается удобным, что во внутреннем представлении браузер раскидывает отдельные параметры фоновых изображения по соответствующим правилам. Например, для позиционирования есть «background-position», и для сдвигов достаточно изменять только его. Однако имеется и плата за использование множественных изображений — в этом правиле (и любом аналогичном) необходимо перечислять позицию для всех фонов, заданных для вашего блока, и нельзя сделать это выборочно.

Чтобы добавить нашему фону с рыбками анимации, можно использовать такой код:

$(document).ready(function() < var sea = $(".sample5 .sea")[0]; var fishesX = 30; var fishesY = 90; var fishX = 0; var fishY = 0; var mermaidX = 0; var t = 0; function animationLoop() < fishesY = 90 + Math.floor(30 * Math.sin(t++ / 180.0)); if(--fishesX < 0) fishesX = 480; mermaidX += 0.5; if(mermaidX >480) mermaidX = 0; fishY = -10 + (10 * Math.cos(t * 0.091)); fishX = 10 + (5 * Math.sin(t * 0.07)); sea.style.backgroundPosition = "top " + fishY + "px right " + fishX + "px, " + mermaidX + "px bottom," + fishesX + "px " + fishesY + "px, top left"; window.requestAnimFrame(animationLoop); > animationLoop(); >);
window.requestAnimFrame = (function() < return window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.webkitRequestAnimationFrame || (function(callback) < window.setTimeout(callback, 1000 / 60); >); >)();

Sample 5. Animating

И, кстати, анимации также можно делать через CSS3 Transitions/Animations, но это тема для отдельного обсуждения.

Паралакс и интерактив

Наконец, схожими маневрами можно легко добавить эффекты паралакса или интерактивного взамодействия с фоном:

Множественные фоновые изображения удобны в подобных сценариях, так как пока мы говорим только про фон (а не контент), их использование позволяет избежать замусоривания html-кода и DOM. Но за все приходится платить: я не могу обращаться к отдельным элементам композиции по имени, id, классу или какому либо другому параметру. О порядке элементов в композиции я должен явно помнить в коде и на каждое изменение любого параметра любого элемента фактически я должен склеивать строку, описывающую значения этого параметра для всех элементов, и обновлять ее для всей композиции.

sea.style.backgroundPosition = "top " + fishY + "px right " + fishX + "px, " + mermaidX + "px bottom," + fishesX + "px " + fishesY + "px, top left";

Уверен, что это можно обернуть в удобный код на javascript, который возьмет на себя виртуализацию взаимоотношений с отдельными слоями, оставляя при этом html-код страницы максимально чистым.

Что там с совместимостью?

Все современные версии популярных браузеров, включая IE9+, поддерживают множественные изображения (можно сверяться, например, с сaniuse).

Вы также можете использовать Modernizr, чтобы предоставлять браузерам, не поддерживающим множественные фоны, альтернативные решения. Как написал Chris Coyier в заметке о порядке слоев при использовании множественных фонов, делайте примерно так:

.multiplebgs body < /* Awesome multiple BG declarations that transcend reality and imsourcess chicks */ >.no-multiplebgs body < /* laaaaaame fallback */ >

Если вас смущает использование JS для предоставления обратной совместимости, вы можете просто дважды объявить background, правда, это тоже имеет свои минусы в виде возможной двойной загрузки ресурсов (это зависит от реализации обработки css в конкретном браузере):

/* multiple bg fallback */ background: #000 url(. ) . ; /* Awesome multiple BG declarations that transcend reality and imsourcess chicks */ background url(. ), url(. ), url(. ), #000 url(. ); 

Если вы уже начали думать о Windows 8 имейте в виду, что вы можете использовать множественные фоны при разработке metro style приложений, так как внутри используется тот же движок, что и в IE10.

p.s. В тему: не могу не вспомнить феноменальную статью про принцип цикады.

Источник

Читайте также:  Python code check tool
Оцените статью