Улучшаем ощущаемую производительность с несколькими фоновыми изображениями

Улучшаем ощущаемую производительность с несколькими фоновыми изображениями

Прямо сейчас я в поезде, и это означает ужасный wi-fi. Множество сайтов совсем отказываются загружаться, а те которые загружаются пропускают кучу изображений, оставляя большие пустые дыры на своих страницах. Большинство изображений, спасибо, не критичны для понимания контента который мне нужен, но их отсутствие напоминает мне, что я все еще жду прибытие чего-то, и во множестве случаев именно эта ощущаемая производительность, намного важнее чем фактическая. Это дало мне маленькую идею.

Некоторое время назад, я был консультантом на очень видном и очень нагруженном сайте компании, клиента, которого, к сожалению, не могу назвать. Меня взяли в середине разработки, для создания способа сделать вещи быстрее.

Сайт изобиловал очень большими баннерами, которые даже с оптимизацией замедляли загрузку страницы. Я попробовал множество чепухи, чтобы предвыбрать изображение, сделать запрос раньше, и т.д., была одна простая техника, которую я использовал - применять средний цвет картинки в качестве background-color, так пользователь хотя бы не будет смотреть на большое белое пространство пока изображение загружается. Это значительно улучшает ощущаемую производительность, и требует невероятно мало усилий для реализации:

  1. Откройте изображение в Photoshop
  2. Фильтр » Размытие » Среднее
  3. Используйте пипетку, чтобы взять цвет, который остался
  4. Примените его как background-color.
.masthead {
  background-image: url(/img/masthead.jpg);
  background-color: #3d332b;
}

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

Пример сплошного цвета

Это изображение на самом деле критично для содержания, так что не важно, загрузились оно или нет, но в то время как это, вероятно, выглядит лучше, чем мое лицо, но все еще довольно раздражает: это просто большая, плоская, бездушная куча цвета. Как мы можем это улучшить?

CSS градиент и несколько фонов

Проще говоря, я хочу сделать грубое упрощение фотографии приведя к градиенту CSS. Я не могу не подчеркнуть слова грубое упрощение: мы буквально говорим о нескольких аналогичных клякс средних цветов. И затем применю его как background-image, к верхнему баннеру, только: о нет! Ведь нас уже есть фоновое изображение. Но не волнуйтесь, мы можем устанавливать несколько фонов к одному элементу начиная с IE9. Так что мы можем установить наше изображение и его приближенный градиент за один присест, в одном описании.

Это означает, что браузер:

  1. может отрисовать CSS приближение;
  2. и сделать запрос на настоящие изображение, которое может загружаться сколько необходимо.

Читайте больше о нескольких фоновых изображениях на MDN.

Создание градиента

Чтобы получить градиентную версию моего заглавного изображения, я открываю его в фотошопе и поделю его на интервалы. Потому что большинство объектов на фотографии расположено сверху вниз, я сделал вертикальные куски. Для меня очень удобно, что эти регионы попали в интервалы по 25%:

Пример разделения изображения

Потом выбираю каждую секцию отдельно и делаем Фильтр » Размытие » Среднее, и это дает мне:

Пример разделения изображения - 2

Следующим шагом будем брать каждый цвет и вставлять его в градиент CSS:

linear-gradient(to right, #807363 0%, #251d16 50%, #3f302b 75%, #100b09 100%)

Все что мне сейчас остается это применить это значение к свойству background-image:

.page-head--masthead {
  background-image: url(/img/css/masthead-large.jpg),
                    linear-gradient(to right, #807363 0%, #251d16 50%, #3f302b 75%, #100b09 100%);
}

Указываем фоны в таком порядке, что первое значение (в нашем случае, настоящее изображение) это верхнее изображение, следующее, это что под ним, и так далее.

Это означает что, если наше изображение снова не загрузится, мы увидим следующее:

Пример градиента

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

Практичность

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

Предыдущим уровнем, просто брать средний цвет изображения и применять как background-color. Здесь не нужны градиенты и несколько фонов, но все равно потребуются операции над каждым изображением.

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