<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Emanuel Kluge &#187; HTML/CSS</title>
	<atom:link href="http://www.emanuel-kluge.de/category/html-css/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.emanuel-kluge.de</link>
	<description>Zeitgenössisches Web-Design aus Hannover</description>
	<lastBuildDate>Wed, 18 Jan 2012 07:06:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>„Clipboard“ – Digitales Notizbrett mit Node.js und Backbone.js</title>
		<link>http://www.emanuel-kluge.de/html-css/clipboard-digitales-notizbrett-node-js-backbone-js/</link>
		<comments>http://www.emanuel-kluge.de/html-css/clipboard-digitales-notizbrett-node-js-backbone-js/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 07:06:24 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Neuigkeiten]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1530</guid>
		<description><![CDATA[Um etwas Zerstreuung vom Uni-Lernstress zu bekommen, habe ich einen Ausflug in die bunte Node.js-Welt unternommen. Als Mittel zum Zweck diente mir dabei das digitale Notizbrett &#8220;Clipboard&#8221;. Serverseitig kommt das Application-Framework Express zum Einsatz. Gespeichert werden die Daten in einer MongoDB-Datenbank mithilfe von Mongoose. Client-seitig kommt die bewährte Kombo aus Underscore, Backbone und jQuery zum [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://clipboard.nodester.com/"><img src="http://www.emanuel-kluge.de/wp-content/uploads/2012/01/clipboard-node-js.gif" alt="Clipboard &ndash; Digitales Notizbrett mit Node.js und Backbone.js" title="Clipboard &ndash; Digitales Notizbrett mit Node.js und Backbone.js" width="480" height="249" class="aligncenter size-full wp-image-1531" /></a></p>
<p>Um etwas Zerstreuung vom Uni-Lernstress zu bekommen, habe ich einen Ausflug in die bunte <a href="http://nodejs.org/">Node.js</a>-Welt unternommen. Als Mittel zum Zweck diente mir dabei <a href="http://clipboard.nodester.com/">das digitale Notizbrett &ldquo;Clipboard&rdquo;</a>. Serverseitig kommt das <a href="http://expressjs.com/">Application-Framework Express</a> zum Einsatz. Gespeichert werden die Daten in einer MongoDB-Datenbank mithilfe von <a href="http://mongoosejs.com/">Mongoose</a>.</p>
<p>Client-seitig kommt die bewährte Kombo aus <a href="http://documentcloud.github.com/underscore/">Underscore</a>, <a href="http://documentcloud.github.com/backbone/">Backbone</a> und <a href="http://jquery.com/">jQuery</a> zum Einsatz. Für Ordnung sorgt überdies <a href="http://requirejs.org/">Require.js</a>, wobei ich auf folgenden Ansatz zurückgegriffen habe: <a href="https://github.com/thomasdavis/backbonetutorials/tree/gh-pages/examples/modular-backbone">Modular JavaScript &#038; Backbone.js</a>. Außerdem hat <a href="http://jqueryui.com/">jQueryUI</a> einen &ldquo;Gast-Auftritt&rdquo; und sorgt für die Draggability der Notizen.</p>
<p>Das Hosting übernimmt dankenswerterweise <a href="http://nodester.com/">Nodester</a>, die Daten werden bei <a href="https://mongohq.com/">MongoHQ</a> abgelegt. Defenitiv zwei sehr praktische Services.</p>
<p>(<a href="https://github.com/herschel666/clipboard">Clipboard-Code bei GitHub</a>)</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/neuigkeiten/backbone-fundamentals-ein-fundierter-einstieg-in-das-thema-backbone-js/' rel='bookmark' title='„Backbone Fundamentals“ – Ein fundierter Einstieg in das Thema Backbone.js'>„Backbone Fundamentals“ – Ein fundierter Einstieg in das Thema Backbone.js</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/backbone-js-tutorial-die-merkliste/' rel='bookmark' title='Backbone.js-Tutorial: Die Merkliste'>Backbone.js-Tutorial: Die Merkliste</a></li>
<li><a href='http://www.emanuel-kluge.de/html-css/ajax-wordpress-theme-backbone-js/' rel='bookmark' title='Studie &ldquo;Backboned&rdquo;: AJAX-powered WordPress-Theme mit Backbone.js'>Studie &ldquo;Backboned&rdquo;: AJAX-powered WordPress-Theme mit Backbone.js</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/html-css/clipboard-digitales-notizbrett-node-js-backbone-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Rollstuhlsport&#8221; – Android-App für DRS ist fertig</title>
		<link>http://www.emanuel-kluge.de/html-css/rollstuhlsport-android-app-fur-drs-ist-fertig/</link>
		<comments>http://www.emanuel-kluge.de/html-css/rollstuhlsport-android-app-fur-drs-ist-fertig/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 13:40:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Neuigkeiten]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1508</guid>
		<description><![CDATA[Der Deutsche Rollstuhl-Sportverband hat neuerdings eine Android-App, welche ich in meiner Rolle als Frontend-Developer bei w3design. entwickeln durfte. Die App wird zeitnah außerdem auch für das iPhone erscheinen. Was daran jedoch besonders interessant ist &#8211; abgesehen vom Erscheinen der App selbst &#8211;, ist die Tatsache, dass ich sowohl von Java, als auch von Objective-C nicht [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2011/12/rollstuhlsport-android-app.gif" alt="Rollstuhlsport &ndash; Android-App des DRS" title="Rollstuhlsport &ndash; Android-App des DRS" width="480" height="255" class="aligncenter size-full wp-image-1509" /></p>
<p>Der <a href="http://www.drs.org/cms/">Deutsche Rollstuhl-Sportverband</a> hat neuerdings eine <a href="https://market.android.com/details?id=com.phonegap.drsapp">Android-App</a>, welche ich in meiner Rolle als Frontend-Developer bei <a href="http://www.w3design.de/">w3design.</a> entwickeln durfte. Die App wird zeitnah außerdem auch für das iPhone erscheinen.</p>
<p>Was daran jedoch besonders interessant ist &ndash; abgesehen vom Erscheinen der App selbst &ndash;, ist die Tatsache, dass ich sowohl von Java, als auch von Objective-C nicht den blassesten Schimmer habe. Vielmehr habe ich mich beim Entwickeln der App auf meine HTML-, CSS- und JavaScript-Kenntnisse verlassen. Möglich ist das durch <a href="http://phonegap.com/">PhoneGap</a>, ein Framework, das Web-Apps in native Apps umwandelt und dabei ein paar sinnvolle Hardware-APIs zur Verfügung stellt.</p>
<p>Für die App selbst, habe ich auf <a href="http://documentcloud.github.com/backbone/">Backbone.js</a> gesetzt, da es mir gute Möglichkeiten bot, einerseits die Fülle an unterschiedlichen Daten zu verarbeiten, und andererseits ein sehr umfangreichen &ldquo;One-Pager&rdquo; zu bauen, welcher aus einer index.html besteht und alle Unterseiten client-seitig rendert.</p>
<p>Ich kann Phonegap jedenfalls nur empfehlen und möchte noch auf <a href="http://www.lungojs.com/">LungoJS</a> hinweisen, welches bei kleineren Apps sicher gut mit Phonegap Hand in Hand geht.</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/tutorial/bilder-mit-jquery-einblenden-wenn-sie-fertig-geladen-sind/' rel='bookmark' title='Bilder mit jQuery einblenden, wenn sie fertig geladen sind'>Bilder mit jQuery einblenden, wenn sie fertig geladen sind</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/html-css/rollstuhlsport-android-app-fur-drs-ist-fertig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Daten sukzessive, asynchron laden mit dem Pub-Sub-Pattern</title>
		<link>http://www.emanuel-kluge.de/html-css/daten-sukzessive-asynchron-laden-mit-dem-pub-sub-pattern/</link>
		<comments>http://www.emanuel-kluge.de/html-css/daten-sukzessive-asynchron-laden-mit-dem-pub-sub-pattern/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 16:31:33 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1500</guid>
		<description><![CDATA[Derzeit bin ich mit dem Bau einer Web-App beschäftigt, die initial einen Haufen Daten asynchron laden soll. Dafür könnte ich zwar ganz einfach ein paar $.ajax-Funktionen nacheinander aufrufen, doch hat diese Methode ihre Nachteile: Es bestehen Abhängigkeiteen zwischen den zu ladenden Daten, so dass sicher gestellt sein muss, dass die Daten vom Typ A fertig [...]]]></description>
			<content:encoded><![CDATA[<p>Derzeit bin ich mit dem Bau einer Web-App beschäftigt, die initial einen Haufen Daten asynchron laden soll. Dafür könnte ich zwar ganz einfach ein paar $.ajax-Funktionen nacheinander aufrufen, doch hat diese Methode ihre Nachteile:</p>
<ol>
<li>Es bestehen Abhängigkeiteen zwischen den zu ladenden Daten, so dass sicher gestellt sein muss, dass die Daten vom Typ A fertig geladen sind, bevor das Laden der Daten vom Typ B startet <abbr title="beziehungsweise">bzw.</abbr> starten kann.</li>
<li>Der Fortschritt des Ladevorgangs soll visualisiert werden, heißt, ist ein Ladevorgang abgeschlossen und es beginnt der nächste, soll ein Ladebalken vorwärts schreiten.</li>
</ol>
<p>Es wird ersichtlich, dass es nicht damit getan ist, die AJAX-Calls hintereinander aufzurufen. Vielmehr braucht es eine ordnende Instanz, die dafür sorgt, dass die Aufrufe sauber von einander getrennt ablaufen und zwischendurch Callback-Funktionen aufgerufen werden können. Um das zu erreichen, greife ich auf <a href="http://msdn.microsoft.com/en-us/scriptjunkie/hh201955.aspx">das Pub-Sub-Pattern von Addy Osmani</a> zurück und kombiniere es mit einer <em>InitialDataloader</em>-Funktion. Die AJAX-Funktionalitäten hole ich mir von jQuery.</p>
<p>Im folgenden das Pub-Sub-Pattern:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
var mediator = (function () {

	function subscribe(channel, fn) {

		if ( !mediator.channels[channel] ) {
			mediator.channels[channel] = [];
		}

		mediator.channels[channel].push({
			context : this,
			callback : fn
		});

		return this;

	}

	function publish(channel, context) {

		var i = 0,
			len,
			args,
			subscription;

		if ( !mediator.channels[channel] ) {
			return false;
		}

		args = Array.prototype.slice.call(arguments, 2);
		len = mediator.channels[channel].length;

		for ( ; i&lt;len; i += 1 ) {
			subscription = mediator.channels[channel][i];
			subscription.callback.apply((context || subscription.context), args);
		}

		return this;

	}

	return {
		channels : {},
		publish : publish,
		subscribe : subscribe,
		installTo : function (obj) {
			obj.subscribe = subscribe;
			obj.publish = publish;
		}
	}

})();
</code>
</pre>
<p>Auf das Pub-Sub-Pattern möchte ich gar nicht weiter eingehen. Lediglich der Hinweis, dass ich die <em>Publish</em>-Funktion um die Möglichkeit ergänzt habe, einen eigenen Kontext zu übergeben.</p>
<p>Kommen wir als nächstes zur <em>InitialDataloader</em>-Funktion:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
var InitialDataloader = function (args) {
	this.args = args;
	this.result = [];

	this.init();
};

InitialDataloader.prototype.init = function () {

	var i = 0,
		len = this.args.length;

	if ( !len ) {
		return;
	}

	for ( ; i&lt;len; i+=1 ) {
		mediator.subscribe(this.args[i], this.load);
	}

	mediator.publish(this.args[0], this, {path : this.args[0], next : 1});

};

InitialDataloader.prototype.load = function (obj) {

	var that = this,
		deferred = $.ajax({url : obj.path});

	deferred.success(function (resp) {
		that.result.push(&#x27;Data&#x27; + obj.next + &#x27; loaded&#x27;);
	});

	deferred.then( function (resp) {
		if ( obj.next === that.args.length ) {
			console.log(that.result);
		} else {
			mediator.publish(that.args[obj.next], that, {path : that.args[obj.next], next : obj.next+1});
		}
	});

};
</code>
</pre>
<p>in der Konstruktor-Funktion werden die Argumente entgegen genommen und der Prozess via der <em>init</em>-Funktion gestartet. Das args-Argument stellt dabei einen Array dar, der die Pfade zu den Daten enthält.</p>
<p>In der <em>init</em>-Funktion wiederum wird für jeden Pfad des args-Array eine Funktion im Pub-Sub-Pattern angemeldet. Anschließend wird das erste Element des Pub-Sub-Patterns &ldquo;veröffentlicht&rdquo;, sprich die  <em>load</em>-Funktion mit dem ersten Pfad aufgerufen und der Zähler zum nächsten Element des Pfad-Arrays mit übergeben.</p>
<p>Innerhalb der <em>load</em>-Funktion wird ein AJAX-Call auf den übergebenen Pfad gemacht und an ein <em>deferred</em>-Objekt übergeben. Dies wird anschließend genutzt, um eine <em>Callback</em>-Funktion zu starten, wenn der Ladevorgang abgeschlossen ist, und anschließend entweder das nächste Element des Pfad-Array im Pub-Sub-System zu &ldquo;veröffentlichen&rdquo; oder &ndash; wenn alle AJAX-Calls gemacht sind &ndash; eine finale Funktion aufzurufen (<em>console.log(that.result);</em>).</p>
<p>Anschließend noch der Aufruf der Funktion:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
var initialDataLoad = new InitialDataloader([
	&#x27;http://apple.com/&#x27;,
	&#x27;https://twitter.com/&#x27;,
	&#x27;http://www.spiegel.de/&#x27;,
	&#x27;http://www.flickr.com/&#x27;
]);
</code>
</pre>
<p>Die Adressen sind willkürlich gewählt.</p>
<p>Wenn man den Code in ein Skript packt und im Browser laufen lässt, sieht man in der Konsole nacheinander die AJAX-Calls und abschließend die Ausgabe des <em>this.result</em>-Array, der die einzelnen, zu ladenden Elemente mitgezählt hat.</p>
<p>Das war es auch schon. Sollte es Fragen oder Anregungen, nutzt bitte die Kommentar-Funktion. Ich freue mich immer über Feedback!</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/tutorial/animierte-image-caption-mit-jquery-unter-wordpress/' rel='bookmark' title='Animierte Image-Caption mit jQuery unter WordPress'>Animierte Image-Caption mit jQuery unter WordPress</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/backbone-js-tutorial-die-merkliste/' rel='bookmark' title='Backbone.js-Tutorial: Die Merkliste'>Backbone.js-Tutorial: Die Merkliste</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/html-css/daten-sukzessive-asynchron-laden-mit-dem-pub-sub-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Studie &#8220;Backboned&#8221;: AJAX-powered WordPress-Theme mit Backbone.js</title>
		<link>http://www.emanuel-kluge.de/html-css/ajax-wordpress-theme-backbone-js/</link>
		<comments>http://www.emanuel-kluge.de/html-css/ajax-wordpress-theme-backbone-js/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 10:16:32 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Backbone.js]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Theme]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1317</guid>
		<description><![CDATA[Demo &#124; Download Um mir gelegentlich etwas Zerstreuung vom Lernen zu geben, habe ich einen lange gehegten Plan in die Tat umgesetzt: Ein AJAX-betriebenes WordPress-Theme mit Backbone.js zu bauen. Und zwar keine auf &#8220;Graceful Degradation&#8221; setzende Kompromisslösung. Alle Inhalte werden asynchron geladen und sind per Hashbang URIs ansteuerbar. Ein Blick in den Quellcode offenbart, was [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2011/07/backboned-screenshot.gif" alt="&quot;Backboned&quot; &middot; AJAX-powered WordPress-Theme &middot; Screenshot" title="&quot;Backboned&quot; &middot; AJAX-powered WordPress-Theme &middot; Screenshot" width="480" height="207" class="aligncenter size-full wp-image-1333" /></p>
<div class="dedo"><a href="http://emanuel.kodingen.com/wordpress/" title="Demo &mdash; &quot;Backboned&quot;" rel="nofollow">Demo</a> | <a href="http://www.emanuel-kluge.de/wp-content/uploads/2011/07/backboned.zip" title="Download &mdash; &quot;Backboned&quot;" lang="en">Download</a></div>
<p>Um mir gelegentlich etwas Zerstreuung vom Lernen zu geben, habe ich einen lange gehegten Plan in die Tat umgesetzt: Ein <abbr title="Asynchronuos JavaScript And XML">AJAX</abbr>-betriebenes WordPress-Theme mit <a href="http://documentcloud.github.com/backbone/">Backbone.js</a> zu bauen. Und zwar keine auf &ldquo;Graceful Degradation&rdquo; setzende Kompromisslösung. Alle Inhalte werden asynchron geladen und sind per Hashbang <abbr title="Uniform Resource Identifier">URI</abbr>s ansteuerbar. Ein Blick in den Quellcode offenbart, was ich meine: Ein <abbr title="JavaScript Object Notation">JSON</abbr>-Objekt mit allen grundlegenden Daten, eine Handvoll jQuery-Templates und das <abbr title="Hypertext Markup Language">HTML</abbr>-Grundgerüst. Das war es an statischem Content - die Darstellung des Inhalts geschieht über Backbone.js.</p>
<p>Damit Suchmaschinen nicht außen vor bleiben und man sich nicht die Mühe machen muss, einen &ldquo;Headless Browser&rdquo; &agrave; la HtmlUnit auf seinem Server zum laufen bringen zu müssen, werden grundsätzlich alle Inhalte als GET-Anfrage mit dem Parameter &ldquo;_escaped_fragment_&rdquo; abgehandelt - die Ausgabe variiert dann je nachdem zwischen statischem <abbr title="Hypertext Markup Language">HTML</abbr> oder einem nackten <abbr title="JavaScript Object Notation">JSON</abbr>-Objekt. So ist sichergestellt, dass die Inhalte trotzdem indiziert werden können. Die einzigen, die in die Röhre schauen, sind Besucher ohne JavaScript.</p>
<p>Um diesen Workaround zu realisieren, war jedoch ein hohes Maß an Improvisation vonnöten. Mit WordPress-Bordmitteln habe ich es nicht geschafft, das Frontend-seitige <abbr title="Uniform Resource Locator">URL</abbr>-Routing von Backbone.js server-seitig abzubilden und entsprechend zu bearbeiten. Ich habe deshalb auf ein simples <abbr title="Model View Controller">MVC</abbr>-Pattern zurück gegriffen und in das eigentliche Theme eine Art Child-Theme integriert. Das ist insgesamt kein Ansatz der mir - besonders in meiner Umsetzung - gefällt. Des weiteren muss man für einen störungsfreien Betrieb des Themes das <abbr title="Uniform Resource Locator">URL</abbr>-Rewriting in den WordPress-Einstellungen deaktivieren.</p>
<p>Darüber hinaus bleibt anzumerken, dass das Theme insgesamt eher rudimentär ist. Ich würde von einem Produktiveinsatz abraten. Allerdings bin ich grundsätzlich von der Idee des Themes überzeugt und freue mich natürlich, wenn jemand sich ebenfalls dafür begeistern kann und daran weiterarbeitet. Gerne auch in Kollaboration mit mir. Zu tun gibt es unter anderem noch:</p>
<ol>
<li>die grundsätzliche Verbesserung des PHP-Codes (sicherer machen, besser in das WordPress-Environment integrieren,&hellip;)</li>
<li>den Funktionsumfang erhöhen (Neueste Kommentare, Tags, Suchfunktion, Sidebar-Widgets(?),&hellip;)</li>
<li>das JavaScript straffen (Performance, geschmeidigere <abbr title="Graphical User Interface">GUI</abbr>-Abläufe,&hellip;)</li>
</ol>
<p>&hellip;um ein paar Aspekte zu nennen.</p>
<p>Ansonsten freue ich mich wie immer über Anregungen und Verbesserungsvorschläge - gerade bei einem Vorhaben dieser Größenordnung hat man als Entwickler nicht wirklich einen umfassenden Überblick.</p>
<p><del datetime="2011-07-15T09:15:57+00:00">PS: Wahrscheinlich werde ich das Teil zeitnah bei GitHub reinladen. Muss mich da aber erst noch anschlauen.</del></p>
<p><ins datetime="2011-07-15T09:15:57+00:00"><strong>Update:</strong> Okay, die Geschichte ist jetzt auch auf GitHub - <a href="https://github.com/herschel666/Backboned" title="&ldquo;Backboned&rdquo; auf GitHub">https://github.com/herschel666/Backboned</a>. Viel Spaß.</ins></p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/wordpress/free-wordpress-theme-blue-and-grey/' rel='bookmark' title='Free WordPress-Theme: &#8220;Blue and Grey&#8221;'>Free WordPress-Theme: &#8220;Blue and Grey&#8221;</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/backbone-js-tutorial-die-merkliste/' rel='bookmark' title='Backbone.js-Tutorial: Die Merkliste'>Backbone.js-Tutorial: Die Merkliste</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/semi-transparente-navigation-in-wordpress-mit-css/' rel='bookmark' title='Semi-transparente Navigation in WordPress mit CSS'>Semi-transparente Navigation in WordPress mit CSS</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/html-css/ajax-wordpress-theme-backbone-js/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Backbone.js-Tutorial: Die Merkliste</title>
		<link>http://www.emanuel-kluge.de/tutorial/backbone-js-tutorial-die-merkliste/</link>
		<comments>http://www.emanuel-kluge.de/tutorial/backbone-js-tutorial-die-merkliste/#comments</comments>
		<pubDate>Mon, 30 May 2011 15:45:42 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Backbone.js]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Local Storage]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1288</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2011/05/backbone.png" alt=""Backbone.js-Tutorial" title="Backbone.js-Tutorial" width="385" height="126" class="aligncenter size-full wp-image-1289" /></p>
<div class="dedo"><a href="http://www.emanuel-kluge.de/demo/backbone-js-merkliste/" title="Demo &mdash; Backbone.js-Tutorial: Die Merkliste" rel="nofollow">Demo</a> | <a href="http://www.emanuel-kluge.de/wp-content/uploads/2011/05/backbone-js-merkliste.zip" title="Download &mdash; Backbone.js-Tutorial: Die Merkliste" lang="en">Download</a></div>
<p><a href="http://documentcloud.github.com/backbone/">Backbone.js</a> ist ein interessantes JavaScript-<abbr title="Model - View - Controller">MVC</abbr>, mit welchem ich mich seit etwa zwei Wochen beschäftige. Und nun möchte ich ein kleines Tutorial dazu präsentieren - wir bauen uns ein Merkliste. Das Konzept sieht wie folgt aus: Ständig laufen einem tolle Filme, Bücher und Spiele über den Weg, die man unbedingt noch sehen/lesen/spielen möchte, aber man merkt sie sich nie. Das ist der Punkt, wo die Merkliste ins Spiel kommt.</p>
<p>Bei der Programmierung habe ich mich stark an der <a href="http://documentcloud.github.com/backbone/examples/todos/index.html">Todo List Application</a> orientiert, allerdings ist die Merkliste vom Funktionsumfang her schmaler, beinhaltet dafür aber einen Controller für das <abbr title="Uniform Resource Locator">URL</abbr>-Routing.</p>
<p>Aber nun zur Sache:</p>
<p>Als erstes benötigen wir den <abbr title="Hypertext Markup Language">HTML</abbr>-Teil.</p>
<pre class="prettyprint">
<dfn>HTML</dfn>
<code class="block">
&lt;!doctype html&gt;
&lt;html lang=&quot;de&quot;&gt;
&lt;head&gt;
	&lt;meta charset=&quot;utf-8&quot;&gt;
	&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot;&gt;

	&lt;title&gt;Backbone.js-Tutorial - Merkliste&lt;/title&gt;
	&lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; /&gt;

&lt;/head&gt;

&lt;body&gt;

	&lt;ul id=&quot;nav&quot;&gt;&lt;/ul&gt;
	&lt;input type=&quot;text&quot; placeholder=&quot;Gib einen Titel ein&amp;hellip;&quot; id=&quot;list_input&quot; /&gt;
	&lt;ul id=&quot;list&quot;&gt;&lt;/ul&gt;

	&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.6/underscore-min.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;js/backbone-localstorage.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;js/list.min.js&quot;&gt;&lt;/script&gt;

	&lt;script type=&quot;text/template&quot; id=&quot;list-item-template&quot;&gt;
		&lt;strong&gt;&lt;%= title %&gt;&lt;/strong&gt;
		&lt;span class=&quot;delete_item&quot;&gt;x&lt;/span&gt;
	&lt;/script&gt;

	&lt;script type=&quot;text/template&quot; id=&quot;nav-template&quot;&gt;
		&lt;a href=&quot;#/category/&lt;%= title %&gt;&quot;&gt;&lt;%= title %&gt;&lt;/a&gt;
	&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
</code>
</pre>
<p>Für die Merklisten-App benötigen wir <a href="http://jquery.com/">jQuery</a>, <a href="http://documentcloud.github.com/underscore/">Underscore.js</a>, <a href="http://documentcloud.github.com/backbone/">Backbone.js</a> und die Backbone-Erweiterung <a href="http://documentcloud.github.com/backbone/docs/backbone-localstorage.html">Local-Storage</a>, damit die Einträge im Browser gespeichert werden können. Des weiteren werden die Container für die Navigation und die Listeneinträge, sowie das Eingabefeld angelegt. Schlussendlich brauchen wir noch zwei Templates - eins für die Navigation, eins für die Liste.</p>
<p>Kommen wir nun zum JavaScript-Teil. Als erstes benötigen wir hier unser Model:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
window.List = Backbone.Model.extend();
</code>
</pre>
<p>Als nächstes erstellen wir zwei Collections, eine für die Navigation, eine für die Listeneinträge:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
window.NavCollection = Backbone.Collection.extend({
	model : List
});

window.ListCollection = Backbone.Collection.extend({				

	model : List,				

	localStorage : new Store('List'),

	getByCategory : function ( category )
	{
		return this.filter( function (item)
		{
			return item.get('category') == category;
		});
	}
});
</code>
</pre>
<p>In der Collection für die Listen-Einträge wird der <em>Local Storage</em> angemeldet und eine Funktion eingefügt, die es ermöglicht, die Einträge der Collection nach ihrer Kategorie zu filtern.</p>
<p>Kommen wir nun zum Controller der App:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
window.ListController = Backbone.Controller.extend({

	_navModel : new NavCollection([
		{title : 'Filme'},
		{title : 'Buecher'},
		{title : 'Spiele'}
	]),
	_navViews : [],
	_categoryModel : new ListCollection,
	_inputView : null,

	routes : {
		'' : 'init',
		'/category/:category' : 'getItems',
	},

	initialize : function ()
	{
		this._navModel.each( function ( item, i )
		{
			this._navViews[i] = new NavigationView({
				model : item
			});
		}, this);

		Backbone.history.start();
	},

	init : function ()
	{
		window.location.hash = '/category/Filme';
	},

	getItems : function ( category )
	{
		for ( view in this._navViews )
		{
			this._navViews[view]
				.render()
				.setClass();
		};

		if ( this._inputView == null )
		{
			this._inputView = new ListInputView({
				model : this._categoryModel,
				category : category
			});
		}
		else
		{
			this._inputView.options.category = category;
			this._inputView.model.trigger('refresh');
		}
	}

});
</code>
</pre>
<p>Als erstes werden - jeweils für die Navigation und die Liste - neue Instanzen der zugehörigen Collection erstellt und Platzhalter für die jeweiligen Views angemeldet. Danach werden die relevanten Pfade mit Funktionen verknüpft. In diesem Fall wird die Funktion <code class="inline">init()</code> ausgeführt, wenn kein <em>Hash</em> vorhanden ist, und die Funktion <code class="inline">getItems()</code>, wenn ein Kategorie-<em>Hash</em> vorhanden ist.</p>
<p>Als nächstes folgt die <code class="inline">initialize</code>-Funktion, welche als erstes beim Aufrufen des Controllers ausgeführt wird. Dabei wird das Navigation-Model mit den nötigen Einträgen versehen, danach für jeden Eintrag der Navigation-Collection eine View-Instanz erstellt und im _navView-Array gespeichert, sowie die <code class="inline">Backbone.history</code>-Funktion gestartet.</p>
<p>Als nächstes wird die <code class="inline">init</code>-Funktion definiert. Diese sorgt einfach nur dafür, dass die Kategorie "Filme" gewählt wird, indem der entsprechende Kategorie-<em>Hash</em> gesetzt wird. Die Kategorie ist hierbei willkürlich von mir gewählt.</p>
<p>Danach folgt die Definition der <code class="inline">getItems</code>-Funktion. In dieser werden als erstes die Views für die Navigationspunkte ge-rendert. Daraufhin folgt entweder die Initialisierung des Views für die Listeneinträge, oder - falls dies schon geschehen ist - das Überschreiben der aktuellen, dem View übergebenen Kategorie und das Neu-Aufbauen der Liste mit den entsprechenden Einträgen. Dabei kommt die Filter-Funktion der Listen-Collection zum Einsatz.</p>
<p>Nachdem nun Model, Collection und Controller vorhanden sind, geht es an die Views. Davon benötigen wir drei - einen für das Eingabefeld, einen für die Liste und einen für die Navigation. Fangen wir mit dem Eingabefeld an:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
window.ListInputView = Backbone.View.extend({

	el : $('#list_input'),

	list : $('#list'),

	events : {
		'keypress' : 'createListItem'
	},

	initialize : function ()
	{
		_.bindAll(this, 'addListItem', 'addAllListItems');

		this.model.bind('add', this.addListItem);
		this.model.bind('refresh', this.addAllListItems);

		this.model.fetch();
	},

	createListItem : function (e)
	{
		if ( e.keyCode == 13 )
		{
			this.model.create({
				category : this.options.category,
				title : this.el.val()
			});

			this.el.val('');
			this.el.blur();
		}
	},

	addListItem : function ( item )
	{
		var view = new ListItemView({model : item});

		!view.model.length &#038;& this.list.append( view.render().el );
	},

	addAllListItems : function ()
	{
		this.list.empty();

		_.each(this.model.getByCategory(this.options.category), function(item)
		{
			this.addListItem(item);
		}, this);
	}

});
</code>
</pre>
<p>Der ListInputView nimmt die Eingabe entgegen, erstellt eine neue Instanz des Listen-Eintrag-View und fügt füllt die Liste mit Einträgen. Die Funktion <code class="inline">createListItem()</code> erstellt einen neuen Eintrag in der Collection, wenn das Eingabefeld abgefeuert wurde. Über die Angabe <code class="inline">this.model.bind('add', this.addListItem);</code> in der <code class="inline">initialize</code>-Funktion wird gesorgt, dass daraufhin die Funktion <code class="inline">addListItem()</code> aufgerufen wird, die für den neuen Eintrag in der Collection eine Instant des Listen-Eintrag-View erstellt und diesem den Befehl <code class="inline">render()</code> mit auf den Weg gibt. Über die Funktion <code class="inline">addAllListItems()</code> wird einerseits sichergestellt, dass die Liste geleert wird, bevor neue Einträge nach einem Kategorie-Wechsel reingladen werden, und andererseits, bei Übergabe einer Collection mit mehreren einträgen, für jeden Eintrag die Funktion <code class="inline">addListItem()</code> ausgeführt wird.</p>
<p>Als nächstes kommen wir zum Listen-Eintrag-View:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
window.ListItemView = Backbone.View.extend({

	tagName : 'li',

	className : 'list_item',

	tmpl : _.template( $('#list-item-template').html() ),

	events : {
		'click .delete_item' : 'removeItem'
	},

	render : function ()
	{
		$(this.el).html( this.tmpl( this.model.toJSON() ));

		return this;
	},

	removeItem : function ()
	{
		this.model.destroy();
		$(this.el).fadeOut( function()
		{
			$(this).remove();
		});
	}

});
</code>
</pre>
<p>Hier wird das Element vom Standard (<code class="inline">div</code>) auf <code class="inline">li</code> gesetzt, die gewünschte <abbr title="Cascading Stylesheets">CSS</abbr>-Klasse gesetzt, das Template für den Eintrag angemeldet, ein Klick-Event mit der Funktion <code class="inline">removeItem()</code> verknüpft und anschließend die Funktionen <code class="inline">render()</code> und <code class="inline">removeItem()</code> definiert. Erstere fügt die Daten des Collection-Eintrags in das Template ein, letztere löscht den View und den dazugehörigen Collection-Eintrag.</p>
<p>Schlussendlich benötigen wir noch einen View für die Navigation:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
window.NavigationView = Backbone.View.extend({

	tagName : 'li',

	tmpl : _.template( $('#nav-template').html() ),

	hash : function ()
	{
		return window.location.hash.replace('#/category/', '');
	},

	render : function ()
	{
		$('#nav').append($(this.el).html( this.tmpl( this.model.toJSON() ) ));

		return this;
	},

	setClass : function ()
	{
		var curHash = this.hash();

		this.el.className = ( curHash == $(this.el).find('a').text() ) ? 'current' : '';
	}

});
</code>
</pre>
<p>Neu und interessant ist hier die Funktion <code class="inline">setClass()</code>. Diese sorgt nach dem Rendern der Navigation, dass der aktuelle Reiter die Klasse "current" bekommt.</p>
<p>Um die Listen-App nun zum Laufen zu bringen, erstellen wir eine neue Instanz des Controllers:</p>
<pre class="prettyprint">
<dfn>JavaScript</dfn>
<code class="block">
var listApp = new ListController();
</code>
</pre>
<p>Der ganze Spaß wird in eine anonyme jQuery-Funktion geschrieben, damit die App gestartet wird, sobald das <abbr title="Document Object Model">DOM</abbr> geladen ist.</p>
<p>Das war es auch schon. Ich hoffe, meine Erklärungen sind einigermaßen nachvollziehbar. Falls nicht, nutzt auf jeden Fall die Kommentar-Funktion. Des weiteren würde ich mich natürlich über Anregungen und Verbesserungsvorschläge freuen, da ich ja doch ein Neuling in Sachen Backbone.js bin. Ansonsten noch der Hinweis, dass bei Gefallen natürlich gerne regen Gebrauch von den unten stehenden Social-Media-Buttons gemacht werden kann.</p>
<p>Vielen Dank!</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/html-css/ajax-wordpress-theme-backbone-js/' rel='bookmark' title='Studie &ldquo;Backboned&rdquo;: AJAX-powered WordPress-Theme mit Backbone.js'>Studie &ldquo;Backboned&rdquo;: AJAX-powered WordPress-Theme mit Backbone.js</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/animierte-image-caption-mit-jquery-unter-wordpress/' rel='bookmark' title='Animierte Image-Caption mit jQuery unter WordPress'>Animierte Image-Caption mit jQuery unter WordPress</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/social-icon-bar-mit-jquery/' rel='bookmark' title='&quot;Social Icon Bar&quot; mit jQuery'>&quot;Social Icon Bar&quot; mit jQuery</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/tutorial/backbone-js-tutorial-die-merkliste/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>8Bit-Style-Navigation mit Fly-Out-Menus</title>
		<link>http://www.emanuel-kluge.de/tutorial/8bit-style-navigation-mit-fly-out-menus/</link>
		<comments>http://www.emanuel-kluge.de/tutorial/8bit-style-navigation-mit-fly-out-menus/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 09:30:28 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[8Bit]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Data URI]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1154</guid>
		<description><![CDATA[Heute möchte ich kurz zeigen, wie man mit etwas HTML, CSS und ein paar kleinen GIF-Grafiken eine pixelige Seiten-Navigation im 8Bit-Stil baut. Außerdem benutzen wir etwas jQuery-Magic, um der Navigation noch Fly-Out-Menus zu spendieren. Demo &#124; Download Beginnen wir wie gewohnt mit dem HTML-Teil: HTML &#60;div id=&#34;nav&#34;&#62; &#60;ul&#62; &#60;li class=&#34;top&#34;&#62; &#60;a href=&#34;index.html&#34;&#62; &#60;strong&#62;Home&#60;/strong&#62; &#60;/a&#62; &#60;div [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich kurz zeigen, wie man mit etwas <strong><abbr title="Hypertext Markup Language" lang="en">HTML</abbr></strong>, <strong><abbr title="Cascading Stylesheets" lang="en">CSS</abbr></strong> und ein paar kleinen <abbr title="Graphics Interchange Format" lang="en">GIF</abbr>-Grafiken eine pixelige Seiten-Navigation im 8Bit-Stil baut. Außerdem benutzen wir etwas <strong lang="en">jQuery</strong>-<span lang="en">Magic</span>, um der Navigation noch <span lang="en">Fly-Out-Menus</span> zu spendieren.</p>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/07/8bit-style-navigation-mit-fly-out-menus.gif" alt="8Bit-Style-Navigation mit Fly-Out-Menus" title="8Bit-Style-Navigation mit Fly-Out-Menus" width="480" height="120" class="aligncenter size-full wp-image-1155" /></p>
<div class="dedo"><a href="http://www.emanuel-kluge.de/demo/8bit-style-navigation-mit-fly-out-menus/" title="Demo &mdash; 8Bit-Style-Navigation mit Fly-Out-Menus" rel="nofollow">Demo</a> | <a href="http://www.emanuel-kluge.de/wp-content/uploads/2010/07/8bit-style-navigation-mit-fly-out-menus.zip" title="Download &mdash; 8Bit-Style-Navigation mit Fly-Out-Menus" lang="en">Download</a></div>
<p>Beginnen wir wie gewohnt mit dem <abbr title="Hypertext Markup Language" lang="en">HTML</abbr>-Teil:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr></dfn>
<code class="block">&lt;div id=&quot;nav&quot;&gt;
  &lt;ul&gt;
    &lt;li class=&quot;top&quot;&gt;
      &lt;a href=&quot;index.html&quot;&gt;
        &lt;strong&gt;Home&lt;/strong&gt;
      &lt;/a&gt;
      &lt;div class=&quot;sub&quot;&gt;
        &lt;div&gt;
          &lt;ul&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Sub-Item 1&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Sub-Item 2&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Sub-Item 3&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Sub-Item 4&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Sub-Item 5&lt;/a&gt;
            &lt;/li&gt;
          &lt;/ul&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
    &lt;li class=&quot;top&quot;&gt;
      &lt;a href=&quot;#&quot;&gt;
        &lt;strong&gt;About&lt;/strong&gt;
      &lt;/a&gt;
      &lt;div class=&quot;sub&quot;&gt;
        &lt;div&gt;
          &lt;ul&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;One Sub-Item&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Another Sub-Item&lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
              &lt;a href=&quot;#&quot;&gt;Still a Sub-Item&lt;/a&gt;
            &lt;/li&gt;
          &lt;/ul&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href=&quot;#&quot;&gt;
        &lt;strong&gt;Contact&lt;/strong&gt;
      &lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
</code>
</pre>
<p>Wie gewohnt eine ungeordnete Liste für die Haupt-Navigation und jeweils eine für die Sub-Navigationen. Um die charakteristischen Ecken hinzubekommen, müssen zwei Elemente ineinander verschachtelt und gegeneinander verschoben werden. Das macht den Quelltext <span lang="en">Tag</span>-intensiver. In meinen Augen jedoch noch in einem vertretbaren Rahmen und weit entfernt von klassischer "Diveritis".</p>
<p>Als nächstes kommen wir zum <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>:</p>
<pre>
<dfn><abbr title="Cascading Stylesheets" lang="en">CSS</abbr></dfn>
<code class="block">@font-face {
  font-family: 'SilkscreenNormal';
  src: url('slkscr-webfont.eot');
  src: local('☺'), url('slkscr-webfont.woff') format('woff'), url('slkscr-webfont.ttf') format('truetype'), url('slkscr-webfont.svg#webfontUx1SMfhe') format('svg');
  font-weight: normal;
  font-style: normal;
}

ul {
  list-style: none;
}

body {
  background-color: #FFF;
  color: #333;
  font: normal 13px SilkscreenNormal, sans-serif;
}

#nav,
#nav > ul,
#nav > ul > li {
  float: left;
  display: inline;
}

#nav,
#nav > ul {
  width: auto;
  _width: 1%; /* IE6 Hack */
  height: 32px;
}

#nav {
  margin: 50px;
  position: relative;
  border-width: 2px 0;
  border-style: solid;
  border-color: #666;
}

#nav > ul {
  position: relative;
  left: -2px;
  margin-right: -4px;
  padding: 0 10px;
  border-width: 0 2px;
  border-style: solid;
  border-color: #666;
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///73n/yH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile1.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}

#nav > ul > li {
  _width: 1%; /* IE6 Hack */
  margin: 3px 5px;
  position: relative;
}

#nav > ul > li > a {
  display: block;
  position: relative;
  width: auto;
  height: 22px;
  border-width: 2px 0;
  border-style: solid;
  border-color: #999;
  background-color: #FFF;
}

#nav > ul > li > a:link,
#nav > ul > li > a:visited {
  color: #999;
  text-decoration: none;
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP/////fvSH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile2.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}

#nav > ul > li > a:hover,
#nav > ul > li > a:focus,
#nav > ul > li > a:active {
  color: #666;
  background-image: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP/////MmSH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=');
  *background-image: url('img/tile3.gif'); /* IE6 and IE7 can't handle data uris */
				}

#nav > ul > li > a strong {
  display: block;
  position: relative;
  width: auto;
  height: 22px;
  padding: 0 10px;
  line-height: 22px;
  left: -2px;
  margin-right: -4px;
  border-width: 0 2px;
  border-style: solid;
  border-color: #999;
}

#nav > ul > li.top > a > strong {
  padding-left: 21px;
  background: url('data:image/gif;base64,R0lGODlhBgAEAIABAJmZmf///yH5BAEAAAEALAAAAAAGAAQAAAIHhI8WocuwCgA7') 5px center no-repeat;
  *background: url('img/arrow.gif') 5px center no-repeat; /* IE6 and IE7 can't handle data uris */
}

#nav > ul > li > a:hover,
#nav > ul > li > a:hover strong,
#nav > ul > li > a:focus,
#nav > ul > li > a:focus strong {
  border-color: #666;
}

