Как стать автором
Обновить

Как заставить background-size работать в старых IE

Время на прочтение 4 мин
Количество просмотров 30K
Всем нам, иногда, хочется сделать красивый фоновый рисунок, в той или иной области сайта.
Еще чаще, в этом случае, нам хочется, чтобы фон не искажался при изменении размеров окна браузера.
Иногда это можно сделать с помощью img, у которого одно из измерений (ширина или высота) заданы в %, иногда нужно более гибкое решение (хотя бы потому, что фон это фон, а на картинке, без специальных приемов, содержимое не разместить).

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

Следующее, что приходит на ум, это поиск дополнительных свойств CSS, которые помогут настроить фон. Ими являются background-repeat, background-position и background-size.
Вот здесь и начинаются проблемы, точнее, с background-size, так как это свойство не поддерживается IE8 и, даже, IE9 в quirks mode.

Есть два решения этой проблемы:
  • Правильное (воспользоваться костылями).
  • Быстрое (оставить пользователей XP, с их последним доступным IE8, без красивого фона).


Если вы выбрали правильное решение, то вот, что есть на просторах Интернет:

1. Родные костыли для IE

Иногда допустимо растягивание и сжатие фонового рисунка, так как пользователь не заметит разницы (градиент в однопиксельную полоску может растянуться на всю ширину страницы и отлично выглядеть)
Для этого добавляем в качестве CSS свойств следующее:
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/logo.gif', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/logo.gif', sizingMethod='scale')";

images/logo.gif это путь к фоновой картинке.
Эти свойства понимаются только IE и не навредят нормальным браузерам.

2. jquery.backgroundSize.js

Данный плагин помечен автором, как устаревший, тем не менее, он работает.
Преимущества:
  • Работает для IE6, IE7, IE8.
  • Отключается, если браузер поддерживает свойство background-size.

Недостатки:
  • Подменяет фон либо для всех браузеров (даже поддерживающих background-size), либо не работает в IE9 в quirks mode (а он тоже не поддерживает background-size). Связано со способом подключения через условный комментарий.
  • Не поддерживает обновление рисунка при смене размера элементом (без смены размера окна).
  • Поддерживает только свойства cover и contain.
  • Задавать свойство background-size нужно с помощью jQuery.
  • Требует jQuery для работы.


Чтобы воспользоваться этим решением, необходимо подключить его к странице так:
<!-- The flag should be inserted before loading the script -->
<script>$.debugBGS = true;</script>
<!--[if lt IE 9]> <script src="/path/to/jquery.backgroundSize.min.js"></script> <![endif]-->

И задавать свойство background-size для элементов так:
$(elem).css( "background-size", "cover" );


3. background-size-polyfill

Является развитием решения № 2.
Преимущества:
  • Для работы не нужны внешние библиотеки.
  • Задание свойства background-size происходит почти привычным образом (нужно добавлять -ms-behavior: url(/backgroundsize.min.htc);).
  • Поддерживает и другие значения background-size, помимо cover и contain.

Недостатки:
  • Позиционирует себя как решение для IE8, однако, кое-как, работает с IE7 и не работает в IE6.
  • Не работает в IE8 в quirks mode.
  • Не поддерживает обновление рисунка при смене размера элементом (без смены размера окна).
  • Нет проверки на версию браузера, поэтому вставляет div с img во все элементы с background-size и -ms-behavior, даже если браузер поддерживает это свойство.


Чтобы воспользоваться этим решением, необходимо поместить файл .htaccess, взятый с сайта этого решения, в корень сайта, а backgroundsize.min.htc куда захочется.
При задании свойств CSS для элемента, вместе с background-size нужно задавать свойство -ms-behavior: url(путь_к_вашему_куда_захочется/backgroundsize.min.htc);

4. background-size-emu

Решение базируется на идеях решения № 3.
Преимущества:
  • Для работы не нужны внешние библиотеки.
  • Задание свойства background-size происходит привычным образом (не нужно ничего никуда добавлять).
  • Поддерживает и другие значения background-size, помимо cover и contain.
  • Работает в IE6, IE7, IE8, IE9 в quirks mode.
  • Отключается, если браузер поддерживает свойство background-size.
  • Поддерживает обновление картинки, при смене размера элементом, без смены размера окна браузера.

Недостатки:
  • Обновляет рисунки с полусекундной задержкой, в случае их динамического добавления на страницу и мгновенно — при изменениях размера.
  • Немного грузит старые IE, так как раз в 500 миллисекунд сканирует все элементы DOM на странице и определяет, что нужно обновлять, а что нет.
  • Не может подменять фон для элемента TR.


Чтобы воспользоваться этим решением, необходимо просто подключить скрипт к странице.


Общие проблемы

Решения №2, №3 и №4 вставляют в элемент, для которого задан background-size, абсолютно позиционированный div с img внутри и меняют размер картинки в зависимости от размера элемента.

Так как это тот еще костыль, всеми решениями не поддерживается:
  • Несколько фоновых картинок.
  • 4-х значный синтаксис background-position.
  • background-repeat (нет никаких повторений).
  • Нестандартные значения для background-[clip/origin/attachment/scroll] (если поменять значения, то это ни на что не повлияет).
  • Подмена фона для элементов, в которых не может быть вложенных элементов.


На последок

Все вышеперечисленные библиотеки доступны на GitHub.
Теги:
Хабы:
+3
Комментарии 37
Комментарии Комментарии 37

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн