Don P: project fader framework

Beitrag lesen

Hallo,

Zum Thema Div Suppe: Ich verdiene ja auch nich mein geld damit :-)

Soso... ich schenke dir mal folgende Optimierung (oder gibst du mir was dafür?):

  
/***********************************************************************/  
var FaderFramework = {  
  
    geladen: false,  
    vorgemerkt: [],   /* synonym zu 'new Array()' */  
  
    init: function (einstellungen) {                             // this ist das FaderFramework-Objekt:  
  
        if (!this.geladen) {                                     // Dokument noch unvollständig:  
  
            this.vorgemerkt.push(einstellungen);                 // Einstellungen vormerken  
  
        } else {                                                 // Dokument vollständig:  
  
            var spanElement = this.createFader(einstellungen);   // span mit Fader erstellen  
  
            if (spanElement) {                                   // wenn ok, warten & starten:  
  
                window.setTimeout(function () { spanElement.fader.run(); }, spanElement.fader.viewTime);  
            }  
        }  
    },  
  
    start: function () {  
  
        var oldWinOnLoad = window.onload;                        // alten onload-Handler merken  
  
        window.onload = function () {                            // neuen onload-Handler setzen  
  
            if (oldWinOnLoad) { oldWinOnLoad(); }                // ggf. alten Handler zuerst rufen,  
            FaderFramework.onload();                             // dann unseren Handler  
        };  
    },  
  
    onload: function () { // onload-Handler (this ist das FaderFramework-Objekt):  
  
        var e = document.createElement("link");  
        e.type = "text/css";  
        e.rel = "stylesheet";  
        e.href = "fader-framework/fader-framework.css";  
        document.getElementsByTagName("head")[0].appendChild(e); // CSS-Stylesheet einbinden  
  
        this.geladen = true;                                     // Fader-Framework ist jetzt bereit  
  
        while (this.vorgemerkt.length) {                         // mit allen vorgemerkten Fadern:  
  
            this.init(this.vorgemerkt.shift());                  // erstellen und laufen lassen  
        }  
        delete this.vorgemerkt;                                  // vorgemerkte Fader löschen  
    },  
  
    createFader: function(einstellungen) {  
  
        var id = einstellungen.id, original = id && document.getElementById(id);  
        if (!original || original.fader || einstellungen.bilder.length < 2) { return null; }  
  
        var Fader = function (span, einstellungen) { // Konstruktor für Fader (this ist das span-Element)  
  
            this.viewTime   = einstellungen.viewTime || 2000;      // Standard 2s  
            this.speed      = einstellungen.speed || 1;            // Überblend-Tempo  
            this.bilder     = einstellungen.bilder;                // Bildquellen  
            this.bilder.rot = function(){this.push(this.shift())}; // Rotiermethode (this ist das Array)  
            this.bildElmt   = span.firstChild;                     // Vordergrund  
            this.span       = span;                                // Hintergrund  
  
            this.run = function (step) { // run-Methode für schrittweises Überblenden:  
  
                var fader = this;                                                   // für Closures  
  
                step = step || 0;                                                   // Deckkraft, Standard 0  
                this.bildElmt.deckkraft(step);                                      // Deckkraft neu setzen  
  
                step += this.speed;                                                 // nächste Deckkraft  
  
                if (step <= 100) {                                                  // noch keine volle Deckkraft:  
  
                    window.setTimeout(function () { fader.run(step); }, 1);         // weiter überblenden  
  
                } else {                                                            // volle Deckkraft erreicht:  
  
                    this.bilder.rot();                                              // Bild-Array rotieren  
                    this.span.style.backgroundImage = "url(" + this.bilder[0] +")"; // neuer Hintergrund  
                    this.bildElmt.deckkraft(0);                                     // Vordergrund durchsichtig  
                    this.bildElmt.src = this.bilder[1];                             // neuer Vordergrund  
                                                                                    // warten & überblenden:  
                    window.setTimeout(function(){ fader.run(); }, fader.viewTime);  
                }  
            };  
        };  
  
        var span = document.createElement("span");                           // span-Element als Container  
        span.style.backgroundImage = "url(" + einstellungen.bilder[0]  +")"; // mit Hintergrundbild  
  
        var bildElement = document.createElement("img");           // neues Bildelement für Vordergrund  
        bildElement.src = einstellungen.bilder[1];                 // Bildquelle für Vordergrund setzen  
        bildElement.alt = "Bild";                                  // Alternaiv-Text setzen  
  
        bildElement.deckkraft = function(wert) { // Deckkraft-Methode zuweisen (this ist das bildElement)  
            this.style.opacity = wert/100;  
            this.style.filter = "Alpha(opacity=" + wert + ", finishopacity=" + wert + ", style=2)"; // IE  
        };  
  
        bildElement.deckkraft(0);                                  // Vordergrund durchsichtig machen  
        span.appendChild(bildElement);                             // und in Hintergrund-Container stecken  
  
        span.id = original.id;                                     // id des Originalbildes beibehalten  
        span.className = "fader";                                  // CSS Klasse für Positionierung zuweisen  
        span.fader = new Fader(span, einstellungen);               // fader-Eigenschaft für Container setzen  
  
        original.parentNode.replaceChild(span, original);          // Originalbild durch Container ersetzen  
        return span;                                               // und diesen zurückgeben  
    }  
};  
  
FaderFramework.start();  
/***********************************************************************/  

Hier wird nicht für *jedes* Bild ein eigenes img-Element erzeugt und diese im DOM ein- und umgehängt, sondern es reicht ein einziges img-Element pro Fader zum Überblenden, eingebettet in ein span-Element, das eine Hintergrundgrafik hat. Das Original-Bild wird einmalig durch dieses span-Element ersetzt.

Zum Faden ändert das img-Element mit Hilfe einer eigenen Methode seine Deckkraft, und zum enlosen Bildwechseln ändert der Fader nur die src-Attribute des img-Elements und der Hintergundgrafik.

So klappt's übrigens auch mit dem IE. :-)

Im CSS braucht man nur:
/***********************************************************************/

  
.fader {  
    position: relative;  
    display: inline-block;  
}  
  
.fader img {  
    vertical-align: top;  
}  
/***********************************************************************/  

Auf eine CSS-Klasse "next" und eine Methode "next" im Fader wurde verzichtet.

Es fehlen hier die Random-Sache und die automatische Pfad-Anpassung, die im original-Fader-Framework gegen Ende der noch eingbaut sind.

Möglicherweise ist der Verzicht auf die vielen img-Elemente auch ein Nachteil, Stichwort preload von Bildern. Bei einem langsamen Netz könnte es vielleicht zu Problemen kommen, falls eine überblendende Grafik noch nicht (ganz) geladen ist...

In diesem Fall müsste man doch zuerst alle laden, was aber nicht schwer mit obigem Code zu implementieren ist.

Gruß, Optimierer alias Don P ;-)