#5 – Работа с фоновыми картинками
При помощи CSS вы можете устанавливать любой задний фон для всего сайта в целом или же для определенных объектов. За урок мы научимся работать с фоном и отображать изображения за счет CSS.
Видеоурок
Вместо сплошного цвета на заднем фоне можно добавить картинку. Для этого необходимо прописать специальный стиль: background-image . Стиль является частью стиля background , о котором вы можете детальнее почитать в нашем справочнике .
Чтобы сделать задний фон картинкой необходимо указать полный путь к картинке, а также добавить характеристики отображения картинки: повторение, размещение, сжатие и так далее.
Простой способ сделать отзывчивые изображения с помощью фоновых картинок в CSS
Примечание редактора Frontender Magazine: cтатья была написана в 2012 году, когда не было элемента , о использовании которого можно прочесть, например, в статьях «Отзывчивые изображения: примеры использования и документированные снипеты, чтобы вы могли начать их использовать» и более ранней «Как избежать лишних загрузок для отзывчивых изображений». Данная статья, однако, содержит интересные приемы, о которых стоит знать.
Примечание редактора Smashing Magazine: в этой статье описано только одно из многих близких к оптимальному решений для создания отзывчивых изображений. Перед выбором конкретного решения мы рекомендуем ознакомиться с разными подходами, в том числе вот с этими: «Как избежать лишних загрузок при использовании отзывчивых изображений» и «Выбираем решение для изображений в отзывчивом дизайне».
Учитывая все разговоры о новых стандартах HTML5, таких как атрибут srcset и элемент , и применении серверных решений вроде Отзывчивого вебдизайна + Серверных компонентов (RESS), у вас могло сложиться впечатление, что на сегодняшний день простые статические сайты не могут содержать отзывчивые изображения. Однако это впечатление несколько преждевременно. На самом деле, есть простой и незамысловатый способ представления отзывчивых изображений, поддерживаемый всеми современными веб-браузерами: фоновые изображения в CSS.
У этого подхода тоже есть некоторые ограничения, и в некоторых случаях он работать не будет, но, если ваши требования не слишком завышены, и вы готовы приложить усилия, чтобы обеспечить доступность изображений, возможно, фоновые изображения в CSS — это именно то решение, которое вам нужно.
В этой статье мы в несколько этапов рассмотрим подход с использованием фоновых изображений в CSS:
- Сначала мы рассмотрим задачи и требования к отзывчивым изображениям.
- Затем выясним как CSS-медиазапросы могут помочь нам определить главные характеристики пользовательских устройств.
- Подробно рассмотрим ключевое свойство background-image , которое позволяет подстраивать изображение под эти характеристики.
- Рассмотрим стратегию оптимизации отдельных изображений, из которых формируется набор изображений, решающий проблему отзывчивости.
- Изучим ограничения этого подхода — в большинстве случаев их можно легко обойти.
- И, наконец, определим проблемные моменты, для которых нет решения.
Примечание: чтобы использовать этот подход, вам понадобится полный контроль над таблицей стилей и HTML-разметкой вашего сайта. Если для него используется система управления контентом (CMS), у вас может быть недостаточно доступа к управлению этими компонентами сайта.
Потребность в отзывчивых изображениях
Отзывчивые изображения — это важная составляющая отзывчивого вебдизайна, подхода, предложенного Итаном Маркоттом (Ethan Marcotte) для удовлетворения требований мобильных устройств, которые очень широко используются для просмотра сайтов. Итан признал, что прежний подход, состоящий в создании отдельных сайтов для разных типов устройств, был не в состоянии справиться с требованиями огромного разнообразия устройств, которые используют посетители сайтов для доступа в интернет.
Отзывчивый дизайн предлагает абсолютно другой подход: создание одного сайта, который распознаёт окружающий контекст и подстраивается под него. Например, если для просмотра сайта пользователь использует настольный компьютер с широкоформатным экраном, содержимое сайта будет разделено на несколько колонок. Однако на смартфоне контент этого сайта перестраивается таким образом, чтобы помещаться в одну колонку.
Во многих случаях вся отзывчивость дизайна заканчивается именно здесь — на простых изменениях в расположении контента и его представлении. Если мы уделяем внимание только этим моментам, цель отзывчивого дизайна нельзя считать достигнутой, потому что удовлетворяются не все потребности пользователей.
Чтобы полностью соответствовать контексту, в котором пользователь просматривает сайт, дизайн этого сайта должен учитывать все аспекты, влияющие на удобство использования, включая изображения. Вот пример из жизни: взгляните на сайт contfont.net. Этот одностраничный сайт состоит из одного изображения и типичного набора из HTML, таблицы стилей, шрифтов и JavaScript.
| Компонент | Тип | Размер в сжатом виде |
|---|---|---|
| Главная страница | HTML | 6 Кб |
| Таблица стилей | CSS | 10 Кб |
| Шрифты | Веб-шрифт | 221 Кб |
| Скрипты | JavaScript | 21 Кб |
| Вспомогательные изображения | Изображение | 48 Кб |
| Главное изображение | Изображение | ?? |
На больших экранах сайт выглядит просто шикарно благодаря большому разрешению главного изображения. Загрузка этого изображения, однако, обходится недёшево: при разрешении 1940 × 1229 пикселей изображение даже после сжатия весит 446 Кб.
Теоретически можно использовать одно и то же изображение для всех пользователей без ущерба для визуального представления — браузеры на небольших устройствах могут подстроить его размер под размер экрана. Однако при таком подходе удобство пользователя серьезно пострадает, хоть визуальное впечатление от сайта и остаётся неизменным.

