Недовольны существующими ленивыми плагинами загрузки (они настолько сложны, что я даже не могу понять коды в них), я думал, что могу создать простой, понятный сценарий, который ленивы загружает изображения.swapping src to lazy
Моя идея была простой. Начните со следующего (деформированного) тега img.
<img lazy="http://lorempixel.com/400/200"/>
Использование JavaScript, замените слово «ленивый» с «ЦСИ», когда страница прокручивается быть вверх или вниз.
function hackyaFunction_lazy() {
[].forEach.call(document.querySelectorAll('img[lazy]'), function(img) {
img.setAttribute('src', img.getAttribute('lazy'));
img.onload = function() {
var imgs = document.querySelectorAll('[lazy]');
for (i = 0; i < imgs.length; i++) {
var o = imgs[i],
lazy = o.getAttribute('lazy');
if (o.y <= (window.screen.height + window.scrollY + 50) && o.y >= (window.scrollY - 50)) {
o.setAttribute('src', lazy);
o.removeAttribute('lazy');
}
}
}
window.onload = window.onscroll = hackyaFunction_lazy;
});
}
Я знаю достаточно JavaScript, чтобы взломать вместе биты & части, чтобы сделать то, что работает. И приведенный выше код работает.
На моей консоли я вижу, что слово «ленивое» было успешно заменено на «src» для изображений, которые находятся в видовом экране.
Однако изображения, которые находятся за пределами области просмотра, это то, что я вижу.
<img lazy="http://lorempixel.com/400/200/sports/Dummy-Text" src="http://lorempixel.com/400/200/sports/Dummy-Text">
Так что я половину рабочего кода & это лучшее, что я могу сделать.
Я должен был использовать только один из доступных там плагинов; просто хотел посмотреть, смогу ли я создать что-то простое & легко.
Теперь, когда я так близок к тому, чтобы это работало, я не хочу отказываться от него.
Любая помощь будет принята с благодарностью.
Я хотел собрать все это (html & js) на jsfiddle, но изображения не отображаются на jsfiddle. Не знаю, почему.
Код работает (как описано) в локальной среде.
Я не понимаю, для чего предназначена функция 'img.onload', поскольку первая строка 'forEach()' уже меняет текущий 'img [lazy]' образ, чтобы установить его 'src', и после того, как все итерации' forEach() 'все будут изменены. Кроме того, почему 'window.onload = window.onscroll = hackyaFunction_lazy;' * внутри * функция? (Кроме того, почему вы используете 'setAttribute()', когда вы можете просто сказать 'img.src ='?) – nnnnnn
, если я не дождался загрузки изображения сначала, js (часть, которая изменяет lazy на src on прокрутка) срабатывает преждевременно, нарушая сценарий. Я не знаю, как я могу сделать «img.src =» и позже удалить этот атрибут. У вас есть предложение? – HackYa
Если идея состоит в том, чтобы установить src, как только изображение находится в поле зрения, я * думаю *, что вам нужно, это избавиться от '.forEach' и' img.onload' и просто сохранить внутренний цикл 'for' и перед ним следует строка 'var imgs ='. Затем присвойте 'window.onload = window.onscroll = hackyaFunction_lazy;' * outside * функцию. Таким образом, каждый раз, когда функция запускается, она будет изменять только 'src' * * только для изображений, которые отображаются в данный момент (и только если они не были загружены ранее). Единственный атрибут, который вы удаляете, - это «ленивый», поэтому нет причин, по которым вы не можете установить 'img.src =' и по-прежнему использовать 'o.removeAttribute ('lazy')'. – nnnnnn