Autorenseite auf YAML 4 umgestellt

Letzte Woche habe ich an der Umstellung meiner Autorenseite auf die neue Version des CSS-Frameworks YAML gearbeitet und die Seite auch online gestellt. Nach einigen Textanpassungen am Wochenende ist die Seite fertig. Wer möchte, kann sich das Ergebnis hier ansehen:

http://www.manuelschenk.de

Das neue CSS-Framework YAML in der Version 4 kann man auf dieser Seite näher kennenlernen:

http://www.yaml.de

CSS: Less Framework 4 – Stolpersteine für Umsteiger

Die neue Version 4 von Less Framework ist erschienen und birgt für Entwickler, die von Version 3 umstellen möchten, einige Stolpersteine. Eine Neuerung beinhaltet, dass die Aufteilung der vier wichtigen Layouts geändert wurde. Wer also seine eigene Seite auf die Pixelmaße der alten Layouts aus Version 3 abgestimmt hat, wird diese neu anpassen müssen. Der wichtigste Hinweis ist aber, dass sich die Reihenfolge der Layouts in der CSS Datei geändert hat. Das Basislayout ist in der Version 4 das größte Layout und nicht mehr das zweitgrößte. Aufgrund der Tatsache, dass die Layouts aufeinander aufbauen, ist das eine elementare Änderung, die etwas Umstrukturierung erfordert.

Joomla: Neuer Header für das ja_purity Template

Letzte Woche habe ich an einer Joomla-Webseite diverse CSS-Änderungen vorgenommen, um diese Seite der Designvorlage anzugleichen. Die Basis war das ja_purity-Template von JoomlArt.com, welches sich scheinbar nicht für den Internet Explorer 7 eignet. Zumindest der Header der Seite war definitiv nicht das, was andere Browser darstellten. Der Header besteht, neben einem H1 mit Link und einem Logo im Hintergrund, aus einer Tabelle, in welcher die Kontakt-Links eingesetzt werden. Kurzerhand habe ich Header neu erstellt und diesen etwas übersichtlicher gestaltet:

<div id="logo_new">
    <img src="/templates/ja_purity/images/logo.png" alt="" />
    <div id="logo_title">Titel der Webseite</div>
    <div id="logo_links">
        <a href="#">Kontakt</a>
        <span>  - </span>
        <a href="#">Impressum</a></div>
    </div>
</div>

Verwundert war ich über den PHP-Code direkt im Template. Meine Idee von einem CMS war bisher immer, dass man nicht gleich PHP-Entwickler sein muss, um ein Template zu ändern.
Die Links innerhalb des letzten DIVs werden so wie sie sind von Joomla in die Seite gesetzt. Wichtigster Part ist das umliegende DIV, indem die DIVs und das Image ganz ungestört “floaten” können. :)

Der CSS-Teil ist ebenfalls sehr übersichtlich:

#logo_new
{
    padding:        30px;
    margin:         0px;
    width:          770px;
    height:         41px;
}
#logo_new img
{
    float:          left;
}
#logo_title
{
    margin-left:    20px;
    float:          left;
    color:          #9D9D9C;
    font-size:      20px;
    line-height:    45px;
    font-weight:    bold;
}
#logo_links
{
    margin-top:     10px;
    float:          right;
    color:          #999;
    font-size:      11px;
}
#logo_links a
{
    text-decoration:none;
}
#logo_links a:hover
{
    color:          #000;
}

Interessant war die Tatsache, dass die template.css mehr als 1500 Codezeilen hat. Das halte ich für extrem übertrieben und ist mir bisher für ein “einfaches” Template in der Form noch nicht unter die Augen gekommen. Meine Empfehlung: ein Joomla-Template auf Basis eines CSS-Frameworks erstellen.

CSS: Less Framework 3 – Anpassungen für ein zentriertes Layout

Das Beispiellayout auf der Seite des Less Framwork ist leider nicht zentriert, was mich bei der Umsetzung eines neuen HTML-Dummys sehr gestört hat. Um dies zu bewerkstelligen, habe ich ein weiteres DIV unterhalb des BODYs eingefügt und ein paar kleine CSS-Anpassungen in jedem der Layouts vorgenommen. Als erstes setzt man in jedem Layout das DIV auf die festen Breiten des BODYs und zusätzlich noch ein margin von ‘0 auto 0 auto‘ am Anfang. Des Weiteren bekommt der BODY nur noch zu Begin des StyleSheets die Breite von 100% zugewiesen und ein padding von 0. Die restlichen Definitionen des BODYs in den einzelnen Layouts können entfernt werden. Das zweite DIV unterhalb des BODYs hat zur Folge, dass jetzt die Seite auf jedem Endgerät zentriert dargestellt wird.

