Хочу сделать, чтобы сайт быстро загружался даже для пользователей с медленным Интернетом.
На сайте почти все картинки background.
Для этого хочу вначале загрузить маленькую картинку в background, а затем заменить ее на большую.
Но если просто подменить background-image, то маленькая картинка исчезает, а новая медленно загружается. Т.е. все действие сводится к нулю.
Вопрос, можно ли сделать это как-то незаметно, например наложив одну картинку на другую, или уже подменять когда большая картинка полностью загружена, или еще как-то?
По мне это извращение, в итоге пользователь загрузит в два раза больше изображений. Посмотрите у Вадима Макеева как правильно оптимизировать изображения на сайте https://www.youtube.com/channel/UCaTfYudJUVA8cV_Bu...
Еле нашел, где он там не лестно отзывается о div.background, предлагая воспользоваться чудо svg. Приму на вооружение этот svg формат. Но больше ничего интересного не узнал, все остальное совсем примитивно.
Ответ на свой вопрос тоже не нашел.
PS. Также услышал фразу, что у картинок приоритет выше, чем у div. Типа они загружается быстрее, так как приоритет выше.
Два вопроса:
1) Приоритет выше чем у js и css? а оно надо вообще?
2) И кто-то проверил, что грузится быстрее? Это типа браузер больше делает запросов на сервер? Проверил, а нет! Все тоже самое и на скорость это абсолютно не влияет не доли мс, только что сам проверил.
Короче, не знаю про div и img, можно конечно через svg заморочится...
Мне вот к примеру нравится сайт tass.ru, там не прям все огонь, но в целом не плохо сделано. Картинки хоть и не масштабируются, но через фон сделаны. У меня же полностью резиновый сайт, так что такую роскошь позволить не могу.
Еле нашел, где он там не лестно отзывается о div.background, предлагая воспользоваться чудо svg. Приму на вооружение этот svg формат. Но больше ничего интересного не узнал, все остальное совсем примитивно.
Ответ на свой вопрос тоже не нашел.
Смотрите, вы предлагаете сначала подгружать сначала маленькие, а потом большие картинки для тех у кого плохой интернет, но в тоже время вы не думаете, что вы загружаете картинки дважды, что не очень обрадует пользователей с плохим интернетом. Потому рекомендую просто помаксимум выжать из компрессора картинок. Делая контентные картинки бэкграундом вы во-первых теряете доступность, а во вторых ухудшаете SEO показатели своего сайта.
У меня же полностью резиновый сайт, так что такую роскошь позволить не могу.
Вы можете юзать тег img и CSS свойство object-fit, Вадим в одном из первых видео (про разбор сайта политеха) разбирает это свойство.
1) object-fit даже для IE11 не прокатит
2) со сжатием у меня все в порядке
3) пока что "до загрузка" нужна только для теста, и оставьте мне право самому решить, а надо ли оно :)
PS. Вот к примеру слайдер swiper проверил с lazy images, где Вы помогли мне найти, что я </div> пропустил. Так вот он что-то мне не зашел совсем, ищу альтернативы так сказать, накидал скрипт для ленивой подгрузки картинок, чтобы посмотреть и решить, а стоит ли. Так же планирую уменьшить размер картинок с помощью media, но это на будущее.
ИМХО ерунда это все, я не понял сути, ради чего это все?
1) Загрузка такая же, если внимательней посмотрите, так он еще и загружался дальше всех. Полифил вешать, еще кода больше.
2) Нельзя скопировать картинку? Ну для меня это только плюс.
а про div, там говорится, что можно ему role и aria-label задать, будет почти тоже самое, наверное..
Сегодня посмотрел последнее видео Вадима Микеева, и решил перейти на img, понравилось про <picture>, хотел это все реализовать на js, ну да ладно через css сделаю.
Еще раз пересмотрел видео про полифил, проверил его у себя, а оно не работает, что только не делал. Короче запилил свой (подглядел в Интернете и под себя оптимизировал) полифил:
объявляешь переменную для большой картинки с обработчиком онлоад ее. Как загрузится меняешь фон.
а маленькую можно сделать инлайном в хтмл
style background-image: url(base64,fdgjdfklghdfklgjklerjhget...)
Да и смысл от их загрузки, если я не знаю когда они загрузятся.
Если читать заголовок статьи, то он звучит примерно как: "Способы предварительной загрузки", ну и содержимое по аналогии, смотрят что документ загрузился и похали загружать в кеш все что не попадя.
Мой же вопрос немного другой, ну или не совсем понял посыл статьи как это сделать.
Хочется так:
1. везде, где надо подгрузить картинку, вешаем класс
2. далее все картинки с классом "пихаем" в массив
3. далее берем из массива первую картинку и загружаем
4. ждем когда она загрузится и загружаем следующую
до шага 3 все просто, но вот 4й шаг для меня сложноват
а) броузер до 5ти потоков грузит с одного сайта.
б) есть еще один способ. начинать грузить при попадании нужного объекта в область видимости.
это так для развития.
еще раз смотри по той ссылке, что я дал выше. Там все кирпичики есть, они правда сложены немного
в другую конструкцию.
отличие для цикла в том, что будет не var im а уже массив для них.
но с каждым элементом мы делаем то же самое.
назначаем обработчик и соурсе.
Пусть они асинхронно тянуться не нужно ждать как вы предлагаете.
Вот такой код у меня был в свое время использован, чтобы реальные превьюшки у новостей
и товаров вместо заглушки начинали грузиться, только если посетитель до них пролистал.
(function($) {
var imgLoadedH = false;
var imgLoadedW = false;
var offset = 50;
function CheckLoad(elem) {
var p = $(window).height() + $(window).scrollTop();
var w = $(window).width() + $(window).scrollLeft();
var img = $(elem);
var s = img.attr('data-longdesc');
var blnInRange = (img.offset().top < p + offset && img.offset().left < w + offset);
var blnVisible = (img.is(":visible"));
if (blnInRange && blnVisible) {
img.attr('src', img.attr('data-longdesc')).removeClass('img-ondemand')
}
}
function imgOndemand(visChange) {
var docHeight = $(document).height();
var docWidth = $(document).width();
if (!imgLoadedH || !imgLoadedW || visChange) {
$('img.img-ondemand').each(function() {
CheckLoad(this)
});
$('input.img-ondemand').each(function() {
CheckLoad(this)
});
imgLoadedH = ($(window).height() + $(window).scrollTop()) >= docHeight;
imgLoadedW = ($(window).width() + $(window).scrollLeft()) >= docWidth
}
}
$(function() {
imgOndemand()
});
$(window).scroll(function() {
imgOndemand()
});
})(jQuery);
а) Спасибо за информацию про 5 потоков, но думаю, что если сервер нормальный (других не знаю), то смысла в 5-ти потоках нет, лучше использовать один, так как полоса занята будет под завязку
б) это я уже реализовал на JS без jQuery
Вопрос в силе, на какое событие повесить проверку загрузки картинок?
По времени как-то.. ну не знаю.
сделайте лучше дизайн так, чтобы без картинок было красиво, а с ними супер. И то, что они не успели
скачаться Вас перестанет беспокоить.
В css3 можно интересные эффекты делать через множественные бекграунды.
На моем хомяке нет картинок совсем . Прямую ссылку убрал. Автор вопроса уже посмотрел.
Как сказали ранее это лишняя нагрузка на интернет, лучше сделать одно цельное изображение( его можно сжать при помощи сервиса squoosh.app(картинка станет легче в разы)), ещё можно добавить фон блоку в виде цвета или градиента чтоб было хоть что-то пока грузится картинка.