Frage zum Lazyload für bestehende Galerie

Domi83

Rear Admiral
Registriert
Feb. 2010
Beiträge
5.307
Hallo Leute, ich habe seit Jahren eine kleine selbstgebaute Galerie für meine Zwecke zusammen gebaut die genau das tut was sie soll und mehr nicht. Da ich aber vor kurzem auf einer Hochzeit von einem guten Freund war, die Fotos wieder auf meine Webseite gepackt habe, würde ich die Galerie mit so einem Lazyload etwas performanter machen.

An sich ist der Aufbau relativ simpel... PHP guckt in einen Ordner rein, schaut wie viele Dateien darin sind und holt sich dessen Namen. Dieses wird in ein Array gepackt, alphabetisch sortiert und gut ist. Etwas weiter unten im HTML Bereich wird dann das Array anhand einer 'foreach()' Schleife ausgegeben.

Allerdings sind die Thumbs (in der Übersicht) mit maximal 300 x 300px bei einer Anzahl von ca. 1.300 Stück schon grob 80 MB groß... und das führt zu einer sehr langen Ladezeit beim öffnen der Seite. Wenn dann alles geladen ist, kann man auf das Thumb drauf klicken und es wird in einer Lightbox ausgegeben, so dass man relativ einfach vorwärts und rückwärts gehen kann :)

Jetzt wäre es aber noch toll, wenn man ein Lazyload einbinden könnte, so dass das Laden etwas besser abläuft. Ich hatte diese Variante gefunden und mal eingebaut... wenn ich die Images dann von src="" in data-src="" abändere, funktionieren die Thumbs... allerdings lädt er mir beim öffnen der PHP Seite dennoch alle Images in einem Durchgang. Entweder übersehe ich was, oder ich muss mir eine andere Variante einfallen lassen.

Vielleicht hat ja jemand die eine oder andere Idee für mich, den Quellcode gibt es nun auch dazu... ist halt recht simple gehalten, tut aber bei einer Galerie bis ca. 400 - 500 Bilder alles was benötigt wird :)

HTML:
<?php
    include_once('inc/config.php');

    $folder = "xxxxx";
    $handle = opendir($_SERVER['DOCUMENT_ROOT']."/bilder/".$folder."/");
    while(false !== ($file = readdir($handle))) {
        if(preg_match('/.*\.jpe?g/i', $file)) {
            $files[] = $file;
        }
    }
    asort($files);
    closedir($handle);
?>
<!DOCTYPE html>
<html lang="de">
    <head>
        <base href="<?php echo HTTP_HOST; ?>/">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta name="description" content="" />
        <meta name="keywords" content="" />
        <meta name="robots" content="<?php echo ROBOTS; ?>" />
        <title>Fotos - xxxxx</title>
        <link href="css/normalize.css" rel="stylesheet" type="text/css" />
        <link href="css/style.css" rel="stylesheet" type="text/css" />
        <link href="css/lightbox.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div id="wrapper">
            <div id="header"></div>

            <div id="navi" class="clearfix">
                <ul class="menu">
<?php foreach(require_once($_SERVER['DOCUMENT_ROOT']."/inc/navigation.php") AS $key => $url) { ?>
                        <li><a href="<?php echo $url; ?>"><?php echo $key; ?></a></li>
<?php } ?>
                </ul>
            </div>

            <div id="inhalt" class="clearfix">
                <div id="content">
                    <div class="artikel">
<?php
    foreach($files AS $name) {
        echo '<a data-imagelightbox="f" href="bilder/'.$folder.'/'.$name.'"><img alt="'.$name.'" class="lazy thumbs" src="bilder/'.$folder.'/thumbs/'.$name.'" title="'.$name.'"></a> ';
    }
?>
                    </div>
                    <div class="artikel_seperator"></div>
                </div>
            </div>

            <div id="footer"></div>
        </div>
        <script src="//code.jquery.com/jquery-latest.js"></script>
        <script src="js/jquery-imagelightbox.min.js" type="text/javascript"></script>
        <script src="js/script-lightbox.js" type="text/javascript"></script>
    </body>
</html>

Ich bin nun auch kein Profi Web-Entwickler, daher wird der eine oder andere vielleicht den Code komisch finden, aber wie schon erwähnt... im groben und ganzen tut es das was es soll und vielleicht kann man da noch irgendwie ein Lazyload einbinden :)

Schon mal vielen Dank für eure Hilfe und noch einen schönen Freitag... für den einen oder anderen wird ja bald Wochenende sein.

Gruß, Domi
 
