Масштабируемый фон
Задача
Сделать масштабируемый фон без использования flash.
Почему для этой задачи часто применяется flash
Flash cнабжен возможностями соблюдения пропорций изображения при масштабировании.
В HTML и CSS такое сделать тоже просто, но не так очевидно.
Решение
Т.к. background-size пока не всеми распространенными браузерами поддерживается, приходится это свойство воспроизводить в ручную:
<body> <div id="page-background"><img src="path-to/alps.jpg" width="100%" alt="Альпы" /></div> <div class="main"> [содержимое сайта] </div> </body>
#page-background { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .main { position: relative; z-index: 1; overflow: hidden; }
Для IE6 добавляем эмуляцию position: fixed:
body { background:url(about:blank); background-attachment: fixed; } #page-background { position:absolute; top: expression(document.getElementsByTagName("body")[0].scrollTop + "px"); }
Демо пример. Проверено:
Прием основан на понятии из CSS спецификаций replaced element. На такие элементы распространяются особые правила расчета размеров. Для нашего случая действует следующие: если для элемента указан только один размер, второй рассчитывается автоматически с соблюдением пропорций.
Недостатки
- снижается производительность браузера (у flash с этим тоже не все хорошо, а скорей всего даже хуже);
- чтобы не терялось качество при больших разрешениях экрана (не забываем, что изображение растровое), картинку нужно использовать с максимальными размерами. А такие картинки могут весить очень много (например, в демонстрационном примере фоновая картинка весит более 500Kb).
Почему не SVG
Вообще для масштабирования следует применять векторную графику (где графика описывается формулами), а не растровую. Для фото изображений векторная не подходит:
- описание фото в формулах имеет огромный вес, зачастую такое описание весит больше самой фото в формате .jpg;
- такое длинное описание слишком нагружает браузеры, иногда вызывает даже их падение;
- преобразование фото из растрового изображения в векторное сопровождается потерей качества.
А если не для body
Такой фон можно использовать не только для <body>, но и внутри любого элемента. К тому же, не важно каким способом позиционируется картинка, главное чтобы сохранялся принцип авторесайза.
Хочу на всю область страницы
Если следует растянуть фон на всю страницу, тогда <img> добавляем height: 100%. Но тогда пропорции изображения сохраняться не будут.
Вывод
Если дизайнер задумал такое оформление, реализовать его можно. Но нужно не забывать, что очень красочно изображение с высокой детализацией может весить неоправданно много.
Материалы
- Сергей Чикуёнок :: Ответы
- How To: Resizeable Background Image