На iPhone изображение с разрешением 290 × 183 пикселей и размером 18 Кб выглядит точно так же, как изображение с разрешением 1940 × 1229 пикселей и размером 452 Кб выглядит на MacBook Pro. Крупнее.
Что это значит для пользователя, который просматривает сайт, скажем, на смартфоне старого поколения? Для этого пользователя изображение с разрешением 290 × 183 пикселей и размером 18 Кб будет выглядеть точно также, как его большая версия. Если не применять отзывчивый подход к изображениям, пользователю придётся скачивать дополнительные и абсолютно ненужные 429 Кб данных. И это создаёт не только теоретические неудобства — лишний вес значительно влияет на время загрузки сайта. Пользователь смартфона может просматривать сайт используя обычное подключение через 3G со скоростью 2 Мб/с. Если не использовать отзывчивое изображение, время загрузки сайта увеличивается от 1,3 секунд до 3 секунд — больше чем вдвое!

При соединении через 3G изображение исходного размера грузится 3 секунды, отзывчивое — 1,3 секунды. Крупнее.
Главная задача отзывчивого подхода к изображениям проста: загрузить изображение с разрешением, подходящим именно для этого устройства.
Определение пользовательского контекста
Поскольку сайты должны подстраиваться под контекст пользователя, нам нужен способ определения этого контекста. На сегодняшний день CSS предлагает наиболее эффективный способ различать устройства. Мы получаем ответы на два важных вопроса: какой размер экрана на устройстве пользователя? Поддерживаются ли изображения, оптимизированные под ретину?
Эту информацию мы можем получить благодаря CSS-медиазапросам. Медиазапросы позволяют прописать набор стилей, которые будут применяться только для устройств с определёнными характеристиками. Изначально медиазапросы ограничивались только типом носителя. В спецификации CSS описано достаточное их количество, например, braille (тактильные устройства на системе Брайля), speech (речевые синтезаторы), tty (устройства, поддерживающие только моноширинные шрифты, например, телетайпы) и tv (устройства вроде телевизоров с низким разрешением и без возможности прокрутки). На данный момент большинство браузеров понимает только два типа носителей: print (печатный материал, разбитый на страницы) и screen (экраны компьютеров).
В CSS3 была добавлена возможность указания определённых характеристик устройств, а не только типа носителя. Для устройств screen , можно указать множество характеристик экрана, в том числе его ширину, ориентацию, разрешение и соотношение логических и физических пикселей. Эти характеристики дают нам достаточно информации, чтобы подобрать изображение, подходящее под конкретное устройство.
Медиазапросы могут помочь решить дилемму, описанную немного выше. К примеру, у MacBook Pro с диагональю 15 дюймов ширина экрана составляет 1440 пикселей (пока что не будем рассматривать наличие ретины). В таблице стилей нашего сайта стиль для экранов таких размеров можно прописать так:
@media only screen and (min-width: 1440px) < /* стили для экранов с размером как у MacBook Pro и больше */ >
Любые стилевые характеристики, описанные в этом блоке кода, будут применяться только когда пользователь открывает веб-страницу на устройстве с шириной экрана в 1440 пикселей. Однако здесь есть маленький нюанс: под размером экрана следует понимать не физический размер экрана устройства, а размер области просмотра в окне браузера. Размер области просмотра равен размеру окна браузера без различных окантовок вроде полосы прокрутки.
В общем-то, ширина окна браузера наверняка будет меньше 1440 пикселей, если только что пользователь не переключился на полноэкранный режим просмотра. Нам стоит это учесть в таблице стилей, 1200 пикселей наверное будет ближе к истине.
@media only screen and (min-width: 1200px) < /* стиль для широких экранов */ >
Этот медиазапрос состоит из двух частей. Первая часть, only screen , указывает на то, что стиль не должен применяться при печати страницы или на нестандартных устройствах. (Слово only никак не влияет на сам медиазапрос: оно используется для очень старых браузеров, которые не распознают параметры устройства. Так как эти браузеры не понимают синтаксис only , они просто проигнорируют блок со стилями целиком). Во второй части медиазапроса, min-width: 1200px , указана минимальная ширина экрана, при которой должен применяться стиль. Оператор and , соединяющий эти части, указывает на то, что для срабатывания стиля оба условия должны быть верны.
Похожий приём можно использовать прописывая стили для смартфонов в портретной ориентации.
@media only screen and (max-width: 320px) < /* стили для узких экранов */ >
В этом случае в медиазапросе можно смело указывать размер самого экрана устройства, так как браузеры на смартфонах всегда работают в полноэкранном режиме.
С помощью условий min-width и max-width можно легко определить ширину устройства пользователя. К сожалению, с определением ретины не всё так просто. Разные браузеры используют разный синтаксис для этого параметра, поэтому следует использовать вендорные префиксы. Ещё одна ложка дёгтя: в синтаксисе многих версий Firefox присутствует ошибка, так что для браузеров от Mozilla нам придётся использовать и нормальный синтаксис, и «дефектный». На данный момент для ретины рекомендуется использовать медиазапросы такого вида:
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) < /* стили для дисплеев Retina */ >
Когда-нибудь все браузеры будут поддерживать стандартную запись dppx (точки на дюйм), и мы сможем отказаться от вендорных префиксов в CSS.
CSS-cвойство background-image
Поскольку CSS позволяет достоверно определить контекст пользователя, может показаться, что теперь можно легко обеспечить поддержку отзывчивых изображений. Логично вроде бы задать display: none для изображений, которые не должны загружаться. Вот как этот способ будет выглядеть с привязкой к размеру экрана (для краткости опустим код для ретины):
html lang="ru"> head> meta charset="utf-8"> title> title> style> img.smallscreen < display: none; > @media only screen and (max-width: 320px) < img < display: none; > img.smallscreen < display: inline; > > style> head> body> img src="largeimage.jpg"> img class="smallscreen" src="smallimage.jpg>