Показать сообщение отдельно
  #1 (permalink)  
Старый 11.10.2019, 14:52
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Ленивая загрузка изображений без jQ
Добрый день!

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

Изображения в таком формате
<figure>
    <img data-src="https://source.unsplash.com/random/500x300?1" src="https://via.placeholder.com/500x300">
</figure>

где, src - placeholder, data-src - изображение

1 вариант

function isVisible(elem) {
  let
    coords = elem.getBoundingClientRect(),
    windowHeight = document.documentElement.clientHeight,
    topVisible = coords.top > 0 && coords.top < windowHeight,
    bottomVisible = coords.bottom < windowHeight && coords.bottom > 0;

  return topVisible || bottomVisible;
}

function isVisible(elem) {
  let coords = elem.getBoundingClientRect();
  let windowHeight = document.documentElement.clientHeight;

  let extendedTop = -windowHeight;
  let extendedBottom = 2 * windowHeight;

  // top visible || bottom visible
  let topVisible = coords.top > extendedTop && coords.top < extendedBottom;
  let bottomVisible = coords.bottom < extendedBottom && coords.bottom > extendedTop;

  return topVisible || bottomVisible;
}

function showVisible() {
  for (let img of document.querySelectorAll('img')) {
    let realSrc = img.dataset.src;
    if (!realSrc) continue;
    if (isVisible(img)) {
      img.src = realSrc;
      img.dataset.src = '';
    }
  }
}

window.addEventListener('scroll', showVisible);
showVisible();


2 вариант

showPicture();

function showPicture() {
  let scrolled = window.pageYOffset || document.documentElement.scrollTop;
  let pics = document.querySelectorAll('[data-src]');
  for (i = 0, lengthPics = pics.length; i < lengthPics; i++) {
    var elemTop = pics[i].getBoundingClientRect().top;
    if (scrolled + document.documentElement.clientHeight > elemTop) {
      pics[i].setAttribute('src', pics[i].getAttribute('data-src'));
      pics[i].removeAttribute("data-src");
    }
  }
}
window.onscroll = showPicture;


3 вариант

window.scrollBy(0, 1);
let images = document.querySelectorAll('img');
window.onscroll = function(e) {
  for (var i = 0; i < images.length; i++) {
    if (images[i].getBoundingClientRect().top + pageYOffset < document.documentElement.scrollTop + document.documentElement.clientHeight - 100) {
      images[i].src = images[i].getAttribute('data-src');
    }
  }
}


Подскажите, какой вариант лучше выбрать и какие могут быть минусы? Не будет ли проблем, если js не сработает по какой-либо причине?
Если у вас другой вариант, буду рад.
Ответить с цитированием