#nav > ul > li.top > a:hover strong,
#nav > ul > li.top > a:focus strong {
  background-image: url('data:image/gif;base64,R0lGODlhBgAEAIABAGZmZv///yH5BAEAAAEALAAAAAAGAAQAAAIHhI8WocuwCgA7');
  *background-image: url('img/arrow_hv.gif'); /* IE6 and IE7 can't handle data uris */
}

#nav > ul > li > a:active {
  top: 1px;
}

.sub {
  position: absolute;
  width: auto;
  top: 24px;
  left: 0;
  padding-top: 9px;
  display: none;
}

.sub div {
  position: relative;
  border-top: 2px solid #666;
  border-bottom: 2px solid #666;
}

.sub div ul {
  position: relative;
  left: -2px;
  margin-right: -4px;
  border-left: 2px solid #666;
  border-right: 2px solid #666;
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///+7u7iH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile4.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}

.sub div ul li {
 border-top: 2px solid #666;
}

.sub div ul li:first-child {
  border-top: none;
}

.sub div ul li a {
  display: block;
  padding: 0 10px;
  line-height: 22px;
  font-size: 12px;
  white-space: nowrap;
}

.sub div ul li a:link,
.sub div ul li a:visited {
  color: #666;
}

.sub div ul li a:hover,´
.sub div ul li a:focus {
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///93d3SH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile5.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}

.sub div ul li a:active {
  background: url('data:image/gif;base64,R0lGODlhBAAEAIAAAP///8zMzCH5BAAAAAAALAAAAAAEAAQAAAIGTACGqBkFADs=') 0 0 repeat;
  *background: url('img/tile6.gif') 0 0 repeat; /* IE6 and IE7 can't handle data uris */
}
</code>
</pre>
<p>Als erstes binde ich den Pixel-Font "<span lang="en">SilkScreen</span> von <a href="http://www.kottke.org/plus/type/silkscreen/index.html" title="Silkscreen is a small free font for your Web graphics" hreflang="en" lang="en">Jason Kottke</a> ein. Danach folgen die Angaben für die Navigation.</p>
<p>Interessant ist dabei, dass selbst das äußere Element <code class="inline">&lt;div id="nav"&gt;</code> die Angabe <code class="inline" lang="en">float: left</code> hat, damit es sich der Breite des Inhalts anpasst. Das kann zu <span lang="en">Layout</span>-Problemen führen, weshalb man im praktischen Einsatz darauf achten muss, das Element direkt unterhalb der Navigation mit einem <code class="inline" lang="en">clear: left</code> zu versehen.</p>
<p>Des weiteren kann man sehen, wie die charakteristischen Ecken zustande kommen: Das äußere Element hat jeweils unten und oben eine zwei-Pixel-starke <code class="inline" lang="en">border</code> und das innere jeweils links und rechts. Das innere Element wird dann per <code class="inline" lang="en">left: -2px</code> und <code class="inline" lang="en">margin-righ: -4px</code> um jeweils zwei Pixel nach links und rechts aus dem umgebenden Element hinaus gezogen. Schon ist der gewünschte Effekt da.</p>
<p>Ebenfalls erwähnenswert sind die Grafiken. Da diese nur 4x4 Pixel <abbr title="beziehungsweise">bzw.</abbr> 4x6 Pixel groß sind, lohnt es sich, sie in Form von Data <abbr title="Uniform Resource Identifier" lang="en">URI</abbr>s einzubinden und so unnötige <span lang="en"><abbr title="Hypertext Transfer Protocol">HTTP</abbr> Requests</span> zu sparen. Blöderweise können <abbr title="Internet Explorer" lang="en">IE</abbr>6 und <abbr title="Internet Explorer" lang="en">IE</abbr>7 damit nicht umgehen, weshalb die richtigen Grafiken ebenfalls eingebunden werden müssen. Diese werden dann mithilfe des <strong lang="en">Star-Hack</strong> den beiden <span lang="en">Browser</span>n zugewiesen.</p>
<p><a href="http://websemantics.co.uk/online_tools/image_to_data_uri_convertor/" title="Image To Data URI Convertor - webSemantics" hreflang="en">Bilder in  Data <abbr title="Uniform Resource Identifier" lang="en">URI</abbr>s umwandeln könnt ihr übrigens mit diesem <span lang="en">Online-Tool</span></a>.</p>
<p>Zum Schluss noch etwas <span lang="en">jQuery</span> um die <span lang="en">Fly-Out-Menu</span>-Funktionalität zu realisieren:</p>
<pre>
<dfn lang="en">JavaScript</dfn>
<code class="block">$(document).ready( function() {
  $(&#x27;#nav li.top&#x27;).hover( function() {
    $(this).find(&#x27;div&#x27;).stop(true, true).fadeIn(&#x27;slow&#x27;);
  }, function() {
    $(this).find(&#x27;div&#x27;).stop(true, true).fadeOut(&#x27;slow&#x27;);
  });
});
</code>
</pre>
<p>Ich denke, das ist die spartanischste Lösung und bedarf keiner weiteren Erläuterung.</p>
<p>Das war es auch schon. Die Navigation ist beliebig per <span lang="en">Copy&amp;Paste</span> erweiterbar, denkt nur daran, den <code class="inline" lang="en">li</code>-Elementen, die eine Sub-Navigation beinhalten, die Klasse <code class="inline" lang="en">top</code> zu verpassen, damit die <span lang="en">Fly-Out-Menu</span>-Funktionalität gewährleistet ist.</p>
<p>Ansonsten wünsche ich viel Spaß mit der Navigation. Bei Fragen bitte wie immer die Kommentar-Funktion nutzen. Und bei Gefallen fleißig via <span lang="en">Twitter</span> und <span lang="en">Facebook</span> verbreiten. Vielen Dank <img src='http://www.emanuel-kluge.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/tutorial/navigation-im-googlemail-style-mit-jquery/' rel='bookmark' title='Navigation im Googlemail-Style mit jQuery'>Navigation im Googlemail-Style mit jQuery</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/hover-und-spotlight-effekt-in-bildergalerie-mit-jquery/' rel='bookmark' title='Hover- und Spotlight-Effekt in Bildergalerie mit jQuery'>Hover- und Spotlight-Effekt in Bildergalerie mit jQuery</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/semi-transparente-navigation-in-wordpress-mit-css/' rel='bookmark' title='Semi-transparente Navigation in WordPress mit CSS'>Semi-transparente Navigation in WordPress mit CSS</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/tutorial/8bit-style-navigation-mit-fly-out-menus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook-Like-Button per XFBML in WordPress-Blogs einfügen</title>
		<link>http://www.emanuel-kluge.de/html-css/facebook-like-button-per-xfbml-in-wordpress-blogs-einfugen/</link>
		<comments>http://www.emanuel-kluge.de/html-css/facebook-like-button-per-xfbml-in-wordpress-blogs-einfugen/#comments</comments>
		<pubDate>Fri, 07 May 2010 10:17:21 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Button]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[Like]]></category>
		<category><![CDATA[PlugIn]]></category>
		<category><![CDATA[XFBML]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1103</guid>
		<description><![CDATA[Der Like-Button von Facebook zum Einbinden auf externen Websites ist ja nach wie vor in aller Munde und da ich gerade auf einem anderen WordPress-Blog einen solchen Button per XFBML eingebunden habe, möchte ich hier kurz vorstellen, wie das geht. Als erstes braucht ihr eure User-ID und eine Application-ID für die Seite, auf der ihr [...]]]></description>
			<content:encoded><![CDATA[<p>Der <strong lang="en">Like-Button</strong> von <strong lang="en">Facebook</strong> zum Einbinden auf externen <span lang="en">Websites</span> ist ja nach wie vor in aller Munde und da ich gerade auf einem anderen <span lang="en">WordPress-Blog</span> einen solchen <span lang="en">Button</span> per <abbr title="Extensible  Facebook Markup Language" lang="en">XFBML</abbr> eingebunden habe, möchte ich hier kurz vorstellen, wie das geht.</p>
<p>Als erstes braucht ihr eure <span lang="en">User-ID</span> und eine <span lang="en">Application-ID</span> für die Seite, auf der ihr den <span lang="en">Like-Button</span> einbauen möchtet. Die <span lang="en">User-ID</span> bekommt ihr, indem ihr folgendes in die Adress-Zeile eures <span lang="en">Browsers</span> eingebt:</p>
<p>graph.facebook.com/euer.name</p>
<p>Vereinfacht gesagt: Geht auf euer <span lang="en">Facebook</span>-Profil und ersetzt das <abbr title="world wide web" lang="en">www</abbr> in der Adresse durch "graph". Auf der dann erscheinenden Seite, findet ihr eure <span lang="en">User-ID</span>.</p>
<p>Die <span lang="en">Application-ID</span> wiederum könnt ihr generieren, indem ihr auf folgender Seite euren <span lang="en">Blog</span> eintragt:</p>
<p><a href="http://developers.facebook.com/setup/" title="Facebook - Create an Application" hreflang="en">http://developers.facebook.com/setup/</a></p>
<p>Nun sind die Grundvoraussetzungen erfüllt, der <span lang="en">Like-Button</span> kann eingebunden werden. Im folgenden Beispiel zeige ich, wie man das in der Einzelansicht eines Artikels macht. Dafür müssen wir im Kopf- und Fußbereich, sowie unterhalb des Artikels etwas <span lang="en">Code</span> eingeben.</p>
<p>Fangen wir mit dem Kopfbereich an:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr>/PHP</dfn>
<code class="block">&lt;?php if ( is_single() ) : ?&gt;
  &lt;meta property=&quot;fb:admins&quot; content=&quot;eure_user_id&quot; /&gt;
  &lt;meta property=&quot;fb:app_id&quot; content=&quot;eure_app_id&quot; /&gt;
  &lt;meta property=&quot;og:site_name&quot; content=&quot;&lt;?php bloginfo(&#x27;name&#x27;); ?&gt;&quot; /&gt;
  &lt;meta property=&quot;og:title&quot; content=&quot;&lt;?php echo get_the_title(); ?&gt;&quot; /&gt;
  &lt;meta property=&quot;og:type&quot; content=&quot;article&quot; /&gt;
&lt;? endif; ?&gt;
</code>
</pre>
<p>Diese fünf speziellen <span lang="en">Facebook</span>-Meta-Angaben müssen in der <span lang="en">header.php</span> innerhalb der <code class="inline" lang="en">head</code>-<span lang="en">Tags</span> gesetzt werden. Sie verraten <span lang="en">Facebook</span> wem der <span lang="en">Blog</span> gehört, um welchen <span lang="en">Blog</span> es sich handelt, wie er heißt, welchen Titel die aktuelle Seite hat und um welchen Inhaltstyp es sich handelt. Natürlich müsst ihr <em>eure_user_id</em> und <em>eure_app_id</em> durch die entsprechende ID ersetzen.</p>
<p>Als nächstes binden wir den nötigen <span lang="en">JavaScript</span>-Kram im Fußbereich ein:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr>/<span lang="en">JavaScript</span></dfn>
<code class="block">&lt;?php if ( is_single() ) : ?&gt;
  &lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
  &lt;script src=&quot;http://connect.facebook.net/en_US/all.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;text/javascript&quot;&gt;
    window.fbAsyncInit = function() {
      FB.init({appId: &#x27;eure_app_id&#x27;, status: true, cookie: true, xfbml: true});
    }
  &lt;/script&gt;
&lt;?php endif; ?&gt;
</code>
</pre>
<p>Das wird in die <span lang="en">footer.php</span> direkt über dem abschließenden <code class="inline" lang="en">body</code>-<span lang="en">Tag</span> eingefügt. <em>eure_app_id</em> ist auch hier entpsrechend zu ersetzen.</p>
<p>Nun muss der Button selbst noch auf der Artikelseite eingebunden werden:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr></dfn>
<code class="block">&lt;fb:like href=&quot;&lt;?php the_permalink() ?&gt;&quot; layout=&quot;standard&quot; show_faces=&quot;false&quot; width=&quot;xyz&quot; action=&quot;like&quot; colorscheme=&quot;light&quot; font=&quot;trebuchet ms&quot;&gt;&lt;/fb:like&gt;
</code>
</pre>
<p>Dies tragt ihr in der <span lang="en">single.php</span> da ein, wo der <span lang="en">Button</span> hin soll. Die Attribute könnt ihr in gewissem Maße euren Präferenzen anpassen. <a href="http://developers.facebook.com/docs/reference/plugins/like" title="Like-Button - Facebook" hreflang="en">Hier erfahrt ihr, was möglich ist.</a></p>
<p>Hat man das alles eingetragen, werden auf der Einzelansicht eines Artikels die nötigen Meta-Angaben angezeigt, das entsprechende <span lang="en">JavaScript</span> für den <span lang="en">Like-Button</span> wird eingebunden und der <span lang="en">Like-Button</span> selbst erscheint ober- oder unterhalb des Artikels - je nachdem, wo ihr ihn eingefügt habt.</p>
<p>Sollte euch das alles zu <span lang="en">tricky</span> sein, könnt ihr entweder die <code class="code" lang="en">iframe</code>-Variante einbinden oder auf das <span lang="en">WordPress-PlugIn</span> von <a href="http://blog.bottomlessinc.com/" title="Bottomless, Endless" lang="en" hreflang="en">Bottomless</a> zurückgreifen: <a href="http://wordpress.org/extend/plugins/like/" title="WordPress &#8250; Like &laquo; WordPress Plugin" lang="en" hreflang="en">Like</a>.</p>
<p>Noch ein paar Worte zur <span lang="en">Performance</span>. Das Einbinden des <span lang="en">Like-Button</span> verlängert natürlich die Ladezeit eures Blogs. Allerdings sprechen wir hier von <span lang="en">WordPress</span> - hier ist es normal, dass auf jeder Seite drei zusätzliche <span lang="en">JavaScript</span>-Dateien und zwei zusätzliche <span lang="en">Stylesheets</span> eingebunden werden, weil irgendwo im <span lang="en">Blog</span> mal eine <span lang="en">Lightbox</span> aufgehen soll. Will heißen: Denkt darüber nach, ob ihr den <span lang="en">Button</span> einbauen wollt, aber bedenkt, dass euer System sowieso nicht <span lang="en">Performance</span>-optimiert ist.</p>
<p>Es sei denn, ihr seid bezüglich dieses Themas sensibilisiert und habt entsprechende Schritte unternommen, eurem <span lang="en">Blog</span> auf die Sprünge zu helfen.</p>
<p>Ansonsten wie immer: Bei Fragen schreibt einen Kommentar. Bei Gefallen <span lang="en">bookmarkt</span> den Artikel. Danke!</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/tutorial/fancy-login-logout-button-fur-deinen-wordpress-blog/' rel='bookmark' title='Fancy Login-/Logout-Button für deinen WordPress-Blog'>Fancy Login-/Logout-Button für deinen WordPress-Blog</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/animierte-image-caption-mit-jquery-unter-wordpress/' rel='bookmark' title='Animierte Image-Caption mit jQuery unter WordPress'>Animierte Image-Caption mit jQuery unter WordPress</a></li>
<li><a href='http://www.emanuel-kluge.de/video/ikea-facebook-und-der-segen-der-photo-tagging/' rel='bookmark' title='IKEA, Facebook und der Segen des &#8220;Photo Tagging&#8221;'>IKEA, Facebook und der Segen des &#8220;Photo Tagging&#8221;</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/html-css/facebook-like-button-per-xfbml-in-wordpress-blogs-einfugen/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>&#8220;Rising Curtain&#8221;-Effekt bei Input-Feldern mit jQuery</title>
		<link>http://www.emanuel-kluge.de/tutorial/rising-curtain-effekt-bei-input-feldern-mit-jquery/</link>
		<comments>http://www.emanuel-kluge.de/tutorial/rising-curtain-effekt-bei-input-feldern-mit-jquery/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 16:30:12 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Input]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=1039</guid>
		<description><![CDATA[Demo &#124; Download Hinweis: Die CSS-Eigenschaft background-position-x bzw. background-position-y ist eine Erfindung von Microsoft und funktioniert leider nur im Internet Explorer und in Webkit-Browsern. Deshalb gibt es im jQuery-Skript eine Browser-Weiche. Im Firefox und im Opera verschwindet die Grafik einfach nur, der "Rising Curtain"-Effekt findet also nicht statt. Kommen wir aber zum eigentlichen Tutorial: Heute [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/03/rising-curtain-effekt-bei-input-feldern-mit-jquery.jpg" alt="&quot;Rising Curtain&quot;-Effekt bei Input-Feldern mit jQuery" title="&quot;Rising Curtain&quot;-Effekt bei Input-Feldern mit jQuery" width="480" height="150" class="aligncenter size-full wp-image-1041" /></p>
<div class="dedo"><a href="http://www.emanuel-kluge.de/demo/rising-curtain-effekt-bei-input-feldern-mit-jquery/" title="Demo &mdash; &quot;Rising Curtain&quot;-Effekt bei Input-Feldern mit jQuery" rel="nofollow">Demo</a> | <a href="http://www.emanuel-kluge.de/wp-content/uploads/2010/03/rising-curtain-effekt-bei-input-feldern-mit-jquery.zip" title="Download &mdash; &quot;Rising Curtain&quot;-Effekt bei Input-Feldern mit jQuery">Download</a></div>
<p><strong>Hinweis:</strong></p>
<p>Die <abbr title="Cascading Stylesheet" lang="en">CSS</abbr>-Eigenschaft <code class="inline" lang="en">background-position-x</code> <abbr title="beziehungsweise">bzw.</abbr> <code class="inline" lang="en">background-position-y</code> ist eine Erfindung von <span lang="en">Microsoft</span> und funktioniert leider nur im <span lang="en">Internet Explorer</span> und in <span lang="en">Webkit-Browsern</span>. Deshalb gibt es im <span lang="en">jQuery</span>-Skript eine <span lang="en">Browser</span>-Weiche. Im <span lang="en">Firefox</span> und im <span lang="en">Opera</span> verschwindet die Grafik einfach nur, der <span lang="en">"Rising Curtain"</span>-Effekt findet also nicht statt.</ins></p>
<p>Kommen wir aber zum eigentlichen Tutorial:</p>
<p>Heute möchte ich zeigen, wie man <code class="inline" lang="en">input</code>-Felder in Formularen mithilfe des <span lang="en">"Rising Curtain"</span>-Effekts und <span lang="en">jQuery</span> interessanter gestalten kann, wenn der Fokus auf ihnen liegt. Alles was man dafür braucht, ist eine kleine Hintergrundgrafik mit einem Farbverlauf und ein paar Zeilen <span lang="en">jQuery</span>. Als erstes aber wenden wir uns dem <abbr title="Hypertext Markup Language" lang="en">HTML</abbr>-Teil zu:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr></dfn>
<code class="block">&lt;div&gt;
   &lt;span&gt;
      &lt;input type=&quot;text&quot; id=&quot;input1&quot; /&gt;
   &lt;/span&gt;
   &lt;label for=&quot;input1&quot;&gt;Input 1&lt;/label&gt;
&lt;/div&gt;
</code>
</pre>
<p>Dieser bedarf wohl keiner großen Erklärung. Es gibt ein <code class="inline" lang="en">input</code>-Feld plus dem dazugehörigen Label. Das <code class="inline" lang="en">input</code>-Feld ist in <code class="inline" lang="en">span</code>-<span lang="en">Tags</span> eingefasst, welche für den Rand sorgen.</p>
<p>Als nächstes der <abbr title="Cascading Stylesheet" lang="en">CSS</abbr>-Teil:</p>
<pre>
<dfn><abbr title="Cascading Stylesheet" lang="en">CSS</abbr></dfn>
<code class="block">div {
   height: 24px;
   margin-bottom: 10px;
   clear: left;
}

   span {
      height: 24px;
      float: left;
      display: inline;
      margin-right: 10px;
      border: 1px solid #999;
}

   span.active {
      border-color: #063050;
   }

      input {
         display: block;
         width: 200px;
         height: 18px;
         padding: 2px 4px;
         line-height: 18px;
         background: #FFF url('img/gradient.jpg') 0 0 repeat-x;
         border: 1px solid #FFF;
         color: #063050;
      }

   label {
      height: 24px;
      float: left;
      display: inline;
      line-height: 24px;
      cursor: pointer;
   }
</code>
</pre>
<p><code class="inline" lang="en">span</code> und <code class="inline" lang="en">label</code> werden mit <code class="inline" lang="en">float: left</code> nebeneinander angeordnet. Das <code class="inline" lang="en">input</code>-Feld bekommt einen weißen Rand, damit der dunkle Hintergrund nicht an den dunklen Rand des <code class="inline" lang="en">span</code>-Elements klatscht. Der Hintergrund wiederum stellt einen Farbverlauf von dunkelblau zu weiß dar, der mehr als doppelt so hoch wie das <code class="inline" lang="en">input</code>-Feld ist.</p>
<p>Kommen wir nun zum <span lang="en">jQuery</span>-Teil:</p>
<pre>
<dfn lang="en">JavaScript</dfn>
<code class="block">jQuery(document).ready(function($) {
   $(&#x27;input&#x27;).focus( function() {
      $(this).parent().addClass(&#x27;active&#x27;);
      if ( jQuery.browser.webkit || jQuery.browser.msie ) {
         $(this).animate({&#x27;background-position-y&#x27; : &#x27;-28px&#x27;}, 500, &#x27;linear&#x27;);
      } else {
         $(this).animate({&#x27;background-position&#x27; : &#x27;0 -28px&#x27;}, 0, &#x27;linear&#x27;);
      }
   });
   $(&#x27;input&#x27;).blur( function() {
      $(this).parent().removeClass(&#x27;active&#x27;);
      if ( jQuery.browser.webkit || jQuery.browser.msie ) {
         $(this).animate({&#x27;background-position-y&#x27; : &#x27;0&#x27;}, 500, &#x27;linear&#x27;);
      } else {
         $(this).animate({&#x27;background-position&#x27; : &#x27;0 0&#x27;}, 0, &#x27;linear&#x27;);
      }
   });
});
</code>
</pre>
<p>Liegt der Fokus auf einem <code class="inline" lang="en">input</code>-Feld, bekommt das umschließende <code class="inline" lang="en">span</code>-Element die Klasse &quot;<code class="inline" lang="en">active</code>&quot; zugewiesen und der Rand wird dunkelblau. Außerdem verschiebt sich der Hintergrund des <code class="inline" lang="en">input</code>-Feldes nach oben mithilfe der <code class="inline" lang="en">animate()</code>-Funktion von <span lang="en">jQuery</span>. Das ist der so genannte <span lang="en">"Rising Curtain"</span>-Effekt, durch den der Hintergrund des <code class="inline" lang="en">input</code>-Feldes heller wird. Gesteuert wird das ganze über die  <abbr title="Cascading Stylesheet" lang="en">CSS</abbr>-Eigenschaft <code class="inline" lang="en">background-position-y</code>.</p>
<p>So einfach ist das. Das ganze lässt sich natürlich auch bei einer <code class="inline" lang="en">textarea</code> anwenden. Denkt aber daran, dass die Hintergrund-Grafik entsprechend groß sein muss. Auch ist es denkbar, die Hintergrund-Grafik ganz aus dem sichtbaren Bereich fahren zu lassen, so dass das <code class="inline" lang="en">input</code>-Feld weiß wird. Der Kreativität sind kaum Grenzen gesetzt.</p>
<p>Das war es auch schon. <span lang="en">Bookmark</span> setzen oder dieses <span lang="en">Tutorial</span> via <span lang="en">twitter</span> durch den Äther jagen, wird wie immer gern gesehen. Bei Fragen und Anregungen steht die Kommentar-Funktion zur Verfügung. Nichts neues also.</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/tutorial/hover-und-spotlight-effekt-in-bildergalerie-mit-jquery/' rel='bookmark' title='Hover- und Spotlight-Effekt in Bildergalerie mit jQuery'>Hover- und Spotlight-Effekt in Bildergalerie mit jQuery</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/social-icon-bar-mit-jquery/' rel='bookmark' title='&quot;Social Icon Bar&quot; mit jQuery'>&quot;Social Icon Bar&quot; mit jQuery</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/animierte-image-caption-mit-jquery-unter-wordpress/' rel='bookmark' title='Animierte Image-Caption mit jQuery unter WordPress'>Animierte Image-Caption mit jQuery unter WordPress</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/tutorial/rising-curtain-effekt-bei-input-feldern-mit-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>7 hilfreiche Tutorials zum Thema Transitions in CSS3</title>
		<link>http://www.emanuel-kluge.de/tutorial/7-hilfreiche-tutorials-zum-thema-transitions-in-css3/</link>
		<comments>http://www.emanuel-kluge.de/tutorial/7-hilfreiche-tutorials-zum-thema-transitions-in-css3/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 08:33:31 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Transitions]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=972</guid>
		<description><![CDATA[Das Thema Transition in CSS3 ist so neu nicht mehr, doch nach wie vor aktuell. Das liegt u.a. daran, dass mit Firefox und Chrome neuerdings zwei weitere Browser neben Safari auf dem Markt sind, die diese Funktion unterstützen. So entwickeln sich CSS-Transitions von der Spielerei zur ernsten Alternative zu JavaScript, wenn es um Animationen im [...]]]></description>
			<content:encoded><![CDATA[<p>Das Thema <strong lang="en">Transition</strong> in <strong><abbr title="Cascading Stylesheets" lang="en">CSS</abbr>3</strong> ist so neu nicht mehr, doch nach wie vor aktuell. Das liegt <abbr title="unter anderem">u.a.</abbr> daran, dass mit <span lang="en">Firefox</span> und <span lang="en">Chrome</span> neuerdings zwei weitere <span lang="en">Browser</span> neben Safari auf dem Markt sind, die diese Funktion unterstützen.</p>
<p>So entwickeln sich <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>-<span lang="en">Transitions</span> von der Spielerei zur ernsten Alternative zu <span lang="en">JavaScript</span>, wenn es um Animationen im <span lang="en">Webdesign</span> geht. Deshalb habe ich 7 <strong lang="en">Tutorials</strong> rausgesucht, die einen Überblick über die Möglichkeiten von <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>-<span lang="en">Transitions</span> geben.</p>
<h3 lang="en">1. <a href="http://www.the-art-of-web.com/css/timing-function/" title="Transition Timing Functions &lt; CSS - The Art of Web"  hreflang="en"><abbr title="Cascading Stylesheets">CSS</abbr>: Transition Timing Functions</a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/the-art-of-web.jpg" alt="The Art of Web" title="The Art of Web" width="480" height="165" class="aligncenter size-full wp-image-973" /></p>
<p>Der Artikel behandelt die Eigenschaften <span lang="en" class="code">transition-duration</span> und <span lang="en" class="code">transition-timing-function</span>, und beschreibt, wie man Dauer und Geschwindigkeit von Animationen beeinflusst.</p>
<h3 lang="en">2. <a href="http://thechriswalker.net/2009-03/more-webkit-goodies-css-transforms-and-transitions-the-osx-dock-example.html" title="More WebKit Goodies - CSS Transforms and Transitions - the OSX Dock example - theChrisWalker.net"  hreflang="en"><abbr title="Cascading Stylesheets">CSS</abbr> Transforms and Transitions - The OSX Dock example</a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/mac-osx-dock-realized-with-css3-transition.jpg" alt="Mac OSX-Dock realized with- CSS3-Transition" title="Mac OSX-Dock realized with- CSS3-Transition" width="480" height="294" class="aligncenter size-full wp-image-994" /></p>
<p>Chris Walker zeigt, wie man den Mac OSX-Dock nur mithilfe von <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>3 nachbauen kann.</p>
<h3 lang="en">3. <a href="http://24ways.org/2009/going-nuts-with-css-transitions" title="24 ways: Going Nuts with CSS Transitions"  hreflang="en">Going Nuts with <abbr title="Cascading Stylesheets" lang="en">CSS</abbr> Transitions</a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/polaroid-gallery-with-css3.jpg" alt="Polaroid-Gallery with CSS3" title="Polaroid-Gallery with CSS3" width="480" height="249" class="aligncenter size-full wp-image-995" /></p>
<p>Natalie Downe demonstriert, wie man eine <span lang="en">Polaroid</span>-Galerie mithilfe von <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>-<span lang="en">Transitions</span> baut.</p>
<h3 lang="en">4. <a href="http://www.newmediacampaigns.com/page/nicer-navigation-with-css-transitions" title="Nicer Navigation with CSS Transitions - Development Blog"  hreflang="en">Nicer Navigation with <abbr title="Cascading Stylesheets">CSS</abbr> Transitions</a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/nicer-navigations-with-css-transitions.jpg" alt="Nicer Navigations with CSS Transitions" title="Nicer Navigations with CSS Transitions" width="480" height="198" class="aligncenter size-full wp-image-997" /></p>
<p>Schöne Anleitung, wie man <span lang="en">Website</span>-Navigationen schöner gestalten kann mit <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>3.</p>
<h3 lang="en">5. <a href="http://www.thecssninja.com/css/accordian-effect-using-css" title="Create the accordion effect using CSS3  -  The CSS Ninja - All things CSS, Javascript &amp; xhtml"  hreflang="en">Create the accordion effect using <abbr title="Cascading Stylesheets">CSS</abbr>3</a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/css-ninja.jpg" alt="CSS Ninja" title="CSS Ninja" width="480" height="136" class="aligncenter size-full wp-image-998" /></p>
<p>Der Akkordeon-Effekt nur mit <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>3 und <span lang="en">Transitions</span> realisiert.</p>
<h3>6. <a href="http://www.dosonaro.com/css3-hover-tabs-ohne-javascript/" title="CSS3 Hover Tabs ohne Javascript - HTML &amp; CSS - Dosonaro"  hreflang="de"><abbr title="Cascading Stylesheets" lang="en">CSS</abbr>3 <span lang="en">Hover Tabs</span> ohne <span lang="en">JavaScript</span></a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/dosonaro-blog.jpg" alt="Dosonaro - Blog" title="Dosonaro - Blog" width="480" height="146" class="aligncenter size-full wp-image-999" /></p>
<p><span lang="en">Hover Tabs</span> ohne <span lang="en">JavaScript</span>. Über die Praxistauglichkeit dieser Lösung kann man streiten, aber nichtsdestotrotz veranschaulicht sie sehr schön die Möglichkeiten von <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>3.</p>
<h3 lang="en">7. <a href="http://www.webdesignerdepot.com/2010/01/css-transitions-101/" title="CSS Transitions 101 - Webdesigner Depot"  hreflang="en"><abbr title="Cascading Stylesheets">CSS</abbr> Transitions 101</a></h3>
<p><img src="http://www.emanuel-kluge.de/wp-content/uploads/2010/02/css-transitions-on-webdesigner-depot.jpg" alt="CSS Transitions on Webdesigner Depot" title="CSS Transitions on Webdesigner Depot" width="480" height="196" class="aligncenter size-full wp-image-1000" /></p>
<p>Zum Abschluss eine schöne Gesamtübersicht zum Thema <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>-<span lang="en">Transitions</span> auf <span lang="en">Webdesigner Depot</span>.</p>
<p>Ich hoffe, ihr habt ein paar hilfreiche Sachen gefunden. Zwar surfen viele Leute noch immer mit einem veralteten <span lang="en">Browser</span>, der keine <abbr title="Cascading Stylesheets" lang="en">CSS</abbr>-<span lang="en">Transitions</span> unterstützt, doch trotzdem gibt es Möglichkeiten, diese Technik bereits jetzt einzusetzen. Es sind eben die Details, wenn <abbr title="beispielsweise">bspw.</abbr> ein <span lang="en">Link</span> nicht schlagartig beim <span lang="en">Hover</span> die Farbe ändert, sondern das langsam tut, die eine moderne <span lang="en">Website</span> ausmachen. Hat man keinen modernen <span lang="en">Browser</span>, kommt man nicht in den Genuss, kann die Seite aber trotzdem nutzen.</p>
<hr /><p>Verwandte Beitr&auml;ge:<ul>
<li><a href='http://www.emanuel-kluge.de/html-css/weichgezeichnete-schrift-mit-css3/' rel='bookmark' title='Weichgezeichnete Schrift mit CSS3'>Weichgezeichnete Schrift mit CSS3</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/social-icon-bar-mit-jquery/' rel='bookmark' title='&quot;Social Icon Bar&quot; mit jQuery'>&quot;Social Icon Bar&quot; mit jQuery</a></li>
<li><a href='http://www.emanuel-kluge.de/tutorial/hover-und-spotlight-effekt-in-bildergalerie-mit-jquery/' rel='bookmark' title='Hover- und Spotlight-Effekt in Bildergalerie mit jQuery'>Hover- und Spotlight-Effekt in Bildergalerie mit jQuery</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/tutorial/7-hilfreiche-tutorials-zum-thema-transitions-in-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das title-Attribut ist kein SEO-Spielzeug!</title>
		<link>http://www.emanuel-kluge.de/html-css/das-title-attribut-ist-kein-seo-spielzeug/</link>
		<comments>http://www.emanuel-kluge.de/html-css/das-title-attribut-ist-kein-seo-spielzeug/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:47:35 +0000</pubDate>
		<dc:creator>Emanuel</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Überlegungen]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[title-Attribut]]></category>

		<guid isPermaLink="false">http://www.emanuel-kluge.de/?p=963</guid>
		<description><![CDATA[Manchmal habe ich das Gefühl, es gibt Menschen da draußen, die das title-Attribut für ein SEO-Spielzeug halten. Eine Möglichkeit noch ein paar zusätzliche Infos für Google mit auf den Weg zu geben, um in den Rankings besser dazustehen. Das macht man, wenn man Lust darauf hat. Oder lässt es, wenn man nicht zu den Pedanten [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal habe ich das Gefühl, es gibt Menschen da draußen, die das <strong><span lang="en">title</span>-Attribut</strong> für ein <strong><abbr title="Search Engine Optimization" lang="en">SEO</abbr>-Spielzeug</strong> halten. Eine Möglichkeit noch ein paar zusätzliche Infos für <span lang="en">Google</span> mit auf den Weg zu geben, um in den <span lang="en">Rankings</span> besser dazustehen. Das macht man, wenn man Lust darauf hat. Oder lässt es, wenn man nicht zu den Pedanten in Sachen Suchmaschinenoptimierung gehört.</p>
<p>Allerdings spielt das <span lang="en">title</span>-Attribut auch in Sachen <span lang="en">Usability</span> eine Rolle. Es bietet die Möglichkeit, dem Nutzer (tiefergehende) Informationen bezüglich eines Bildes oder eines <span lang="en">Links</span> zu geben.</p>
<h3>Das <span lang="en">title</span>-Attribut bei Verweisen</h3>
<p><span lang="en">Links</span> sind immer in ihrer Wortzahl begrenzt, da nur in den wenigsten Fällen ein ganzer Textabschnitt zum <span lang="en">Link</span> umfunktioniert wird. Eher sind es Teile von Sätzen oder - außerhalb von Textabschnitten - einzelne Begriffe, die auf andere Seiten verweisen. Auf jeden Fall kriegt man in der <span lang="en">Link</span>-Beschriftung nie den Namen der Seite, auf die verwiesen wird, deren Beschreibung, sowie eine kurze Beschreibung des Inhalts der Unterseite - falls nicht auf die Startseite verwiesen wird - unter. Mithilfe des <span lang="en">title</span>-Attributs ist das jedoch möglich.</p>
<p>Angenommen, man möchte auf eine Unterseite der <span lang="en">Website</span> des deutschen Dackel-Clubs verweisen, die sich mit dem Thema Aufzucht befasst. Erste Möglichkeit ist es, den <span lang="en">Link</span> im Text unterzubringen:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr></dfn>
<code class="block">&lt;p&gt;&hellip; bei der &lt;a href=&quot;dackel-club.tld/path/to/aufzucht/&quot; title=&quot;Deutscher Dackel-Club - Informationen zur Aufzucht von Dackeln&quot;&gt;Aufzucht&lt;/a&gt; von Dackeln &hellip;&lt;/p&gt;
</code>
</pre>
<p>Ohne das <span lang="en">title</span>-Attribut weiß man nicht, wohin der Begriff &quot;Aufzucht&quot; führt. Durch Setzen des <span lang="en">title</span>-Attributs kann der Leser es jedoch herausfinden, indem er den <span lang="en">Cursor</span> etwas länger über dem <span lang="en">Link</span> ruhen lässt.</p>
<p>Eine weitere Möglichkeit ist es, den <span lang="en">Link</span> unterhalb des Textabschnitts zu setzen:</p>
<pre>
<dfn><abbr title="Hypertext Markup Language" lang="en">HTML</abbr></dfn>
<code class="block">&lt;a href=&quot;dackel-club.tld/path/to/aufzucht/&quot; title=&quot;Deutscher Dackel-Club - Informationen zur Aufzucht von Dackeln&quot;&gt;Deutscher Dackel-Club&lt;/a&gt;
</code>
</pre>
<p>Der Leser sieht, dass es weitergehende Informationen beim deutschen Dackel-Club gibt, doch worum es sich genau handelt, kann er aus der <span lang="en">Link</span>-Beschriftung &quot;Deutscher Dackel-Club&quot; nicht herauslesen. Das <span lang="en">title</span>-Attribut gibt hier mehr Aufschluss.</p>
<p>Nun wird der eine oder die andere vielleicht einwerfen, dass man den Inhalt des <span lang="en">Link</span>-Ziels doch aus dem Thema des Textes ableiten kann. Das ist sicherlich richtig, doch will man seine Besucher immer raten lassen oder lieber klar definierte Informationen liefern?!</p>
<h3>Das <span lang="en">title</span>-Attribut bei grafischen Verweisen</h3>
<p>Als erstes zwei Beispiele, die mich überhaupt dazu bewogen haben, diesen Text zu schreiben:</p>
<ol>
<li><a href="http://www.thinkingforaliving.org/" title="Thinking for a Living - Main Page" lang="en" hreflang="en">Thinking for a Living</a></li>
<li><a href="http://photointerview.ru/2010/02/tom-hoops-the-dark-knight-of-the-portrait-photography/" title="Tom Hoops - The Dark Knight of The Portrait Photography on &#x424;&#x43E;&#x442;&#x43E;&#x418;&#x43D;&#x442;&#x435;&#x440;&#x432;&#x44C;&#x44E;" lang="en" hreflang="en">Interview with Tom Hoops</a></li>
</ol>
<p>Bei beiden Seiten tauchen links und rechts des Inhalts zwei große Pfeile auf, die einen mehr oder weniger verfolgen und geklickt werden wollen, jedoch nicht preisgeben, welchen Zweck sie haben. Das ist äußerst irritierend und sollte auf jeden Fall vermieden werden. Das gleiche ist es mit <span lang="en">Icons</span> und Piktogrammen. Klar weiß ich, wenn ich ein kleines Stift-Symbol auf einer Seite sehe, dass da was bearbeitet werden kann. Doch was genau, sagt mir die Grafik nicht.</p>
<p>Möchte man also vermeiden, dass Nutzer unnötig klicken müssen, um den genauen Zweck des Links zu ergründen, dann sollte man sich des <span lang="en">title</span>-Attributs befleißigen und so unnötiges Herumraten und möglicherweise Frust vermeiden.</p>
<h3>Das <span lang="en">title</span>-Attribut bei Bildern</h3>
<p>Neben dem <span lang="en">alt</span>-Attribut, kann man zur Beschreibung von Bildern auf Webseiten auch das <span lang="en">title</span>-Attribut benutzen. Dies kann durchaus sinnvoll sein, denn nur die wenigsten Bilder sprechen für sich und den Inhalt des <span lang="en">alt</span>-Attributs bekommt der durchschnittliche Besucher nicht zu sehen, es sei denn der Pfad zum Bild ist falsch gesetzt.</p>
<p>Allerdings muss man in diesem Fall etwas relativieren. In letzter Zeit haben sich immer mehr die so genannten <span lang="en">Image-Captions</span> durchgesetzt, bei denen die Beschreibung des Bildes direkt unterhalb des selben stehen. Das ist für den Besucher sicherlich sinnvoller, da die Beschreibung so direkt ersichtlich ist, und man nicht erst den <span lang="en">Cursor</span> auf dem Bild "parken" muss. Bedient man sich der <span lang="en">Image-Captions</span>, wird das Setzen des <span lang="en">title</span>-Attributs wirklich zu einer reinen <abbr title="Search Engine Optimization" lang="en">SEO</abbr>-Aktion.</p>
<p>Verzichtet man jedoch auf <span lang="en">Image-Captions</span>, sollte man den Besuchern, die noch über ihr Augenlicht verfügen, den Gefallen tun und das <span lang="en">title</span>-Attribut befüllen.</p>
<p>So, das war mein kleiner Diskurs am Morgen. Ich freue mich natürlich  immer auf andere Ansichten zu diesem Thema. Wenn ihr also bei dem ein oder anderen Punkt der Meinung seid, das stimmt so nicht, wie ich es geschrieben habe, dann nutzt die Kommentar-Funktion und ergreift das Wort.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.emanuel-kluge.de/html-css/das-title-attribut-ist-kein-seo-spielzeug/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