Zuletzt bearbeitet:
Wie kann ein 300x300px großes Bild 80MB haben? :D In welchem Format liegen die Bilder denn vor? Ich würde auf jeden Fall empfehlen die Größe der Bilder deutlich zu reduzieren und ggfs. nach JPG zu konvertieren. Wenn jemand die Bilder in Originalqualität haben möchte, dann gibt es dafür deutlich bessere Kanäle, z.B. Cloud oder einfach als Dateidownload von deinem Webserver.
 
Ah... ne ne, der Fehler liegt bei mir in der Beschreibung. Die (Mehrzahl) Thumbs sind bei 300 x 300 px mittlerweile bei 80 MB angelangt. Das heißt, beim öffnen der Seite werden (bei dieser einen Galerie) aktuell 1.300 Thumbs sofort geladen und das sind die erwähnten 80 MB (nur Bilder).

Werde das aber gleich im ersten Post korrigieren...
 
OK, das ergibt eindeutig mehr Sinn :D

Ist das Skript oben vollständig? Da scheint mir nämlich der Include der JQuery-Lazy-Bibliothek zu fehlen:
<script type="text/javascript" src="jquery.lazy.min.js"></script>
Ergänzung ()

Außerdem sieht der JQuery-Include relativ am Ende auch seltsam aus:
<script src="//code.jquery.com/jquery-latest.js"></script>
Ich denke die beiden Slash am Anfang sind zu viel.
Ergänzung ()

Ansonsten wären noch die Konsolenausgaben beim Aufruf der Seite interessant. Im Firefox kannst du die Konsole mit STRG+SHIFT+K öffnen. Gegebenenfalls sehen wir dort noch weitere Fehlermeldungen.
 
Zuletzt bearbeitet:
Mea culpa... da ich gestern Abend noch herum probiert habe und es nicht zum Laufen bekam, habe ich es erst einmal wieder in der Ausgangs-Situation auf den Server geladen und mir von dort eben den Code genommen. Eigentlich sollte der untere Teil wie folgt aussehen...
HTML:
            <div id="inhalt" class="clearfix">
                <div id="content">
                    <div class="artikel">
<?php
    foreach($files AS $name) {
        echo '<a data-imagelightbox="f" href="bilder/'.$folder.'/'.$name.'"><img alt="'.$name.'" class="thumbs" data-src="bilder/'.$folder.'/thumbs/'.$name.'" title="'.$name.'"></a> ';
    }
?>
                    </div>
                    <div class="artikel_seperator"></div>
                </div>
            </div>

            <div id="footer"></div>
        </div>
        <script src="//code.jquery.com/jquery-latest.js" type="text/javascript"></script>
        <script src="js/jquery-lazy.min.js" type="text/javascript"></script>
        <script>
            $(function() {
                $('.thumbs').Lazy();
            });
        </script>
        <script src="js/jquery-imagelightbox.min.js" type="text/javascript"></script>
        <script src="js/script-lightbox.js" type="text/javascript"></script>
    </body>
</html>
Hier sieht man, dass ich den 'img src" korrekt angepasst habe und im Footer auch die Skripte drin habe :) Bezüglich der URL zum jQuery Code, die Slash sind soweit korrekt... man kann halt mehrere Möglichkeiten wählen,
  • https://
  • http://
  • // (hier sucht er sich selbst ob https, oder http)
Also jQuery generell funktioniert auch... die Lightbox funktioniert und im Impressum wandelt er mir die E-Mail Adresse auch entsprechend um... das einzige was mich wundert ist, dass der "Lazyload" der ja eigentlich (erstmal) nur ein Teil der Bilder laden soll, gleich alles lädt.

@Bodennebel, die Links schaue ich mir gleich mal an... vielen Dank.
 
Domi83 schrieb:
// (hier sucht er sich selbst ob https, oder http)
Das war mir nicht bekannt, aber gut zu wissen!

Bitte ersetze mal deinen Aufruf der Lazy-Funktion folgendermaßen:

Code:
    $('.lazy').Lazy({
        onError: function(element) {
            console.log('error loading ' + element.data('src'));
        }
    });

Dann brauchen wir bitte die gesamte Konsolenausgabe beim Aufruf der Seite.
 
Also der Firefox schreibt gar nichts in die Konsole, Chrome dafür schon... aber das hilft uns jetzt nicht wirklich weiter. Der "Error" der bemängelt wird, bezieht sich auf die favicon.ico, die es noch nicht gibt.