CSS: Less Framework 3

In diesem kleinen Beitrag möchte ich auf die neue Version 3 von Less Framework hinweisen, mit dem man ohne großen Aufwand Webseiten erstellen kann, die auch auf mobilen Endgeräten eine gute Figur machen. Normalerweise verwende ich selbst für meine Webseiten (manuelschenk.de und schenk2000.de) das CSS Framework YAML, mit dem ich sehr gute Erfahrungen gesammelt habe. Frameworks mit Gridlayout (wie z.B. blueprintcss.org) habe ich bisher gemieden, was sich nun für ein Testprojekt ändern soll. Der Fokus auf mobile Geräte hat mich auf Less Framework aufmerksam werden lassen, weil die Seite in beiden Welten interessant aussehen soll. Wer sich nur auf mobile Browser fokussieren möchte, kann auch auf jQueryMobile.com zurückgreifen, was noch diverse interessante Features mitbringt. Sollte es in absehbarer Zeit eine Seite geben, die ihren Weg von einem Testserver ins Internet findet, werde ich an dieser Stelle den Link posten. Less Framework 3 findet man übrigens hier: http://lessframework.com

jQuery: Einfaches Parallax Scrolling

Ein kurzes Tutorial zur simplen Realisierung von Parallax Scrolling mit jQuery (und ein wenig CSS) möchte ich heute vorstellen. Dazu benötigen wir ein großes Hintergrundbild (in meinem Fall 1280×1024) und eine transparentes Vordergrundbild als PNG. In meinem Beispielcode definiere ich zwei geschachtelte DIVs (para_stage und para_inner) und zwei SPANs, welche als Buttons fungieren sollen.

<div id="para_stage">
 <div id="para_inner"></div>
</div>
<center>
 <span id="para_left">&lt;&lt;</span>&nbsp;<span id="para_right">&gt;&gt;</span>
</center>

Der CSS Teil ist ebenfalls relativ übersichtlich. Wichtig ist hierbei, dass das Hintergrundbild mindestens so groß sein sollte wie para_stage. Bei dem transparenten Vordergrundbild ist das relativ egal, weil es sich sowieso wiederholen muss.

#para_stage
{
    z-index:            0;
    background:         #000 url('../img/space.jpg') top no-repeat;
    overflow:           hidden;
    width:              500px;
    height:             500px;
    margin:             0px auto;
    border:             1px solid #fff;
}
#para_inner
{
    z-index:            1;
    background:         transparent url('../img/wall.png') top repeat;
    width:              2000px;
    height:             500px;
    position:           relative;
    top:                0px;
    left:               -250px;
}

Zu guter Letzt definieren wir noch die Click-Events der SPANs, mit denen wir das “Animate” auslösen, damit beim Klick ein weiches Scrollimg ausgelöst wird. Mit dem Wert sollte man nach Lust und Laune herumspielen, um einen für sich selbst ansprechendes Ergebnis zu erhalten.

$(document).ready(function()
{
    $('#para_left').click(function()
    {
        $('#para_inner').animate(
        {
            left: '+=50'
        }, 300, function(){});
    });

    $('#para_right').click(function()
    {
        $('#para_inner').animate(
        {
            left: '-=50'
        }, 300, function(){});
    });
});

Wer möchte, kann noch eine Begrenzung einbauen, damit man nicht an Anfang oder Ende der Vordergrundgrafik gelangt.

jQuery: Animierter Vorspann und Abspann

Die Funktion anim von jQuery lässt sich in viellerlei Hinsicht für sehr interessante Dinge einsetzen. Ein spezielles Beispiel von mir ist eine Art Vor- und Abspann, den man in Filmreifer Art und Weise anlegen kann. Ein Anwendungegebiet wären diverse JavaScript-Spiele, die so manches Mal sehr lieblos einem Benutzer vorgesetzt werden. Ein Vorspann oder lustige Credits sind das eine oder andere Mal durchaus wünschenswert.

Unter folgendem Link findet man ein kleines aber feines Beispiel für Intro und Extro:

http://lab.schenk2000.de/intro/index.html

