Używam systemu siatki CSS opartego na procentach. Mam siatkę z 4 kolumnami, każda o 25% całkowitej szerokości strony. I wyjściowe mój obraz znaczniki wewnątrz każdej komórki „25%” tak:Leniwe ładowanie z obrazami "responsywnymi" (nieznana wysokość)
<img src="foo.jpg" style="max-width:100%" />
jako przeglądarka zmienia rozmiar, zmiana rozmiaru obrazów również wypełnić w 100% każdej komórki 25%. Przeglądarka wybiera wysokość, tak jakbym wstawił "height: auto" (co jest niejawne, gdy pominięto).
Teraz chcę dodać do tego leniwą funkcję ładowania. Problem polega na tym, że przed załadowaniem obrazów ich wysokość na stronie jest nieznana. Przeglądarka musi pobrać obraz &, obserwując współczynnik kształtu i obliczyć jego wysokość. Wcześniej wszystkie obrazy mają wysokość 1 piksela. Ponieważ każdy obraz ma wysokość 1 piksela, wszystkie są uważane za "wewnątrz rzutni" i są natychmiast ładowane.
Obecnie mam dowodu koncepcji gdzie przed wyprowadzania znacznika img, obliczyć współczynnik zdjęcia obrazu na serwerze, i wyjście w atrybucie danych:
<img src="foo.jpg" style="max-width:100%" data-aspect="1.7742" />
Następnie, na razie „dokument gotowy”, i pętli każdego obrazu i ustawić stałą«wysokość»wartość w pikselach przed leniwego ładowania:
$('img').each(function() {
var img = $(this);
var width = img.width();
var ratio = img.data('aspectratio');
var height = width/ratio;
$(this).css('height', height+'px');
});
To wydaje się działać, w tym sensie, że nie jest już ładuje wszystkie obrazy w tym samym czas, ale ładuje tylko obrazy podczas przewijania.
Wygląda jednak na to, że może powodować nowe problemy, na przykład rozciąganie obrazów w miarę zmiany rozmiaru przeglądarki przez użytkownika. Musiałbym zmienić "wysokość" z powrotem na "auto", gdy wywołanie zwrotne zostanie uruchomione, aby leniwy załadunek został zakończony. To by zajęło się obrazami, które widzi użytkownik - ale obrazy znajdujące się pod spodem nadal będą miały niewłaściwą wartość "wysokości" podczas zmiany rozmiaru przeglądarki. Za każdym razem, gdy zmieni się rozmiar przeglądarki, będę musiał powtórzyć wszystkie obrazy, które były wcześniej pod spodem, zmierzyć ich zaktualizowaną szerokość, odczytać ich proporcje i zaktualizować nową wysokość, a następnie powtórzyć leniwy załadunek, aby obsłużyć wszystko, co jest teraz powyżej zagięcie. Jeśli tego nie zrobię, ładowanie może zostać uruchomione zbyt wcześnie lub zbyt późno, ponieważ obrazy mają niewłaściwą wartość wysokości.
Moje pytanie brzmi, czy istnieją inne sposoby na leniwne ładowanie obrazów o nieznanych wysokościach, poza dokładną metodą, którą tu opisałem, i jakie byłyby tego konsekwencje? Czy jest jakaś wada mojej metody, poza tym, że boli ją programowanie?
Wygląda na to, że się udało. Przeglądarka ma tylko dwa sposoby poznania wymiarów obrazu: do pobrania lub w języku HTML. – Blazemonger
Dzięki za pewność. Wyobrażałem sobie również podejście, w którym leniwy ładuje pierwsze 4 obrazy, a następnie blokuje, aż zostaną ukończone, a następnie ponownie ocenia nowe pozycje pozostałych obrazów. Jedynym problemem jest to, że blokowanie sprawi, że rzeczy będą wolniejsze niż bez leniwego ładowania. –
OK Właśnie dowiedziałem się o sztuczce z podszewką: http://thisisthat.co.uk/notebook/2013-10-07-lazy-loading-responsive-images http://andmag.se/2012/ 10/responsive-images-lazy-load-and-multiserve-images/ –