Mir ist aber etwas ein- / aufgefallen... wenn ich die Seite via Strg + F5 komplett neu lade (Firefox und Chrome), bekomme ich ja die "alt-texte" angezeigt, weil noch kein Bild da ist. Allerdings sind das auf den ersten Schlag mal grob 800 alt-texte die er mir da anzeigt. Somit müsste ja lazyload das laden des Images sofort initialisieren, weil das Image ja bereits im Bild sein sollte... oder sehe ich das falsch?

Rein theoretisch müsste ich den Images, wenn noch kein Bild vorhanden ist, schon mal eine Größe zuweisen. Da ich aber die Proportion beibehalten wollte, hatte ich dies wie folgt im CSS hinterlegt...
CSS:
img.thumbs {
    height: auto;
    width: 300px;
}

Was vielleicht bremst... es ist ja schon relativ viel HTML Quelltext in der Datei, wenn man diese öffnet... irgendwo sagte hier mal jemand, dass das rendern alleine auch schon Performance benötigt.
 

Anhänge

  • console01.png
    console01.png
    47 KB · Aufrufe: 380
Kannst du bitte mal einen Auszug vom erzeugten HTML mit den Skript-Includes, den ausgeführten Skripten und ein paar Thumbnails bereitstellen?
 
Also, ich hoffe ich habe korrekt verstanden was du meintest... habe im Firefox die Seite geöffnet, F12 gedrückt und alles was er da gerendert hat, raus kopiert und in eine .html Datei gepackt. Dazu habe ich dann noch ein paar Bilder sowie den CSS und JS Code gepackt... ist nun knapp 3 MB groß, hoffe aber das war es was benötigt wird.

Wenn man jetzt z.B. die Datei öffnet, sollte man sehen das er ja schon mal alle Bilder anzeigt... zumindest versucht er es und blendet dafür den alternativ-text ein.
 

Anhänge

Nach einigem rumprobieren und testen anderer Scripts muss ich leider passen, ich kann dir absolut nicht sagen, was das Problem ist. Meiner Meinung ist alles korrekt, ich kann keinen Fehler finden.
 
Moin... hab selbst auch noch mal ein wenig herum probiert. Da diese Galerie mit über 1.000 Fotos (dementsprechend auch Thumbs) eine der wenigen ist und alle "bis 500 / 600 Bilder" Seiten aufgrund der geringeren Grüße recht zügig laden, werde ich das erst einmal so lassen.

Vielleicht baue ich mir den "lazyload" auch nochmal mittels PHP nach... muss ja an sich nur die Dateien zählen, dem Skript sagen das er beim ersten laden nur "bis zu 200" Bilder laden soll und via AJAX lasse ich dann beim Scroll-Down die anderen nachladen.

Ich glaube so etwas hatte ich sogar schon mal irgendwo mit einer Datenbank gebaut, weil die Ausgabe sehr groß war... aber das mache ich, wenn ich wieder Zeit und Lust dazu habe oder es mich stört :D
 
Domi83 schrieb:
Also der Firefox schreibt gar nichts in die Konsole, Chrome dafür schon... aber das hilft uns jetzt nicht wirklich weiter. Der "Error" der bemängelt wird, bezieht sich auf die favicon.ico, die es noch nicht gibt.

Mir ist aber etwas ein- / aufgefallen... wenn ich die Seite via Strg + F5 komplett neu lade (Firefox und Chrome), bekomme ich ja die "alt-texte" angezeigt, weil noch kein Bild da ist. Allerdings sind das auf den ersten Schlag mal grob 800 alt-texte die er mir da anzeigt. Somit müsste ja lazyload das laden des Images sofort initialisieren, weil das Image ja bereits im Bild sein sollte... oder sehe ich das falsch?

Rein theoretisch müsste ich den Images, wenn noch kein Bild vorhanden ist, schon mal eine Größe zuweisen. Da ich aber die Proportion beibehalten wollte, hatte ich dies wie folgt im CSS hinterlegt...
CSS:
img.thumbs {
    height: auto;
    width: 300px;
}

Was vielleicht bremst... es ist ja schon relativ viel HTML Quelltext in der Datei, wenn man diese öffnet... irgendwo sagte hier mal jemand, dass das rendern alleine auch schon Performance benötigt.


Ich glaube im css liegt der Hund begraben (ohne den code zu kennen), setz die Höhe mal auf feste 300 px und schau was passiert o.o

Edith: ich hab das mal mit deiner Beispielseite durchprobiert, das Problem ist wirklich height: auto; ! Ums mal kurz zu erklären: lazyloading basiert ja darauf dass alles was aktuell auf dem Bildschirm ist nachgeladen wird. Du wamst da jetzt alle Bilder in Hrefs auf die Seite, die haben aber für sich gerade mal die Höhe der hrefs, also passen quasi alle 1500 im Ursprungszustand auf den Screen und werden dann eben alle über lazyloading geladen. Entweder gibste also allen Bildern eine feste Höhe oder zumindest ein min-height: 150px; height:auto; oder so mit (damit eben nicht alle Bilder direkt auf den Screen passen wenn die Seite geladen wird!).