In diesem Beispiel werden alle Animationsschritte mit setTimeout explizit gestartet – es steckt also kein großes Hexenwerk dahinter. Der Text wird in einer Funktion aus einem Array gelesen und Stück für Stück mit Verzögerung angezeigt. Hier die Funktion, die einen Text anzeigt und animiert:

function animSequence(txt,timer)
{
    $('#gText').html(txt);
    $('#gText').animate(
    {
        opacity:    1.0,
        fontSize:   '3em'
    },0);
    $('#gText').show();
    $('#gText').animate(
    {
        opacity:    0.0,
        fontSize:   '3em'
    },
    {
        duration: timer,
        specialEasing: {
            width: 'linear',
            height: 'easeOutBounce'
        },
        complete: function()
        {
            $('#gText').hide();
        }
    });
}

Als nächstes braucht man nurnoch ein Array mit Texten zu definieren und diesen in einer Schleife durchgehen:

arrText = ['','Schenk2000 presents',
        'a CrankSchenk production',
        'Silent Space',
        'Chapter I - The Awakening'];

for(i=0;i<arrText.length;i++)
{
    setTimeout('animSequence("'+arrText[i]+'",'+(timer_offset-300)+');',(i * timer_offset));
}

Man beachte hier auch den timer_offset, der sicherstellt, dass die einzelnen Texte nacheinander angezeigt werden.

Das ist auch schon das Kernstück dieses kleinen Beispiels. Zusätzlich wäre noch das GIF zu erwähnen, welches nach dem Text in das Bild geschoben wird. Dies passiert mit einer ähnlichen Funktion:

function animGfx(gfx,timer,startx,starty,endx,endy)
{
    $('#gAnim').attr('src',gfx);
    $('#gAnim').animate(
    {
        left:       startx,
        top:        starty
    },0);
    $('#gAnim').show();
    $('#gAnim').animate(
    {
        left:       endx,
        top:        endy
    },
    {
        duration: timer,
        complete: function()
        {
            setTimeout('gIntro2();',3000);
        }
    });
}

Diese Funktion wird im Anschluss mit einer Verzögerung von 20 Sekunden gestartet:

setTimeout('animGfx("img/corvette.gif",5000,1100,200,300,300);',20000);

Ein Beispiel wie dieses animiert hoffentlich weitere Entwickler ihre eigenen Ideen umzusetzen. Wer eigene Intros oder Extros erstellt hat hängt hoffentlich einen Kommentar mit Link an dieses Posting.

Viel Spaß beim Basteln.

jQuery: Animierte Figuren wie in einem klassischen Point-and-Click Adventure

Die guten, alten Point-and-Click Adventure in bester Lucasarts oder Sierra Tradition haben noch lange nicht ausgedient. Wer diese auch ganz ohne HTML5 umsetzen möchte, kann dies mit jQuery bzw. JavaScript tun. Ich habe vor Jahren ein Beispiel dafür in reinem JavaScript erstellt und dies irgendwann auf jQuery umgestellt. Wie einfach die Entwicklung ist, soll folgendes Beispiel zeigen.

http://lab.schenk2000.de/adv/index.html

Das HTML-Template

Der HTML-Teil ist erstaunlich einfach. Wir benötigen eine Seite, in der wir jQuery und die nötigen CSS-Dateien unterbringen. Der Body-Bereich hat folgenden Aufbau:

<div id="stage">
<img src="img/stop.gif" id="player" />
</div>
<span id="output"></span>
<span id="output2"></span>

Viel HTML ist nicht nötig, um das Beispiel ans Laufen zu bringen. Ein DIV fungiert als “Bühne“, welches neben der Hintergrundgrafik auch gleichzeitig die Ausmaße unteres Beispiels festlegt. Innerhalb dieses DIVs wird ein IMG-Tag mit einem transparenten (und manchmal animierten) GIF versehen. Dies Image ist unsere Spielfigur. Die beiden unteren SPANs dienen lediglich zur Ausgabe der Mausposition und können bei bedarf auch entfernt werden. Allerdings erleichtern sie bei der Entwicklung die Positionsfindung auf dem DIV.

Die Funktionen
Der Script-Teil unserer Seite hat folgenden Aufbau:

<script type="text/javascript">
var wPlayer             = 69,
    hPlayer             = 110,
    xPlayer             = 600,
    yPlayer             = 500,
    yHorizon            = 200,
    yHorizonClick       = 500,
    PlayerZoomFactor    = 4,
    /* imgagesize */
    wBG                 = 1000,
    hBG                 = 750,
    /* helpervars */
    pX                  = xPlayer,
    pY                  = yPlayer,
    saveX               = xPlayer,
    saveY               = yPlayer,
    xArrived            = false,
    yArrived            = false,
    /* mouseposition */
    mx                  = 600,
    my                  = 500;

