Ответ 1
http://www.appelsiini.net/projects/lazyload
https://github.com/tuupola/jquery_lazyload
Демо:
http://www.appelsiini.net/projects/lazyload/enabled.html
В наши дни я вижу много сайтов, в основном сайты с учебниками, на которых много изображений, и они загружают только изображения вниз по странице, когда они входят в порт представления.
Как мне это сделать?
Пример:
http://www.chopeh.com/blog/logo-design-start-to-finish/
Когда вы прокручиваете страницу вниз, изображения под порт просмотра исчезают в
http://www.appelsiini.net/projects/lazyload
https://github.com/tuupola/jquery_lazyload
Демо:
http://www.appelsiini.net/projects/lazyload/enabled.html
Замените свои изображения на заполнители (например, просто измените атрибут "src" на что-то другое, чтобы изображение не загружалось, но URL-адрес все равно будет доступен), а затем привяжите событие прокрутки окна к функции, которая найдет все изображения в текущей позиции прокрутки и обменивать изображение src в настоящий тег img.
Вот код. Он не тестировался, но это должна быть основная идея:
<img src="" realsrc="/myimage.png" />
$(document).ready(function(){
$(window).scroll(function(){
$('img[realsrc]').each(function(i){
var t = $(this);
if(t.position().top > ($(window).scrollTop()+$(window).height()){
t.attr('src', t.attr('realsrc')); // trigger the image load
t.removeAttr('realsrc'); // so we only process this image once
}
});
})
});
Простое решение, не зависящее от JQuery:
<script type="text/javascript">
refresh_handler = function(e) {
var elements = document.querySelectorAll("*[realsrc]");
for (var i = 0; i < elements.length; i++) {
var boundingClientRect = elements[i].getBoundingClientRect();
if (elements[i].hasAttribute("realsrc") && boundingClientRect.top < window.innerHeight) {
elements[i].setAttribute("src", elements[i].getAttribute("realsrc"));
elements[i].removeAttribute("realsrc");
}
}
};
window.addEventListener('scroll', refresh_handler);
window.addEventListener('load', refresh_handler);
window.addEventListener('resize', refresh_handler);
</script>
IntersectionObserver
минимальный исполняемый пример
По сути, это метод, используемый в: https://appelsiini.net/projects/lazyload/, который был упомянут в: fooobar.com/info/568927/...
Веб-API развились настолько сильно, что теперь нет ничего сложного в написании кода!
var observer = new IntersectionObserver(
(entries, observer) => {
entries.forEach(entry => {
if (entry.intersectionRatio > 0.0) {
img = entry.target;
if (!img.hasAttribute('src')) {
alert('will load the image!!!');
img.setAttribute('src', img.dataset.src);
}
}
});
},
{}
)
for (let img of document.getElementsByTagName('img')) {
observer.observe(img);
}
.separator {
height: 1000px;
width: 100px;
border: 5px solid red;
}
img {
height: 340px;
border: 5px solid black;
}
<div><img data-src="https://upload.wikimedia.org/wikipedia/commons/5/56/Donald_Trump_official_portrait.jpg"></div>
<div class="separator"></div>
<div><img data-src="https://upload.wikimedia.org/wikipedia/commons/8/8d/President_Barack_Obama.jpg"></div>
<div class="separator"></div>
<div><img data-src="https://upload.wikimedia.org/wikipedia/commons/d/d4/George-W-Bush.jpeg"></div>
<div class="separator"></div>
<div><img data-src="https://upload.wikimedia.org/wikipedia/commons/d/d3/Bill_Clinton.jpg"></div>
<div class="separator"></div>
<div><img data-src="https://upload.wikimedia.org/wikipedia/commons/9/90/George_H._W._Bush%2C_President_of_the_United_States%2C_1989_official_portrait_%28cropped%29.jpg"></div>
<div class="separator"></div>
<div><img data-src="https://upload.wikimedia.org/wikipedia/commons/1/16/Official_Portrait_of_President_Reagan_1981.jpg"></div>