Dass es daran liegt siehst du schon bei deiner Beispielseite, geh einfach mal in den Quelltext und ersetz in der Zeile mit den Bildern src= durch data-src= und lad die Seite, wenn die 4/5 Bilder da nicht geladen würden wäre die Seite komplett auf dem Screen!

unter http://jquery.eisbehr.de/lazy/example_basic-usage sieht man auch beim CSS dass die da feste Werte mitgeben....
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: r15ch13
Ich würde an deiner Stelle an Dummy Bild laden. Du weißt schon diese Platzhalter für Fotos. Das schreibst du überall ins src des img tags.
 
KingLM97 schrieb:
Hi,

ich mache zwar nicht viel mit Webentwicklung, aber ist das nicht das was du möchtet?
Sparta8 schrieb:
Ich würde an deiner Stelle an Dummy Bild laden. Du weißt schon diese Platzhalter für Fotos. Das schreibst du überall ins src des img tags.

Und Ihr zwei Spaßvögel habt jetzt was zur Problemlösung beigetragen nachdem ich den passenden Hint gegeben habe? Richtig, gar nichts. WIE er das löst ist seine Sache, Hauptsache mal große Fresse gehabt...
Ergänzung ()

Sparta8 schrieb:
Ich würde an deiner Stelle an Dummy Bild laden. Du weißt schon diese Platzhalter für Fotos. Das schreibst du überall ins src des img tags.

Kannste machen, oder du setzt überall ein Div drumherum und gibst dem ne feste Breite, oder oder oder. Ich denke wenn er jetzt einmal das Problem verstanden hat ist es an ihm die Lösung zu finden, und zwar die die ihm in den Kram passt!
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Gee858eeG
mambokurt schrieb:
Hauptsache mal große Fresse gehabt...
? :D
Normale Vorgehensweise ist es ein Dummy Bild zu laden. Bitte hör auf unter der Woche zu saufen und ins Forum zu posten, wenn du deine Sprache nicht unter Kontrolle hast.
 
Sparta8 schrieb:
? :D
Normale Vorgehensweise ist es ein Dummy Bild zu laden. Bitte hör auf unter der Woche zu saufen und ins Forum zu posten, wenn du deine Sprache nicht unter Kontrolle hast.

Das war einfach nicht die Frage! In drölf Monaten ruft wer das Thema über Google auf und nimmt mit 'da MUSS ich halt ein Dummybild laden', obwohl das gar nicht die Frage oder Antwort war. Noch besser: hätte sich jemand das Css angeschaut wüsste derjenige dass es 3 verschiedene Thumbgrößen gibt. 3 Dummies? Oder doch eher einfach eine feste Größe und ein Unicodezeichen vllt? Und wie genau funktioniert das jetzt mit seiner Js Bibliothek und dem dummy, code? Nichts für ungut, aber 'mach doch dummy' hilft doch jetzt niemandem wirklich weiter, oder?

Fakt ist einfach dass der TE sich ja halbwegs auszukennen scheint, ich weiß nicht ob das zielführend ist dem jetzt Designvorschläge zu machen (mehr ist es ja nicht) wenn das eigentliche Thema schon durch ist. Das Problem ist erkannt, er kann es lösen wie er mag, und wenn er nicht weiß wie fragt er sicherlich nochmal und dann ist 'mach doch dummy' auch ein ordentlicher Beitrag, so wie der Thread sich gerade darstellt ist es(meiner Auffassung nach) einfach nur Spam.

Genug gerantet, das wird leicht offtopic hier ;) Ich bin dann mal weg :D
 
Moin... ein Dummy Pic habe ich noch nicht hinterlegt, aber alleine das hinzufügen der "min-height" scheint am PC Browser die Ladezeit extrem verkürzt zu haben. Genaueres teste ich aber erst, wenn ich wieder fit bin.

Kam gestern noch nicht dazu, weiter zu prüfen... wollte erstmal gucken ob ich aufgrund der neuen Cookie Bestimmung ein passendes Skript finde. Denn dank EuGH muss ja jetzt aktiv bestätigt werden ob man so etwas zulassen will oder nicht und ich hatte vorher nur so ein simples "cookie-note" wie hier auf Computerbase.

Gruß, Domi
 
Zurück
Oben