Preloading Image für das Jquery Reel Plugin

  • Hallo zusammen,


    nachdem ich versucht habe mit zahlreichen "Walkarounds" das Problem selbst zu lösen, aber kläglich gescheitert bin, hoffe ich hier bei euch im Forum Hilfe zu finden.


    Das Problem:


    Ich benutze ein OpenSource Javascript/bzw. Jquery basiertes Plugin namens -->Jquery Reel. Dieses Plugin ermöglicht es mir eine Bildsequenz aus mehreren Einzelbildern zu laden und eine 360° Grad Rotation zu erzeugen.


    Beispiel des Plugin: http://test.vostrel.net/jquery…ct-movie-camera-sequence/

    Homepage des Plugins: http://jquery.vostrel.cz/reel


    Habe das Plugin bereits erfolgreich eingerichtet und es funktioniert soweit. Was mich allerdings noch etwas stört ist der Preloader. Bei größeren Bildern mit längerer Ladezeit (ca.6-10 Sekunden) läuft momentan ein kleiner Fortschrittsbalken am unteren Bildrand.


    Dies würde ich gerne wie folgt ändern: anstatt des sich aufbauenden Ladebalkens, soll einfach so lange ein Bild/bzw. animiertes .Gif zu sehen sein, bis der Player vollständig alle Bilder geladen hat.



    --> Habe bereits einen Webseiten Preloader (wie hier:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
    ) ausprobiert, welcher die Seite erst nach dem vollständigen Laden aller Inhalte anzeigen soll, jedoch verschwindet dieser sofort sobald das Plugin initialisiert wurde.



    Hättet ihr eine Idee, wie man dies umsetzen könnte?


    Vielen Dank für Eure Hilfe!


    Christian




    PS: es gab bereits eine Anfrage dies Umzusetzen (sieher hier: https://github.com/pisi/Reel/issues/52 ) , welches aber vom Entwickler des Scripts ziemlich schnell und herzlos abgeschmettert wurde....

  • Nochmal hi zusammen,


    da es bisher auch von euch noch leider keine Ideen/Vorschläge gab, habe ich einmal den Autor des Plugins angesprochen, welcher mir folgendes geantwortet und diese Tipps gegeben hat:




    mit diesen Hinweisen habe ich anschließend im Quellcode des Plugins (siehe hier: Quellcode Jquery Reel) gestöbert und den beschrieben Abschnitt gefunden (ab Zeile 1245):




    trotzdem verstehe ich bisher nur einen kleinen Teil des Codes und weiß nicht wie, bzw. wo ich am besten das Preloading-Bild einfüge/einbinde, so dass es immer angezeigt wird bis der Player komplett geladen hat ;(;(;(


    habt ihr vllt eine Idee? bzw. könnt Licht ins dunkel bringen?


    Viele Grüße


    Christian

  • Hi Arne,


    genau da liegt mein Problem.... der Code ist zwar sehr gut und ausführlich erklärt, ich verstehe Ihn aber mit meinen einfachen Java-Grundkenntnissen leider nur zur hälfte, bzw gar nicht richtig. :(


    Könntest du bzw. ein anderer netter User aus dem Forum mir mal die einzelnen Zeilen und deren Funktion im Script etwas genauer, bzw. in einfachen Worten erklären, damit sich mir ich die Logik dahinter etwas besser erschließt? würde echt gerne mal ein bisschen mehr über das Script im Detail lernen wollen...


    wo wäre es denn deiner Meinung nach am einfachsten ein Bild einzubauen? wenn ich es richtig verstehe...ist das preloaded event doch lediglich dazu da einen sich kontinuierlich aufbauenden Fortschrittsbalken zu generieren, da dieser bei jedem geladenen Quellbild immer +1 triggert und der Fortschrittsbalken so bis 100% fortschreitet....


    VG und ein schönes Wochenende an alle!:)


    Christian

  • Zitat

    Habe das Plugin bereits erfolgreich eingerichtet und es funktioniert soweit.

    Da bist Du besser als ich: Ich habe versucht, eine Testseite einzurichten und egal was ich mache, das gescrollte Bild ist immer riesengroß. ein background-image mit 6000px x 3000px.


    Ich hatte jedoch den Eindruck, dass das Bild, was im src-Tag angegeben wird, sofort angezeigt wird und dann durch das Bild, das in data-image(s) angegeben wird, nach dem Laden ersetzt wird. Versuche doch mal, im src-Tag dein Ladebild anzugeben und im data-image(s) das richtige.

  • Hi Semper,


    diese Idee hatte ich bereits ebenfalls... habe als image-src bereits ein Loading Gif erstellt und eingefügt. Auch bei mir wird es nur kurz dargestellt und sofort durch die anderen (Quell) Bilder aus den data-images ersetzt, welche ja die Einzelbilder/einzelnen Winkelschritte für die Rotation sind.


    Dachte auch, dass wenn ich das Img-src Bild als Gif Bild mit einer Abspieldauer von 10 sek erstelle... es zumindest erst einmal 10 sek gezeigt wird (also bis die Animation beendet ist) und erst dann wechselt... leider nicht der fall...blinkt kurz auf und verschwindet wieder sofort.


    Denke mal das das Src Image vor allem bei der Benutzung eines sog. Sprite Sheets (also einem großen Einzelbild, in welchem alle Quellbilder vereint sind) sinn macht, aber nicht, wenn man die Quellbilder eh alle einzeln lädt...


    trotzdem vielen Dank für deine Idee! :)


    VG Christian

  • Zitat

    bereits ein Loading Gif erstellt und eingefügt. Auch bei mir wird es nur kurz dargestellt und sofort durch die anderen (Quell) Bilder aus den data-images ersetzt

    Wenn die anderen Bilder aus data-images sofort, d. h. nach einem ganz kurzen Moment, angezeigt werden, heißt das doch, dass sie auch ganz schnell geladen werden - Anzeige erst, wenn Ladevorgang beendet?

  • Hi Semper,


    das kommt ganz auf die Bildgröße an. Habe Sie momentan recht klein gehalten, damit sie (bzw. das 3D Objekt im gesamten) schnell laden. Wenn die Auflösung oder die Gesamtanzahl der Quellbilder größer wird (z.b. bei mehreren Reihen und Zeilen in einem 3D Objekt) dauert es erheblich länger.


    Das Problem ist jedoch nicht, dass die Bilder schnell oder langsam geladen werden, sondern eher, dass der Nutzer nur eine unvollständige, abbrechende bzw. stockende 360° Grad Rotation des Objektes angeboten bekommt, wenn noch nicht alle Bilder komplett geladen wurden.


    Diese möchte ich halt gerne irgendwie umgehen, so dass das fertige 3D Objekt erst angezeigt wird, wenn es wirklich zu 100% vollständig geladen wurde. Vorher soll halt so lange ein Preloading Bild gezeigt werden...


    hättest du eine Idee für eine Umsetzung?


    VG und schönes WE!


    Christian

  • Dann müssen wir bei den Eventhandlern ansetzen, von denen oben die Rede war. Du hast ja in #2 das Wesentliche gepostet. Der Code ist gut kommentiert, so dass man nicht Zeile für Zeile analysieren muss.


    1. // ### `preloaded` Event ######
    2. // `Event`, since 1.1
    3. //
    4. // This event is fired by every preloaded image and adjusts the preloader indicator's
    5. // target position. Once all images are preloaded, `"loaded"` Event is triggered.
    6. //
    7. preloaded: function(e){

    D. h. Du musst das event "loaded" verwenden, denn das wird getriggert, wenn alle Bilder geladen sind. Also dein Ladebild über das Panorama- bzw. 3D-Bild legen und in der Funktion loaded unsichtbar machen:


    Code
    <div id="peelwrapper">
        <img src=" ... " hier alles was Du für Peel benötigst >
        <img src="loadimg.gif" id="loadimg">
    </div>

    CSS:

    Code
    #peelwrapper {
        position: relative;
    }
    #loadimg {
        position: absolute;
        left: 0;
        top: 0;
    }

    Und der Kern der Sache: In der Funktion loaded das Ladebild unsichtbar machen:

    Code
    // `"loaded"` Event is the one announcing when the instance is "locked and loaded".
                      // At this time, all is prepared, preloaded and configured for user interaction
                      // or animation.
                      //
                      loaded: function(e){
                        document.getElementById("loadimg").style.display = "none";
                        get(_images_).length > 1 || t.css({ backgroundImage: url(reel.substitute(opt.path+get(_image_), get)) }).attr({ src: cdn(transparent) });

    Wenn Du statt dessen die Opacity von 1 auf 0 änderst, kannst Du mit transition ein geschmeidiges Ausblenden des Bildes erreichen. Allerding musst Du es dann durch pointer-events: none; für die Mausaktionen durchlässig machen.

  • Hi Semper,


    vielen Dank für den Tipp und die ausführliche Erklärung! habe mich sehr gefreut mal wirklich gute Infos zu bekommen.


    Denke mal es hat "klick" bei mir gemacht ;)


    werde berichten ob es funktioniert....


    VG Christian

  • Hi zusammen,


    habe Sempers Tipp versucht umzusetzen...ohne Erfolg. Deshalb brauche ich leider erneut eure Hilfe....da ich denke, dass ich einen Denkfehler bei der Umsetzung habe....


    bisher habe ich folgendes gemacht:


    Code
    <div id="peelwrapper">
        <img src=" ... " hier alles was Du für Peel benötigst >
        <img src="loadimg.gif" id="loadimg">
    </div>

    diesen Code habe ich in den <Body> Tag meiner Webseite eingefügt, auf welcher das 3D Bild/Panorama angezeigt wird. Bei Img Src = "... " hier alles was du für Peel benötigst ---> habe ich die Bildadresse zum Ladebild, was den Player überlagern soll eingegeben.


    Code
    #peelwrapper {
        position: relative;
    }
    #loadimg {
        position: absolute;
        left: 0;
        top: 0;
    }

    Diesen CSS Code habe ich so wie er ist als extra <style> Tag in den <head></head> Abschnitt eingefügt.


    und zu guter letzt:


    Code
    // `"loaded"` Event is the one announcing when the instance is "locked and loaded".
                      // At this time, all is prepared, preloaded and configured for user interaction
                      // or animation.
                      //
                      loaded: function(e){
                        document.getElementById("loadimg").style.display = "none";
                        get(_images_).length > 1 || t.css({ backgroundImage: url(reel.substitute(opt.path+get(_image_), get)) }).attr({ src: cdn(transparent) });

    in der original Javascript Datei (jquery.reel.js) mit diesem Code von Semper ausgetauscht.



    Habe ich hier einen Denkfehler begangen? Was könnte das Problem sein, das es nicht funktioniert?



    Zum besseren Verständnis hier noch einmal kurz der Code, den ich für die HTML Seite benutze, auf welcher der Player angezeigt wird:


    Viele Grüße und schönes Wochenede!


    Christian

  • Zitat
    Bei Img Src = "... " hier alles was du für Peel benötigst ---> habe ich die Bildadresse zum Ladebild, was den Player überlagern soll eingegeben.

    Das ist mit großer Wahrscheinlichkeit das Problem:

    Code
    <div id="peelwrapper">
        <img src=" ... "> <!-- Dies ist das eigentliche Bild, das Reel anzeigen soll -->
        <img src="loadimg.gif" id="loadimg"> <!-- Dies ist das Ladebild, das das eigentliche Bild
                                              waehrend des Ladens verdecken soll -->
    </div>
  • habe jetzt nochmal die verschiedensten Varianten ausgetestet mit der Korrekten zuordnung des Ladebildes.


    Mit folgendem Ergebnis:


    Füge ich :


    Code
    <div id="peelwrapper">
        <img src=" ... "> <!-- Dies ist das eigentliche Bild, das Reel anzeigen soll -->
        <img src="loadimg.gif" id="loadimg"> <!-- Dies ist das Ladebild, das das eigentliche Bild
                                              waehrend des Ladens verdecken soll -->
    </div>

    überhalb des Reel Players Codes auf meiner HTML Seite ein...liegt das Bild hinter dem Player. Setze ich den Code unter den Reel Player wird das Bild einfach nur unterhalb des Players dauerhaft angezeigt...


    hilft das weiter?


    VG Christian

  • Normaler Weise liegt das oben, was zuletzt notiert wurde, aber wahrscheinlich modifiziert das Reel-Skript das DOM, so dass es dennoch überdeckt wird. Versuche, mit z-index das Ladebild nach vorn zu holen:

    Code
    #loadimg {
        z-index: 9999;
    }
  • Ich habe es jetzt mal getestet mit den Bilder mit der Fischtasse und bei mir funktioniert es einwandfrei, auch ohne z-index:

    Code
        <div id="reel-wrapper">
            <img src="fish/DSCN0691.JPG" width="210" height="186" class="reel" id="image"
                data-images="fish/DSCN####.JPG|691..702">
            <img id="loadimg" width="210" height="186" src="/images/dia0.jpg">
        </div>
    Code
    loaded: function (e) {
        get(_images_).length > 1 || t.css({ backgroundImage: url(reel.substitute(opt.path + get(_image_), get)) }).attr({ src: cdn(transparent) });
        get(_stitched_) && t.attr({ src: cdn(transparent) });
        get(_reeled_) || set(_velocity_, opt.velocity || 0);
        set(_loading_, false);
        loaded = true;
        $("#loadimg").css({ "opacity": 0 });
    },
  • Hi Semper,


    erstmal danke für deine Hartnäckigkeit!!! :thumbup::thumbup::thumbup: werde jetzt erstmal versuchen dein funktionierendes Beispiel von oben bei mir zum laufen zu bekommen und dann auf mein Projekt versuchen umzusetzen....


    Danke nochmal für all deine Geduld und das austesten!


    VG Christian

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!