function run()
{
    var oldX = saveX,
        oldY = saveY,
        sizeFactorX = (wBG / oldX),
        sizeFactorY = (hBG / oldY),
        wNew = Math.round(wPlayer / sizeFactorX),
        hNew = Math.round(hPlayer / sizeFactorY),
        dir_left = false,
        dir_up = false;

    /* direction and animpic */
    if(oldX < pX)
    {
        dir_left = false;
    }
    else
    {
        dir_left = true;
    }

    if(oldY < pY)
    {
        dir_up = false;
    }
    else
    {
        dir_up = true;
    }

    if(xArrived === false)
    {
        if(oldX < (pX + 10) && oldX > (pX - 10))
        {
            xPlayer = pX;
            xArrived = true;
        }
        else
        {
            if(dir_left === true)
            {
                xPlayer = oldX - 5;
            }
            else
            {
                xPlayer = oldX + 5;
            }
        }
        $('#player').css('left',''+xPlayer+'px');
    }

    if(yArrived === false)
    {
        if(oldY < (pY + 10) && oldY > (pY - 10))
        {
            yPlayer = pY;
            yArrived = true;
        }
        else
        {
            if(dir_up === true)
            {
                yPlayer = oldY - 5;
            }
            else
            {
                yPlayer = oldY + 5;
            }
        }
        $('#player').css('top',''+yPlayer+'px');
    }

    if(yPlayer > 0)
    {
        hNew = Math.round(PlayerZoomFactor * hPlayer /
                        ((hBG-yHorizon) / (yPlayer-yHorizon)));
    }
    else
    {
        hNew = 0;
    }

    $('#player').css('height',''+hNew+'px');
    saveX = xPlayer;
    saveY = yPlayer;

    /* player not arrived */
    if(xArrived === false || yArrived === false)
    {
        window.setTimeout("run()", 100);
    }
    else
    {
        $('#player').attr('src','img/stop.gif');
    }
}

$(document).ready(function()
{
    $('#player').css('left',''+mx+'px');
    $('#player').css('top',''+my+'px');

    $('#stage').click(function()
    {
        if(parseInt(my,10) >= yHorizonClick) /* set movable space */
        {
            $('#player').attr('src','img/anim.gif');
            var sizeFactorX = (wBG /  parseInt(mx,10)),
                sizeFactorY = (hBG / parseInt(my,10)),
                wNew = Math.round(wPlayer / sizeFactorX),
                hNew = Math.round(hPlayer / sizeFactorY);
            pX = parseInt(mx,10) - (PlayerZoomFactor * wNew / 2);
            pY = parseInt(my,10) - (PlayerZoomFactor * hNew / 2);
            xArrived = false;
            yArrived = false;
            run();
        }
    });
});

$(window).load(function()
{
    try
    {
        $("div").mousemove(function(e)
        {
            var pageCoords = "(" + e.pageX + ", " + e.pageY + ")",
                clientCoords = "(" + e.clientX + ", " + e.clientY + ")";
            $("span:first").text("page: " + pageCoords);
            $("span:last").text("client: " + clientCoords);
            mx = e.clientX;
            my = e.clientY;
        });
    }
    catch(e){}
});
</script>

Neben den Variablen, die Position, Größe, … etc. festlegen, gibt es die Hauptfunktion run() und zwei Hilfsfunktionen, die nach Erstellung der Seite bzw. nach dem Laden des Dokuments aufgerufen werden. $(document).ready legt die Startposition der Figur fest und initialisiert das Click-Event für die Maus. $(window).load inisialisiert die Mausbewegung über dem DIV und kann auch entfernt werden (außerdem gibt es elegantere jQuery Methoden – wer mag kann sie einbauen).
Unsere Hauptfunktion run() hat mehrere Aufgaben. Sie muss nach jedem Klick den nächsten Schritt berechnen, sichergehen dass der Click nicht oberhalb der Horizontlinie auftrat und die Größe der Figur neu setzen. Die Berechnung des Schrittes ist der Zentrale Kern, bei geprüft werden muss, ob die Spielfigur auch angekommen ist. Sollte das der Fall sein, wird das animierte GIF wieder auf das statische gesetzt und die Bewegung wird gestoppt.

Viel Spaß beim Ausprobieren.