<?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>Webkrauts &#187; Adventskalender 2009</title>
	<atom:link href="http://www.webkrauts.de/category/adventskalender/adventskalender-2009/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.webkrauts.de</link>
	<description>Für mehr Qualität im Web</description>
	<lastBuildDate>Thu, 26 Aug 2010 12:48:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ZenCoding &#8211; Schneller ans Ziel kommen</title>
		<link>http://www.webkrauts.de/2009/12/24/zencoding/</link>
		<comments>http://www.webkrauts.de/2009/12/24/zencoding/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 06:00:28 +0000</pubDate>
		<dc:creator>Jens Grochtdreis</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=746</guid>
		<description><![CDATA[<div class="advent advent-24">24. Türchen des Webkrauts-Adventskalenders</div>
<p>Viele Texteditoren und Entwicklungsumgebungen erleichtern und beschleunigen durch Hilfestellungen die Arbeit. Hinter unserem letzten Türchen stellt Jens Grochtdreis einen Ansatz vor, der in vielen unterschiedlichen Editoren die Arbeit enorm beschleunigen kann.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-24">24. Türchen des Webkrauts-Adventskalenders</div>
<p>Die wesentliche Aufgabe eines Editors und einer Entwicklungsumgebung (IDE) ist es, dem Entwickler Arbeit abzunehmen und Hilfestellung zu leisten. Das kann eine programminterne Validierung sein, das k&ouml;nnen programminterne Codeschnipsel sein. Textmate auf dem Mac ist daf&uuml;r ber&uuml;hmt, dass es &uuml;ber Kurzschreibweisen in Zusammenarbeit mit der Tabulatortaste alle HTML-Elemente oder CSS-Eigenschaften und noch viel mehr zug&auml;nglich macht.</p>
<p>Dieses Grundprinzip macht der Russe Sergey Chikuyonok f&uuml;r andere Editoren nutzbar. <a href="http://code.google.com/p/zen-coding/">ZenCoding</a> nennt sich die kleine Skriptsammlung, die er &uuml;ber GoogleCode anbietet und die derzeit von Aptana, Coda, Espresso, editArea (online Editor), Visual Studio, TextMate, E-editor, TopStyle, Sublime, GEdit, Dreamweaver, UltraEdit, Web IDE und NetBeans in unterschiedlicher Intensit&auml;t unterst&uuml;tzt werden. ZenCoding ist eine Mischung aus Snippets und Shortcuts, die das Coden nicht revolutionieren, aber schneller und bequemer machen.</p>
<p>Auf einen »Schl&uuml;ssel« folgt eine Tastenkombination, die abh&auml;ngig von Programm und Betriebssystem entweder Cmd+E oder Strg+E ist, aber auch individuell eingestellt werden kann. F&uuml;r das einfache Erzeugen eines Absatzes ist ZenCoding zwar geeignet, aber nicht n&ouml;tig. Wie sieht es aber aus, wenn ich eine Liste mit fünf Listenelementen erstellen will, die alle eine fortlaufende ID haben m&uuml;ssen (warum auch immer?). F&uuml;r ZenCoding die gefundene Aufgabe. Die Schreibweise erinnert sehr an CSS:</p>
<pre><code>ul#eineID.eineKlasse&gt;li#test$*5
</code></pre>
<p>Nun einmal Cmd+E bzw. Strg+E dr&uuml;cken und es entsteht dieses Konstrukt:</p>
<pre><code>&lt;ul id=&quot;eineID&quot; class=&quot;eineKlasse&quot;&gt;
&lt;li id=&quot;test1&quot;&gt;&lt;/li&gt;
&lt;li id=&quot;test2&quot;&gt;&lt;/li&gt;
&lt;li id=&quot;test3&quot;&gt;&lt;/li&gt;
&lt;li id=&quot;test4&quot;&gt;&lt;/li&gt;
&lt;li id=&quot;test5&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<p>Mit <code>html:xt</code> wird ein grobes Template mit XHTML1-Transitional-Doctype erzeugt. F&uuml;r andere Doctypes gibt es &auml;hnliche K&uuml;rzel. Sehr hilfreich finde ich, neben der schnellen Erzeugung von Elementen mit Klassen und IDs, die Erstellung verschachtelter Konstrukte. Wenn ich mir eine Containerbox mit Headline und Absatz erzeugen m&ouml;chte, kann ich folgendes schnell schreiben:</p>
<pre><code>div.sidebox&gt;h3+p+ul&gt;li*5&gt;a.external
</code></pre>
<p>Das Ergebnis sieht dann so aus:</p>
<pre><code>&lt;div class=&quot;sidebox&quot;&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&quot; class=&quot;external&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot; class=&quot;external&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot; class=&quot;external&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot; class=&quot;external&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot; class=&quot;external&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</code></pre>
<p>Neben HTML kann ZenCod&iacute;ng auch CSS. So gibt es f&uuml;r alle Eigenschaften Abk&uuml;rzungen. Meist sind diese aber selber so kurz, da&szlig; sich ein Auswendiglernen der Abk&uuml;rzungen kaum lohnt. Trotzdem ist es nett, wenn aus einem <code>bdt</code> ein <code>border-top:;</code> wird. So richtig hilfreich sind aber Perlen wie <code>op:ie</code>, aus dem dann <code>filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);</code> wird. Das beschleunigt die Codearbeit ungemein. Vorher sollte man sich aber intensiv mit der Materie besch&auml;ftigen und viel austesten. Durch die konstante Arbeit damit kommt man schnell auf den Geschmack.</p>
<p>Wer es einmal au&szlig;erhalb seines Editors testen m&ouml;chte, kann dies <a href="http://zen-coding.ru/demo/">online</a> tun. Das Projekt selber liegt bei <a href="http://code.google.com/p/zen-coding/">Google Code</a>. Viele dortige Erkl&auml;rungen sind auf russisch. Eine prima Gelegenheit, um <a href="http://translate.google.com">Google Translate</a> auszutesten! <a href="http://delicious.com/Flocke/zen_coding">Bei delicious</a> habe ich ein paar empfehlenswerte Artikel zum Thema gesammelt, darunter ist auch der umfangreiche &Uuml;berblick des <a href="http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/">Smashing Magazines</a>.</p>
<p>Happy ZenCoding!</p>
<h4>&Uuml;ber den Autor</h4>
<p><img alt="Jens Grochtdreis" src="http://www.webkrauts.de/wp-content/uploads/2006/11/jens_grochtdreis_60x60.jpg" class="bild-links" /> Jens Grochtdreis ist freier Webentwickler und Berater. Er liebt leidenschaftlich das Medium Internet. Jens gr&uuml;ndete die Webkrauts, um f&uuml;r ein besseres Medium zu streiten. Wenn er nicht gerade <a href="http://grochtdreis.de/weblog">bloggt</a>, <a href="http://twitter.com/Flocke">twittert</a>, surft oder codet, dann entspannt er sich bei Comics, Krimis, h&ouml;rt Blues oder kocht.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/24/zencoding/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Gut gebrüllt, Löwe!</title>
		<link>http://www.webkrauts.de/2009/12/23/tipps-fuers-tippen/</link>
		<comments>http://www.webkrauts.de/2009/12/23/tipps-fuers-tippen/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 06:00:21 +0000</pubDate>
		<dc:creator>Nicolai Schwarz</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=726</guid>
		<description><![CDATA[<div class="advent advent-23">23. Türchen des Webkrauts-Adventskalenders</div><p>Wer für sinnvolle Quelltexte eintritt, der kann auch für gute Texte streiten. Denn auch das gehört zur »Qualität im Web«. Nicolai Schwarz gibt ein paar einfache Tipps für besseren Stil.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-23">23. Türchen des Webkrauts-Adventskalenders</div>
<p>In letzter Zeit redigiere ich recht viele Texte. Es sind Fachartikel von Fachleuten, und niemand erwartet in diesem Zusammenhang eine blumige Reportage. Aber in vielen Texten schreibe ich immer wieder ähnliche Stellen um. Dabei ist es gar nicht so schwer, seine eigenen Texte einmal durchzusehen, um in dem einen oder anderen Satz am Stil oder der Zeichensetzung zu feilen.</p>
<h4>Könnte man zwar, muss man aber nicht</h4>
<p>Man kommt ziemlich viel herum. An jeder Ecke ist er zu finden. Aktuell zum Beispiel in Sätzen wie »Wenn ja, dann sollte man aus Afghanistan sofort abziehen« oder auch »50 Photoshop Pinsel, die man haben sollte«. Muss das sein?</p>
<p>Ich will nun nicht darauf hinaus, ganz auf das Wort »man« zu verzichten. Aber es nervt doch, wenn es im Text davon nur so wimmelt. An vielen Stellen ist es gar nicht so schwer, stattdessen einen passenderen Akteur einzusetzen, etwa »dann sollten wir aus Afghanistan sofort abziehen«, »Pinsel, die Webworker haben sollten« oder auch »Pinsel, die Sie haben sollten«. Irgendwer ist ja immer gemeint: Ich, du, Sie, Kunden, Webworker, Autoren, Designer usw.</p>
<p>Andere Akteure vermeiden jenen gesichtslosen »man« – und der Leser wird stärker angesprochen.</p>
<h4>Verben, Verben, Verben</h4>
<p>Ein beliebtes Mittel in der Politik ist der Nominalstil. Neue Gesetze und Berichte werden erst einmal mit einem Haufen Nomen vollgestopft, als ob Verben um jeden Preis vermieden werden müssten. So kommen Beamte auf schöne Titel wie »Entwurf eines Gesetzes zur Änderung des Gesetzes zur Errichtung eines Sondervermögens „Investitions- und Tilgungsfonds“«. In solchen Fällen ist es immer eine gute Idee, ein paar der Nomen durch Verben zu ersetzen. Nomen wirken sachlich, langweilig &#8211; Verben sind aktiver.</p>
<p>Also statt: »Die Umsetzung des Designs erfolgt in zwei Schritten« besser »Wir setzen das Design in zwei Schritten um«. Statt »Beim Start der Programmierung kümmern wir uns gleich schon um die Barrierefreiheit« besser: »Wir programmieren hier gleich barrierefrei und&#8230;« </p>
<h4>Über all Leer zeichen</h4>
<p>Ist irgendwer über die »Photoshop Pinsel« im Absatz oben gestolpert? Hierzulande muss es Photoshop-Pinsel heißen. Denn im Deutschen gibt es keine <a href="http://de.wikipedia.org/wiki/Deppenleerzeichen">Leerzeichen in zusammengesetzten Wörtern</a>. Insofern heißt es E-Mail-Adresse, Firefox-Erweiterung, HTML-Datei und aus einem eingedeutschten CMS wird ein Content-Management-System.</p>
<h4>Weder das Gleiche noch dasselbe</h4>
<p>Und zum Schluss: Es gibt Wörter, die zwar ähnlich klingen, aber unterschiedliches meinen. <a href="http://www.spiegel.de/kultur/zwiebelfisch/0,1518,314582,00.html">Gewöhnt und gewohnt</a> ist so ein Fall.  <a href="http://www.spiegel.de/kultur/zwiebelfisch/0,1518,315125,00.html">Anscheinend und scheinbar</a> ist ein anderes Beispiel. <a href="http://www.spiegel.de/kultur/zwiebelfisch/0,1518,311680,00.html">Flüchten und fliehen</a>. <a href="http://www.spiegel.de/kultur/zwiebelfisch/0,1518,307445,00.html">Wörter und Worte</a>.</p>
<p>Es kann nicht schaden, <a href="http://www.spiegel.de/kultur/zwiebelfisch/0,1518,314650,00.html">ab und zu mal nachzuschlagen</a>, ob der verwendete Begriff tatsächlich das bedeutet, was der Autor aussagen will.</p>
<h4>Siehe auch</h4>
<ul>
<li><a href="http://www.webwriting-magazin.de/guter-stil-klare-sprache-20-handwerkstipps-fuer-einsteiger/">Guter Stil, klare Sprache</a> im Webwriting-Magazin</li>
<li><a href="http://pisto-magazin.de/artikel/flogging-dead-horse">Flogging a dead horse</a> im Pisto-Magazin</li>
</ul>
<h5>Zum Autor</h5>
<p><img id="image125" src="http://www.webkrauts.de/wp-content/uploads/2006/11/nicolai_schwarz_60x60.jpg" alt="Autorenfoto: Nicolai Schwarz" class="bild-links"/>Nicolai Schwarz arbeitet unter dem Namen <a href="http://www.textformer.de">textformer mediendesign</a> als selbstständiger Designer und Webentwickler in Dortmund. Vermutlich sorgt schon der Name dafür, dass er mehr auf Texte achtet als andere Leute. Wobei auch er sich immer freut, wenn jemand bessere Formulierungen für seine Texte finden.</p>
<p>»Gut gebrüllt, Löwe!« steht für: Das ist treffend formuliert. Auch wenn es oft ironisch verwendet wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/23/tipps-fuers-tippen/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Mediengerechte Website-Konzeption</title>
		<link>http://www.webkrauts.de/2009/12/22/mediengerechte-website-konzeption/</link>
		<comments>http://www.webkrauts.de/2009/12/22/mediengerechte-website-konzeption/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 06:00:10 +0000</pubDate>
		<dc:creator>Nils Pooker</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=740</guid>
		<description><![CDATA[<div class="advent advent-22">22. Türchen des Webkrauts-Adventskalenders</div><p>Nachdem Holger Könemann mit seinem Beitrag Anfang Dezember die »Nutzer-zentrierte Konzeption« beschrieben hat, fokussiert Nils Pooker den Blick auf die konzeptionellen Besonderheiten des Mediums Web.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-22">22. Türchen des Webkrauts-Adventskalenders</div>
<p>Immer wieder tauchen in Mailinglisten und Foren Fragen zu Problemen auf, die sich bei einer mediengerechten Konzeption von Webseiten vermeiden ließen. Viele dieser Probleme sind jedoch von Webdesignern hausgemacht.</p>
<p>Da ein Projekt-Workflow nur selten ohne Kundenabsprache möglich ist, können wir nicht von Beginn an mit HTML-Prototypen arbeiten, sondern müssen neben der Strukturierung von Seitenbereichen und -inhalten, Verhaltensweisen und Schnittstellen im Web zusätzlich Kundenwünsche und Designvorgaben berücksichtigen. Mit detaillierten Wireframes und ausgearbeiteten Grafiklayouts sind Annäherungen möglich – diese Lösungen ergeben aber keine Website, bestenfalls können sie Einzelaspekte abbilden. Genau in dieser Phase entstehen die häufigsten Fehler.</p>
<p>Perfide ist das Phänomen »Webdesigner&#039;s Law« bekanntlich bei kleinen und wenig lukrativen Projekten: Eine Winzigkeit nicht bedacht, schon hat man hartnäckige Darstellungs- und Verhaltensfehler bei Mikroaufträgen für gute Bekannte oder dem kleinen Handwerker, die den Stundensatz in den Nanobereich fallen lassen. Medienspezifische Konzeption ist also auch bei kleinen Projekten notwendig.</p>
<h4>In Kategorien des Webs denken</h4>
<p>Ihr könnt Probleme vermeiden, auch ohne immer wieder auf die gleichen Layoutvorlagen zurückzugreifen. Stellt euch bei der Konzeption von Grafiklayouts folgende medienspezifische Fragen, die teilweise auch im Kundengespräch thematisiert werden sollten:</p>
<ul>
<li>Werden unterschiedliche Breiten von Browserfenstern unterstützt?</li>
<li>Bleiben bei Seitenskalierung die Seitenbereiche nutzbar und Hintergrundgrafiken sichtbar?</li>
<li> Gilt das auch für unterschiedliche Schriftgrößen?</li>
<li> Sind die Kontraste für Menschen mit Sehbehinderungen oder mit alten Röhrenmonitoren ausreichend?</li>
<li> Werden sowohl lange als auch kurze Texte mit zusätzlichen Inhalten Platz finden?</li>
<li> Bietet die Navigation optisch Raum für Veränderungen und Erweiterungen?</li>
<li> Kann ich alle formulierten Kundenwünsche angemessen mediengerecht umsetzen?</li>
<li> Entspricht das Layout den zu erwartendem Umfang und der Art gelieferter Kundeninhalte?</li>
<li> Welcher Kundenwunsch könnte das Layout in der Umsetzungsphase ernsthaft gefährden?</li>
<li> Werden die Ladezeiten für große Grafiken angemessen bleiben?</li>
<li> Wo könnten CSS Sprites sinnvoll sein?</li>
<li> Eignet sich das Farbschema für Pseudoklassen und Standortbestimmung in der Navigation?</li>
</ul>
<p>Soll z. B. der Menüpunkt »Kontakt« kurz vor dem Launch in »Ihr Weg zu uns« und »Ihre Nachricht« geändert werden, habt ihr bei einer horizontalen Navigation schnell ein Platzproblem. Ein weiterer Klassiker ist die Darstellung und Positionierung von Logo, Beschriftung und Hintergrundgrafiken in die Kopfzeile eines flexiblen/liquiden Layouts.</p>
<h4>Praxistipp für Grafiklayouts</h4>
<p>Browserfunktionen oder -erweiterungen stehen euch bei der Ausarbeitung eines Grafiklayouts nicht zur Verfügung. Wie sich flexible/liquide Layouts verhalten, könnt ihr zumindest mit zwei verschiedenen Fensterbreiten simulieren. </p>
<div id="attachment_751" class="wp-caption alignleft" style="width: 470px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/medien_konzeption1.jpg" alt="Flexibles Layout, demonstriert durch zwei Breiten" title="medien_konzeption" width="460" height="300" class="size-full wp-image-751" /><p class="wp-caption-text">Flexibles Layout, demonstriert durch zwei Breiten</p></div>
<p>Legt in eurem Grafikprogramm bei kleiner Standardgröße alle Seitenbereiche und Textboxen in separate Ebenen an. Prüft anschließend in einer neuen Datei mit größeren Abmessungen, wie sich die Verschiebungen auf das Layout auswirken sollen. Damit erhalten auch Entwickler mit geringer Gestaltungsaffinität eine optische Hilfestellung für das Schreiben der CSS-Datei.</p>
<h4>Zum Autor</h4>
<p><img id="image299" src="http://www.webkrauts.de/wp-content/uploads/2007/11/nils_pooker.jpg" alt="Nils Pooker" class="bild-links"/>Nils Pooker arbeitete selbstständig im Kunstbereich und ist seit 2001 freier Webdesigner. Als Fachbuchautor hält er Vorträge und schreibt regelmäßig über Kommunikation, Wahrnehmung, Webstandards und Webdesign.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/22/mediengerechte-website-konzeption/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Von Transitionen und Animationen</title>
		<link>http://www.webkrauts.de/2009/12/21/von-transitionen-und-animationen/</link>
		<comments>http://www.webkrauts.de/2009/12/21/von-transitionen-und-animationen/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 06:00:21 +0000</pubDate>
		<dc:creator>Eric Eggert</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=742</guid>
		<description><![CDATA[<div class="advent advent-21">21. Türchen des Webkrauts-Adventskalenders</div><p>Weihnachten, Zeit der Besinnlichkeit, aber auch Zeit der Dekoration. Hinter unserem heutigen Türchen zeigt Eric Eggert wie Webseiten mit Transitionen und Animationen dekoriert werden können.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-21">21. Türchen des Webkrauts-Adventskalenders</div>
<p>Die Vorschläge des Webkit-Teams an das W3C zur Erweiterung des CSS3-Standards sind vielfältig. Kernstück sind <a href="http://www.w3.org/TR/css3-2d-transforms/"><span class="caps">CSS</span> Transforms</a>, <a href="http://www.w3.org/TR/css3-transitions/"><span class="caps">CSS</span> Transitions</a> und <a href="http://www.w3.org/TR/css3-animations/"><span class="caps">CSS</span> Animations</a>. Alle drei&nbsp;Standards befassen sich umfassend mit der Animation von <span class="caps">CSS</span>-Eigenschaften. Im Folgenden stelle ich die grundlegenden Prinzipien vor, die zur <a href="http://www.webkrauts.de/beispiele/advent2009/21-css/">Beispieldatei</a> geführt haben.</p>
<p class="cutting-edge">Achtung! Dieser Artikel behandelt zukünftige Standards, die noch nicht in allen Browsern implementiert sind. Im Artikel benutzen wir die Notation, wie sie vorgeschlagen ist, in den Beispielen werden natürlich Vendor Prefixes genutzt. <strong>Das Beispiel funktioniert momentan nur in Webkit-Browsern, also Safari und Chrome.</strong></p>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/bild11.jpg" alt="Per Transformation gedrehtes Bild" title="Per Transformation gedrehtes Bild" width="270" height="340" class="bild-rechts" /></p>
<h4>Transformationen</h4>
<p>Um Elemente auf der Fläche zu transformieren, gibt es einige neue Attribute; das wichtigste ist wohl das <code>transform</code>-Attribut, das als Werte so genannte Transformationsfunktionen haben kann. So können wir zum Beispiel beliebige Elemente skalieren oder rotieren.</p>
<pre><code>transform:
  rotate(-3deg)
  scale(0.5);</code></pre>
<p>Diese Transformation dreht das Element um -3 Grad und verkleinert es um die Hälfte.</p>
<h4>Transitionen</h4>
<p>Bei Transitionen wird nur definiert, in welcher Art sich <span class="caps">CSS</span>-Eigenschaften verändern sollen, wenn sie geändert werden. Dabei ist die Art der Änderung völlig egal, das kann per JavaScript direkt oder durch das zuweisen einer Klasse sein, per :hover/:focus-Pseudo-Klassen oder durch Veränderungen im Webinspektor. Die Transition interessiert sich dafür nicht.</p>
<p>Syntaxbeispiel: <code>transition: width 1s linear;</code></p>
<p>Die Breite des Elements wird linear animiert, bis die Breite der Breite entspricht, die gerade durch <span class="caps">CSS</span> festgelegt wurde. Wird die Breite von 100 auf 200 gesetzt, wird das Element pro Millisekunde um einen Pixel breiter. Anstatt linearer Animation sind auch die Werte ease (Bis 25% der Animation langsamere Beschleunigung, ab 75% der Animation deutliches abbremsen), ease-in (Bis 42% der Animation beschleunigen), ease-out (Ab 58% der Animation abbremsen), ease-in-out (Bis 42% der Animation beschleunigend, ab 58% der Animation abbremsend) möglich, sowie die Festlegung einer eigenen Animationsart (Beschleunigung und Abbremszeitpunkt sind frei wählbar). Auch Transformierungen können so animiert werden:</p>
<pre><code>a {
	transform: rotate(-3deg) scale (1);
	transition: transform 1.5s linear;
}

a:focus, a:hover, a:active {
	transform: rotate(363deg) scale (1.5);
}</code></pre>
<p>Beim Überfahren mit der Maus dreht sich der Link einmal um die eigene Achse und ist statt nach links nach rechts geneigt. Außerdem wird er 1.5 mal so groß (<a href="http://www.webkrauts.de/beispiele/advent2009/21-css/">Im Beispiel anschauen</a>).</p>
<h4>Animationen</h4>
<p>Die Möglichkeit, Transitionen zu verketten und hintereinander abzurufen, bieten <span class="caps">CSS</span>-Animationen. Man beschreibt inwiefern die Animation angewendet werden soll:</p>
<pre><code>div {
	position:absolute;
	top:10px; left:10px;
	width:50px; height:50px;
	background-color:red;
	animation-name: meine-animation;
	animation-duration: 20s;
	animation-iteration-count: infinite;
}</code></pre>
<p>Auf das <code>div</code> wird die Animation <code>meine-animation</code> angewendet, die an anderer Stelle beschrieben ist. Die Animation soll 20 Sekunden dauern und unendlich oft wiederholt werden.</p>
<pre><code>@keyframes meine-animation {
	from { top:10px; left:10px; }
	25% { top:100px; left:100px; }
	50% { top:10px; left:200px; }
	75% { top:100px; left:300px; }
	to { top:10px; left:400px; }
}</code></pre>
<p>Diese Animation lässt das rote Quadrat über die Seite wandern, am Ende verschwindet das Quadrat und springt wieder an den Anfang. Wird <code>animation-direction:alternate</code> spezifiziert, wandert das Quadrat auf dem gleichen Weg zurück. <code>from</code> und <code>to</code> sind dabei Ausgangs- bzw. Endwerte, die Prozentangaben beziehen sich auf die Zeit in der gesamten Animationsdauer, die ja direkt beim anzusprechenden Element angegeben ist. <a href="http://www.webkrauts.de/beispiele/advent2009/21-css/">Im Beispiel</a> werden Animationen benutzt um Schneeflocken aus Asterisken (aka <a href="http://de.wikipedia.org/wiki/Sternchen_(Schriftzeichen)">Sternchen</a>) zu animieren.</p>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/animation.png" alt="Beispieldokument mit Animationen und Transitionen" title="Beispieldokument mit Animationen und Transitionen" width="450" height="326" class="bild-block" /></p>
<p>Seiten, die bereits Transitionen oder Animationen nutzen:</p>
<ul>
<li><a href="http://forabeautifulweb.com/">For A Beautiful Web</a></li>
<li><a href="http://timvandamme.com/">Tim Van Damme</a></li>
<li><a href="http://analog.coop/">Analog</a></li>
</ul>
<h4>Über den Autor</h4>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/Portrait-square-150x150.jpg" alt="Eric Eggert" title="Eric Eggert" width="70" height="70" class="bild-links" /> Eric Eggert ist freier Webentwickler. Dabei spezialisiert er sich auf sehr gut nutzbare User Interfaces und barrierefreie, standardkonforme Webseiten. Er gibt sich nicht mit dem Status Quo in den Browsern zufrieden sondern erforscht deren Grenzen und reizt ihre Fähigkeiten aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/21/von-transitionen-und-animationen/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Formularfelder richtig beschriften</title>
		<link>http://www.webkrauts.de/2009/12/20/formularfelder-richtig-beschriften/</link>
		<comments>http://www.webkrauts.de/2009/12/20/formularfelder-richtig-beschriften/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 06:00:27 +0000</pubDate>
		<dc:creator>Marco Zehe</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=748</guid>
		<description><![CDATA[<div class="advent advent-20">20. Türchen des Webkrauts-Adventskalenders</div>
<p>Formulare sind neben Links wohl diejenigen Konstrukte, mit denen wir es beim täglichen Surfen und Arbeiten im <span lang="en">Web</span> am häufigsten zu tun aben. Und doch passieren hier bei der Entwicklung viele Fehler. Marco Zehe zeigt in seinem Artikel häufige Fehler und wie diese richtig vermieden werden können.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-20">20. Türchen des Webkrauts-Adventskalenders</div>
<p>Formulare sind neben Links wohl diejenigen Konstrukte, mit denen wir es beim täglichen Surfen und Arbeiten im <span lang="en">Web</span> am häufigsten zu tun haben. Und doch passieren hier bei der Entwicklung viele Fehler. Diese führen dann zu einer eingeschränkten Barrierefreiheit oder anderen Problemen bei der Validierung oder Projektübergabe. Dieser Artikel soll helfen, häufige Fehler zu vermeiden und bietet als Bonus am Ende noch ein bisschen moderne Würze.</p>
<h4>Das label-Element</h4>
<p>Die meisten Formularfelder wie Textfelder, Aufklapplisten oder Kontrollkästchen benötigen eine Beschriftung, damit der Anwender weiß, was er in das jeweilige Feld eintragen oder auswählen muss oder was das Ankreuzen oder Abhaken des Kontrollkästchens bewirkt. In HTML gibt es viele Möglichkeiten, Texte visuell Formularfeldern zuzuordnen. Aber nur eine ist syntaktisch korrekt und führt zu einem positiven Abhaken bei einer Barrierefreiheits-Checkliste. Dies ist das label-Element. Dieses fasst den Text ein, der ein bestimmtes Eingabeelement (input, textarea, select usw.) beschreibt.</p>
<p>Weiterhin muss dieses label-Element das Attribut <em>for</em> enthalten, welches als Wert die ID des Eingabeelements bekommt, welches beschrieben wird. Ein häufiger Fehler hierbei ist, dass dem input-Element statt des id-Attributs das name-Attribut gegeben und dieses dann als Wert für das for-Attribut des label-Elements angegeben wird. Dies ist syntaktisch nicht korrekt.</p>
<p>Ein korrekt codiertes einfaches Adressformular hat diesen Quelltext:</p>
<pre>
<code>
&lt;form action="post.php" method="post"&gt;
&lt;fieldset&gt;&lt;legend&gt;Adressangaben&lt;/legend&gt;&lt;br /&gt;
&lt;label for="vollerName"&gt;Vor- und Zuname:&lt;/label&gt;&lt;input id="vollerName" /&gt;&lt;br /&gt;
&lt;label for="strasse"&gt;Straße&lt;/label&gt; &lt;label for="hausnummer"&gt;und Hausnummer:&lt;/label&gt;&lt;input id="strasse" /&gt; &lt;input id="hausnummer" /&gt;&lt;br /&gt;
&lt;label for="plz"&gt;PLZ:&lt;/label&gt;&lt;input id="plz" maxlength="10" /&gt; &lt;label for="ort"&gt;Ort:&lt;/label&gt;&lt;input id="ort" /&gt;
&lt;/fieldset&gt;
&lt;/form&gt;
</code>
</pre>
<p>Und <a href="http://www.marco-zehe.de/examples/formularbeispiel.html" title="Link zu einem einfachen, nicht funktionalen Beispielformular">so sieht&#039;s aus</a> (noch ohne besonderes Styling).</p>
<ul>
<li>Die erste Zeile innerhalb des Fieldsets ist einfach: Es gibt ein Textfeld für den vollständigen Namen.</li>
<li>In der zweiten Zeile wird die vollständige Bezeichnung der Zeile an den Anfang geschrieben, es wird jedoch explizit auf zwei Textfelder verwiesen, um genau zu definieren, dass in das erste die Straße und in das zweite nur die Hausnummer einzutragen sind.</li>
<li>In der dritten zeile schließlich wird jedes label-Element wieder einem input-Element zugeordnet, und die Elemente wechseln sich ab, stehen lediglich nebeneinander.</li>
</ul>
<p>Dieses <a href="http://www.marco-zehe.de/examples/formularbeispiel.mp3">Hörbeispiel (MP3-Datei)</a> zeigt , wie das Formular von NVDA, Window-Eyes (beide Windows) und VoiceOver (Mac OS X) vorgelesen wird, wenn man mit Tab von Element zu Element springt.</p>
<p>Ein häufiger Fehler ist, dass die Beschreibungen für Straße und Hausnummer in einem Label stehen, welches dann nur dem ersten input-Element zugeordnet wird. Das zweite steht daneben, hat aber keine Bezeichnung. Benutzer von Bildschirmleseprogrammen hören dann für das erste Eingabefeld eine vollständige Bezeichnung und tragen fälschlicherweise sowohl Straße als auch Hausnummer in dieses erste Feld ein, nur um dann festzustellen, dass die Hausnummer eigentlich ins zweite Feld sollte. Im schlimmsten Fall wird ihnen das Fehlen der Hausnummer erst nach dem Abschicken des Formulars mitgeteilt.</p>
<p>Die obigen Richtlinien gelten analog für select- oder textarea-Elemente (z. B. bei durch Aufklapplisten realisierte Geburtstagsangaben).</p>
<h4>Kennzeichnung erforderlicher Felder</h4>
<p>Häufig kommt es vor, dass nicht alle Felder eines Formulares ausgefüllt werden müssen. Entweder kennzeichnet ihr also nun diejenigen Felder, die absolut erforderlich sind, indem ihr ein Wort wie &#034;erforderlich&#034;, ein Sternchen &#034;*&#034; o. ä. der Beschriftung hinzufügt, oder ihr kennzeichnet diejenigen Felder, die nicht absolut erforderlich sind, mit dem Wort &#034;optional&#034;. Gern wird auch für  erforderliche Felder ein anderer Stil (z. B. eine andere Hintergrundfarbe) verwendet, dies funktioniert jedoch nicht für alle Benutzergruppen und sollte daher nur zusätzlich, nicht ausschließlich, verwendet werden.</p>
<p>In neueren Projekten findet man auch häufiger die Verwendung des <a href="http://www.w3.org/TR/wai-aria/"><abbr title="Web Accessibility Initiative - Accessible Rich Internet Applications">WAI-ARIA</abbr></a>-Attributes <em>aria-required</em>, das zusätzlich verwendet werden kann, um erforderliche Felder zu kennzeichnen. Es wird dem jeweiligen input-Element hinzugefügt, und sein Wert wird auf &#034;true&#034; gesetzt. Beispiel: <code>&lt;input id="vollerName" aria-required="true" /&gt;</code>. Aktuelle Versionen von Bildschirmleseprogrammen, wie NVDA 2009.1 oder JAWS 10 und höher, werten dies aus, um von sich aus spezielle Hinweise auf die Erforderlichkeit eines solchen Eingabefeldes zu signalisieren.</p>
<h4>Weiterführende Beschreibungen</h4>
<p>Manchmal kommt es vor, dass  eine Erklärung oder Ergänzung nicht in ein label-Element passt, sondern getrennt von diesem z. B. unterhalb des Eingabefeldes angegeben wird. Ausschließlich durch WAI-ARIA kann auch dieser Text dem input-Element zugewiesen werden und dann von Bildschirmleseprogrammen als zusätzliche Information automatisch gesprochen werden. Ihr geht dazu folgendermaßen vor:</p>
<ol>
<li>Fasst den Text mit der weiterführenden Erklärung in ein Element ein, dem ihr eine ID über das id-Attribut gebt.</li>
<li>Dem eigentlichen input-Element fügt ihr das Attribut <em>aria-describedby</em> hinzu, welches als Wert die im obigen Schritt vergebene ID bekommt.</li>
</ol>
<p><strong>Hinweis</strong>: input-Element steht hier synonym auch für alle weiteren Formularfeldelemente.</p>
<h3>Zum Autor</h3>
<p>Marco Zehe arbeitet für die Mozilla Corporation in der Qualitätssicherung für Barrierefreiheit. Er verfügt über zehn Jahre Erfahrung im Bereich Bildschirmleseprogramme für Blinde und deren Umgang mit Webinhalten. Er ist selbst von Geburt an blind und nutzer solcher Zusatzprogramme.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/20/formularfelder-richtig-beschriften/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
<enclosure url="http://www.marco-zehe.de/examples/formularbeispiel.mp3" length="2330021" type="audio/mpeg" />
		</item>
		<item>
		<title>Inspiration zum Sammeln und Tauschen</title>
		<link>http://www.webkrauts.de/2009/12/19/inspiration/</link>
		<comments>http://www.webkrauts.de/2009/12/19/inspiration/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 06:00:02 +0000</pubDate>
		<dc:creator>Fabian Tempel</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=728</guid>
		<description><![CDATA[<div class="advent advent-19">19. Türchen des Webkrauts-Adventskalenders</div><p>In den eigenen Inspirationsquellen den Überblick bewahren und eine nützliche Sammlung umwandeln: Mit Hilfe von Littlesnapper (Mac) und Ember stellt Fabian Tempel einen möglichen Weg der Aufbereitung vor.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-19">19. Türchen des Webkrauts-Adventskalenders</div>
<p>Wer kennt es nicht, das heillose Durcheinander in der Sammlung von Screenshots, Bookmarks und Best-Practices, nur um sich von der Arbeit Anderer für das eigene Schaffen inspirieren zu lassen. Für Lesezeichen gibt es Social-Bookmarkdienste ala Delicious oder Mister-Wong. Bei der Sammlung an großartigem Webdesign gestaltet sich das Thema schon etwas schwieriger. Zwar gibt es <span class="caps">CSS</span>-Galerien und Showcases wie Sand am Meer, aber der eigenen Ordnung folgen diese zumeist nicht. Das Gesuchte ist oftmals die vielzitierte »Nadel im Heuhaufen«.</p>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/littlesnapper.png" alt="Screenshot Little Snapper" title="Screenshot Little Snapper" width="450" height="289" class="bild-block" /></p>
<p>Abhilfe im kreativen Chaos könnte hier eine Kombination aus <a href="http://www.realmacsoftware.com/littlesnapper/">Littlesnapper</a> und dem Dienst <a href="http://www.emberapp.com">Ember</a> schaffen.</p>
<p>Littlesnapper ist ein Programm, das unter Mac <span class="caps">OSX</span> die Verwaltung von Screenshots einzelner Seiten, oder nur Teilen dieser, erleichtert und durch viele Funktionen auch für die spätere Verwendung aufbereitet. Die wichtigsten Funktionen im Überblick: Die Bilder lassen sich komfortabel in der Seitenleiste mit Kommentaren, einem Stern-Bewertungs-System oder mit Hilfe von Schlagworten aufwerten und sortieren. Auch Ordner und Kollektionen zu speziellen Themen lassen sich einfach anlegen. Ganz von alleine erkennt Littlesnapper, ob es sich dabei um einen Screenshot des Desktops oder einer Webseite oder nur um ein Foto handelt. So lässt sich schnell z.B. eine Sammlung von Bildern zu Farbkombinationen oder zu »Registrierungsformularen« anlegen. Des Weiteren bietet Littlesnapper einen integrierten Browser, eine filterbare Suchfunktion sowie grundlegende Möglichkeiten der Bildbearbeitung. Hinzufügen lassen sich neue Elemente über die Menübar, wo eine Auswahl zwischen verschiedenen Screenshotfunktionen das »Capturen« erleichtert. Entgegen der Mac-eigenen Funktionen können in Littlesnapper ganze Seiten unabhängig von Scrollbalken im Browser gespeichert werden. Hat man seine Inspirationsquellen auf der eigenen Festplatte unter Kontrolle, ist es ein Leichtes, diese entweder bei Flickr oder bei Ember hochzuladen, um diese mit anderen zu teilen oder seinem Team zur Verfügung zu stellen.</p>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/emberapp.png" alt="Screenshot von Ember" title="Screenshot von Ember" width="450" height="318" class="alignright size-full wp-image-732" /></p>
<p>Gerade Ember bietet einen interessanten Ansatz, um von überall auf die eigene Sammlung zugreifen zu können, auch wenn man gerade nicht am eigenen Rechner zu Gange ist. Ember ist im weitesten Sinne ein soziales Netzwerk rund um Bilder, Illustrationen und Screenshots, um zu inspirieren und sich inspirieren zu lassen. Anmelden können sich hier natürlich nicht nur Mac-Besitzer. Allerdings bietet Ember durch die Verbindung mit Littlesnapper ein paar Vorteile. So werden alle Daten zu einem Stück aus der Sammlung beim Upload übernommen und sind somit komplett online verfügbar. Ember bietet alle Funktionen, die ein Onlinedienst heute haben sollte. Die Vernetzung zu Freunden und Kollegen und deren Kollektionen steht dabei im Vordergrund. Zusätzlich zu der eigenen »Sammlung« bietet Ember eine hilfreiche Katalogisierung zu Teilbereichen wie z.B. »Sign Up Forms« , Blogs, Portfolios oder Logo-Design an, um das gesamte Netzwerk nur zu einem Bereich durchsuchen zu können. Der Dienst kann sowohl kostenfrei (mit monatlicher Uploadbeschränkung), als auch in einer Bezahlvariante genutzt werden. Mit dem dazugehörigen App kommen iPhone-Besitzer auch mobil auf ihre Kosten.</p>
<p>Welche Vorteile ergeben sich nun aus der Nutzung beider Tools? Erstens ist es sehr einfach möglich, aus der losen Sammlung eine Art Katalog für Best-Practices zu generieren, und zweitens diese dann Kollegen zur Verfügung zu stellen oder einfach nur von überall auf einen Inspirationspool zugreifen zu können.</p>
<p>Bereits bestehende Sammlungen auf Ember:</p>
<ul>
<li><a href="http://emberapp.com/trilodge/collections/inspiration/">Meine Sammlung</a></li>
<li><a href="http://emberapp.com/stn1978/collections/inspiration/">Stefan Nitzsche</a></li>
<li><a href="http://emberapp.com/pixelgraphix/">Manuela Hoffmann</a></li>
<li><a href="http://emberapp.com/maxvoltar/">Tim Van Damme</a></li>
<li><a href="http://emberapp.com/boagworld/">Paul Boag</a></li>
</ul>
<h4>Autoreninfo</h4>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/Fabian_Tempel-70x70.jpg" alt="" width="70" height="70" class="bild-links" /><a href="http://fabiantempel.trilodge.de">Fabian Tempel</a> arbeitet als Frontend Developer bei Bild digital GmbH &amp; Co. KG in Berlin. Er ist Fan des <span class="caps">CSS</span>-Frameworks <a href="http://www.yaml.de"><span class="caps">YAML</span></a>, Befürworter von <a href="http://en.wikipedia.org/wiki/Progressive_Enhancement">Progressive Enhancement</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/19/inspiration/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Schafe im Schnee</title>
		<link>http://www.webkrauts.de/2009/12/18/schafe-im-schnee/</link>
		<comments>http://www.webkrauts.de/2009/12/18/schafe-im-schnee/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 06:00:56 +0000</pubDate>
		<dc:creator>Sandra Kallmeyer</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=733</guid>
		<description><![CDATA[<div class="advent advent-18">18. Türchen des Webkrauts-Adventskalenders</div><p>Bilder machen jede Webseite schöner, genauso wie Schnee im Winter die Landschaft schöner macht. Doch wenn der Schnee schmilzt oder die Bilder nicht angezeigt werden, kann das ein trostloser Anblick sein. Sandra Kallmeyer zeigt, wie man trotz abgeschalteter Bilder nicht auf Informationen verzichten muss.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-18">18. Türchen des Webkrauts-Adventskalenders</div>
<p>Eine Website muss natürlich auch bei abgeschalteten Bildern lesbar bleiben. Dies wird dann knifflig, wenn Schrift auf einem Bild steht und die Schriftfarbe dieselbe wie die Hintergrundfarbe ist. In den meisten Fällen können wir uns jedoch mit einem kleinen Trick behelfen.</p>
<h4>Die Ausgangssituation</h4>
<p>Nehmen wir als Beispiel einen Text, der in weißer Schrift auf einem Foto steht und dieses wiederum auf weißem Hintergrund.</p>
<div id="attachment_734" class="wp-caption alignright" style="width: 460px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/bild1.jpg" alt="Bild 1: normale Ansicht mit Bildern" title="Bild 1: normale Ansicht mit Bildern" width="450" height="331" class="bild-block" /><p class="wp-caption-text">Bild 1: normale Ansicht mit Bildern</p></div>
<h4>Das Problem</h4>
<p>Schauen wir uns dies nun ohne Bilder an, bleibt etwas übrig, das an die ostfriesische Nationalflagge erinnert, nämlich weiße Schrift auf weißem Grund. Von unserer liebevoll getexteten Bildunterschrift keine Spur. Lediglich der Alternativtext des Bildes ist zu sehen.</p>
<div id="attachment_735" class="wp-caption alignnone" style="width: 460px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/bild2.jpg" alt="Bild 2: Ansicht ohne Bilder" title="Bild 2: Ansicht ohne Bilder" width="450" height="331" class="bild-block" /><p class="wp-caption-text">Bild 2: Ansicht ohne Bilder</p></div>
<p>Wir brauchen also eine Möglichkeit, die Hintergrundfarbe zu ändern, sobald keine Bilder angezeigt werden.</p>
<h4>Die Lösung</h4>
<p>Um die Hintergrundfarbe zu ändern, sobald wir die Bilder abschalten, erzeugen wir die Hintergrundfarbe einfach mit einem Bild. Wir bauen uns in diesem Fall also eine schneeweiße Hintergrundkachel. Wir setzen die eigentliche Hintergrundfarbe auf Schwarz und legen darüber unsere weiße Kachel.</p>
<p><code>background: url(kachel.gif) #000;</code></p>
<p>Schalten wir nun die Bilder ab, verschwindet auch die weiße Kachel, der schwarze Hintergrund wird sichtbar und unsere weiße Schrift ist darauf großartig lesbar!</p>
<div id="attachment_736" class="wp-caption alignnone" style="width: 460px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/bild3.jpg" alt="Bild 3: Ansicht ohne Bilder mit schwarzem Hintergrund" title="Bild 3: Ansicht ohne Bilder mit schwarzem Hintergrund" width="450" height="331" class="size-full wp-image-736" /><p class="wp-caption-text">Bild 3: Ansicht ohne Bilder mit schwarzem Hintergrund</p></div>
<p>Leider ist nun unser Alternativtext „Schafherde im Schnee“ nicht mehr zu sehen. Zum Glück können wir diesem jedoch auch eine Farbe zuweisen, in unserem Beispiel Weiß:</p>
<p><code>img { color: #fff; }</code></p>
<p>Das dürfen wir bedenkenlos tun, weil wir diesen Text sowieso nur bei abgeschalteten Bildern zu sehen bekommen. Das Ergebnis sieht dann so aus:</p>
<div id="attachment_737" class="wp-caption alignnone" style="width: 460px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/bild4.jpg" alt="Bild 4: Ansicht ohne Bilder mit schwarzem Hintergrund und weißem Alternativtext" title="Bild 4: Ansicht ohne Bilder mit schwarzem Hintergrund und weißem Alternativtext" width="450" height="331" class="bild-block" /><p class="wp-caption-text">Bild 4: Ansicht ohne Bilder mit schwarzem Hintergrund und weißem Alternativtext</p></div>
<p>Da so viel Schwarz ziemlich trüb wirkt, können hier noch kreativ werden und stattdessen für unsere Schafe ein saftiges Grün wählen. Wir müssen dabei nur sicher stellen, dass der Kontrast zur Schriftfarbe noch ausreicht, z.B. mit der <a href="https://addons.mozilla.org/en-US/firefox/addon/9108">Juicy Studio Accessibility Toolbar</a>.</p>
<p>Wer mag, kann sich am Alternativtext bei der Gelegenheit auch noch typografisch austoben, um die bilderlose Ansicht ein wenig aufzupeppen:</p>
<p><code>img { font: italic small-caps bold 2em/5 Georgia, serif; color: #fff; }</code></p>
<p>Nicht alle Angaben werden von allen Browsern interpretiert. Das macht aber nichts, da dies ja nur dazu dient, alles ein wenig hübscher zu machen. Im Firefox 3.5 schaut <a href="http://www.webkrauts.de/beispiele/advent2009/21/">das fertige Beispiel</a> so aus:</p>
<div id="attachment_738" class="wp-caption alignnone" style="width: 460px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/bild5.jpg" alt="Bild 5: Ansicht ohne Bilder mit grünem Hintergrund" title="Bild 5: Ansicht ohne Bilder mit grünem Hintergrund" width="450" height="331" class="bild-block" /><p class="wp-caption-text">Bild 5: Ansicht ohne Bilder mit grünem Hintergrund</p></div>
<p>Wir merken uns: bei weißem Schaf auf weißem Grund: Schneedecke abtauen, Wiese sichtbar machen! <img src='http://www.webkrauts.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Viel Spaß beim Ausprobieren!</p>
<h4>Über die Autorin</h4>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/screenorigami-hut.jpg" alt="Sandra Kallmeyer" title="Sandra Kallmeyer" width="70" height="70" class="bild-links" /> Sandra Kallmeyer alias <a href="http://www.screenorigami.com/">ScreenOrigami</a> ist in einem Netzwerk aus Freelancern und Agenturen die Spezialistin für standardkonforme Umsetzung von Webdesigns.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/18/schafe-im-schnee/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Webinhalte einfach vermischen mit YQL</title>
		<link>http://www.webkrauts.de/2009/12/17/webinhalte-einfach-vermischen-mit-yql/</link>
		<comments>http://www.webkrauts.de/2009/12/17/webinhalte-einfach-vermischen-mit-yql/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 06:00:43 +0000</pubDate>
		<dc:creator>Christian Heilmann</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=671</guid>
		<description><![CDATA[<div class="advent advent-17">17. Türchen des Webkrauts-Adventskalenders</div>
<p>Das Netz stellt uns die unterschiedlichsten Informationen zur Verfügung. Wir müssen nur zugreifen und sie für unsere eigenen Ziele zusammenstellen. Christian Heilmann zeigt heute, wie wir mit YQL recht einfach verschiedene APIs abfragen und ihre Antworten sinnvoll aufbereiten können.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-17">17. Türchen des Webkrauts-Adventskalenders</div>
<p>Es ist verbl&uuml;ffend, wieviele Angebote es im Internet gibt, die einem als  Entwickler die Arbeit erleichtern. Flickr speichert Terabytes von Fotos und verkleinert diese automatisch in verschiedene handliche Formate. Flickr erkennt auch Personen in den Fotos, erlaubt es, Fotos geographisch zu platzieren und sogar online zu ver&auml;ndern. YouTube macht &Auml;hnliches mit Videos; LinkedIn oder Xing erlauben seinen Lebenslauf im Netz zu pflegen, Delicious verwaltet Favoriten und so weiter und so fort.</p>
<p>Alle diese Arbeiten m&uuml;ssen wir nicht mehr von Hand erledigen, da alle diese Angebote uns mittels <span lang="en">Application Programming Interfaces</span> &#8211; oder kurz APIs &#8211; Zugriff auf unsere Daten erlauben. Eine API funktioniert, indem wir mittels Parametern bestimmte Daten anfordern und in verschiedenen Formaten zur&uuml;ck bekommen.</p>
<p>Das Problem dabei ist, dass jeder API-Anbieter eine andere Idee davon hat, was denn sinnvolle Parameter und Datenformate sind. Mehrere APIs in einem Produkt zu verwenden, wird damit zu einem Problem, da man sich mehr damit besch&auml;ftigt, Dokumentationen zu lesen als zu programmieren.</p>
<h4>Ein einfacherer Zugang zu APIs</h4>
<p>Was wir als Entwicker brauchen sind Bibliotheken und Systeme, die unsere Arbeit erleichtern. Bibliotheken wie <a href="http://jquery.com">jQuery</a> und <a href="http://developer.yahoo.com/yui">YUI</a> machen Webdesign einfacher, da sie Browserprobleme und Fehler beheben und es uns erlauben, uns auf das Programmieren zu konzentrieren anstatt f&uuml;r den Browser zu arbeiten. Genau das gleiche Prinzip steckt hinter der <a href="http://developer.yahoo.com/yql" lang="en">Yahoo Query Language</a> oder YQL. YQL erlaubt es einem, APIs und Daten im Netz in einer einfachen und einheitlichen Sprache zu erreichen und weiter zu verwenden. Die Syntax dieser Sprache ist &auml;hnlich wie die Datenbanksprache SQL.</p>
<h4>Select * from web (und gib mir nur zur&uuml;ck, was ich wirklich brauche)</h4>
<p>YQL ist ein Web-Service der nur ein paar einfache Eingabeparameter erwartet:</p>
<ul>
<li>Eine Datenanfrage (query) die angibt, welche API man ansprechen will</li>
<li>Das Ausgabeformat, was XML oder JSON (mit den Unterformaten JSON-P und JSON-P-X) sein kann und</li>
<li>Den Namen einer Funktion, die aufgerufen werden soll, wenn die Daten geladen sind (nur f&uuml;r JSON-P oder JSON-P-X sinnvoll).</li>
</ul>
<p>Am einfachsten ist es, YQL mal auszuprobieren. Eine Anfrage wie <code>select * from flickr.photos.search where text="santa"</code> geht zu Flickr und sucht nach Fotos mit dem Text »Santa«. Diese Anfrage an den Datenendpunkt von YQL geschickt und <a href="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20flickr.photos.search%20where%20text%3D%22santa%22&#038;format=xml">gibt uns die Daten der Fotos als XML</a>.</p>
<p>Um die Arbeit mit YQL ganz einfach zu gestalten, gibt es eine <a href="http://developer.yahoo.com/yql">Konsole</a>. In diesem Interface kann man Beispielsanfragen sehen, alle Datenquellen abfragen und erfahren, welche Art von Daten erh&auml;ltlich sind und komplexe Anfragen einfach zusammenklicken. In diesem Artikel will ich allerdings aufzeigen, dass die Konsole zwar praktisch ist, aber nicht unbedingt n&ouml;tig. Wir können die gleichen Ergebnisse mit PHP erzielen.</p>
<p>Als Beispiel wollen wir eine kleine Seite erstellen, die alle m&ouml;glichen Daten einer Person aus dem Netz holt und in einem Interface darstellt. Die Daten sind Fotos von Flickr, Videos von YouTube, Blogeintr&auml;ge und Favoriten von Delicious.</p>
<p><a href="http://isithackday.com/24ways2009/">Die Seite ist hier zu sehen</a>, und <a href="http://github.com/codepo8/24-ways-2009/blob/master/index.php">der Quellcode ist auf GitHub erh&auml;ltlich</a>.</p>
<pre><code>&lt;?php
  /* YouTube RSS Ausgabe */
  $query = &#x27;select description from rss(5) where url=&quot; <b>»</b>
     http://gdata.youtube.com/feeds/base/users/ <b>»</b>
     chrisheilmann/uploads?alt=rss&amp;v=2 <b>»</b>
     &amp;orderby=published&amp;client=ytapi-youtube-profile&quot;;&#x27;;

  /* Flickr Suche nach user id */
  $query .= &#x27;select farm,id,owner,secret,server,title from <b>»</b>
     flickr.photos.search where user_id=&quot;11414938@N00&quot;;&#x27;;

  /* Delicious RSS Ausgabe */
  $query .= &#x27;select title,link from rss where url=&quot; <b>»</b>

http://feeds.delicious.com/v2/rss/codepo8?count=10&quot;;&#x27;;

  /* Blog RSS Ausgabe */
  $query .= &#x27;select title,link from rss where url=&quot; <b>»</b>

http://feeds.feedburner.com/wait-till-i/gwZf&quot;&#x27;;

  /* Der Datenendpunkt von YQL mit JSON als Ausgabeformat */
  $root = &#x27;http://query.yahooapis.com/v1/public/yql <b>»</b>
     ?format=json <b>»</b>
     &amp;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&#x27;;

  /* Zusammenf&uuml;gung der Anfrage */
  $query = &quot;select * from query.multi where  <b>»</b>
     queries=&#x27;&quot;.$query.&quot;&#x27;&quot;;
  $url = $root . &#x27;&amp;q=&#x27; . urlencode($query);

  /*
    Eine Anfrage mittels cURL ist genau das gleiche wie die
    Daten in einem Browser einzugeben. cURL l&auml;dt die
    Daten und gibt sie zur&uuml;ck.
  */
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($ch);
  curl_close($ch);
  $data = json_decode($output);
  $results = $data-&gt;query-&gt;results-&gt;results;

  /* YouTube HTML */
  $youtube = &#x27;&lt;ul id=&quot;youtube&quot;&gt;&#x27;;
  foreach($results[0]-&gt;item as $r){
    $cleanHTML = undoYouTubeMarkupCrimes($r-&gt;description);
    $youtube .= &#x27;&lt;li&gt;&#x27;.$cleanHTML.&#x27;&lt;/li&gt;&#x27;;
  }
  $youtube .= &#x27;&lt;/ul&gt;&#x27;;

  /* Flickr HTML */
  $flickr = &#x27;&lt;ul id=&quot;flickr&quot;&gt;&#x27;;
  foreach($results[1]-&gt;photo as $r){
    $flickr .= &#x27;&lt;li&gt;&#x27;.
       &#x27;&lt;a href=&quot;http://www.flickr.com/photos/codepo8/&#x27;.
       $r-&gt;id.&#x27;/&quot;&gt;&#x27;.
       &#x27;&lt;img src=&quot;http://farm&#x27; . $r-&gt;farm .
       &#x27;.static.flickr.com/&#x27; . $r-&gt;server . &#x27;/&#x27; .
       $r-&gt;id . &#x27;_&#x27; . $r-&gt;secret . &#x27;_s.jpg&quot;
       alt=&quot;&#x27;.$r-&gt;title.&#x27;&quot;&gt;&lt;/a&gt;&lt;/li&gt;&#x27;;
  }
  $flickr .= &#x27;&lt;/ul&gt;&#x27;;

  /* Delicious HTML */
  $delicious = &#x27;&lt;ul id=&quot;delicious&quot;&gt;&#x27;;
  foreach($results[2]-&gt;item as $r){
    $delicious .= &#x27;&lt;li&gt;&lt;a href=&quot;&#x27;.$r-&gt;link.&#x27;&quot;&gt;&#x27;.$r-&gt;title.&#x27;
       &lt;/a&gt;&lt;/li&gt;&#x27;;
  }
  $delicious .= &#x27;&lt;/ul&gt;&#x27;;

  /* Blog HTML */
  $blog = &#x27;&lt;ul id=&quot;blog&quot;&gt;&#x27;;
  foreach($results[3]-&gt;item as $r){
    $blog .= &#x27;&lt;li&gt;&lt;a href=&quot;&#x27;.$r-&gt;link.&#x27;&quot;&gt;&#x27;.$r-&gt;title.
       &#x27;&lt;/a&gt;&lt;/li&gt;&#x27;;
  }
  $blog .= &#x27;&lt;/ul&gt;&#x27;;

  /* Layout Tabellen in 2009? Echt, Google??? */
  function undoYouTubeMarkupCrimes($str){
    $cleaner = preg_replace(&#x27;/555px/&#x27;,&#x27;100%&#x27;,$str);
    $cleaner = preg_replace(&#x27;/width=&quot;[^&quot;]+&quot;/&#x27;,&#x27;&#x27;,$cleaner);
    $cleaner = preg_replace(&#x27;/&lt;tbody&gt;/&#x27;,&#x27;&lt;colgroup&gt;&lt;col  <b>»</b>
       width=&quot;20%&quot;&gt;&lt;col width=&quot;50%&quot;&gt;&lt;col width=&quot;30%&quot;&gt;  <b>»</b>
       &lt;/colgroup&gt;&lt;tbody&gt;&#x27;,$cleaner);
    return $cleaner;
  }
?&gt;</code></pre>
<p>Ziemlich einfach, eigentlich. Alles, was wir hier machen, sind verschiedene YQL-Anfragen zu erstellen und mittels der <code>query.multi</code>-Tabelle als eine einzelne Anfrage an YQL zu schicken. Jede dieser Anfragen ist auch einzeln in YQL m&ouml;glich. Die folgenden Links &ouml;ffnen die einzelnen Anfragen in der YQL Konsole:</p>
<ul>
<li><a href="http://developer.yahoo.com/yql/console/?q=select%20description%20from%20rss%285%29%20where%20url%3D%22http%3A%2F%2Fgdata.youtube.com%2Ffeeds%2Fbase%2Fusers%2Fchrisheilmann%2Fuploads%3Falt%3Drss%26v%3D2%26orderby%3Dpublished%26client%3Dytapi-youtube-profile%22&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys">YouTube</a></li>
<li><a href="http://developer.yahoo.com/yql/console/?q=select%20farm%2Cid%2Cowner%2Csecret%2Cserver%2Ctitle%20from%20flickr.photos.search%20where%20user_id%3D%2211414938%40N00%22&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys">Flickr</a></li>
<li><a href="http://developer.yahoo.com/yql/console/?q=select%20title%2Clink%20from%20rss%20where%20url%3D%22http%3A%2F%2Ffeeds.delicious.com%2Fv2%2Frss%2Fcodepo8%3Fcount%3D10%22&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys">Delicous</a></li>
<li><a href="http://developer.yahoo.com/yql/console/?q=select%20title%2Clink%20from%20rss%20where%20url%3D%22http%3A%2F%2Ffeeds.feedburner.com%2Fwait-till-i%2FgwZf%22&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys">Blog</a></li>
</ul>
<p>Der Vorteil der <code>query.multi</code>-Anfrage ist, dass wir nur eine Datenanfrage an YQL schicken und der Rest der Anfragen an die verschiedenen Datenquellen erfolgt auf der YQL-Serverfarm. Da diese schneller im Netz unterwegs ist als unser Server, bedeutet das, dass unsere Seite schneller l&auml;dt und damit gl&uuml;cklichere Endnutzer hat. </p>
<p>Wir schicken unsere Anfrage an den YQL-Endpunkt und verwenden cURL, um die Daten zu laden. Einfach gesagt ist cURL ein Browser in PHP &#8211; wir können alles das, was wir im Browser laden, von einem Programm aus erledigen. Nach einer erfolgreichen Abfrage gibt uns cURL die Daten als JSON zur&uuml;ck und mittels <code>json_decode</code> k&ouml;nnen wir diese in ein PHP verst&auml;ndliches Format bringen.</p>
<p>Alles, was wir dann noch machen m&uuml;ssen, ist die Daten in ein sinnvolles HTML-Format zu bringen und in einem Template anzuzeigen. Fertig.</p>
<h4>Mehrere Datenquellen vermischen und HTML als Datenquelle</h4>
<p>Das erste Beispiel war relativ einfach, da die meiste Arbeit von uns in PHP erledigt wurde. Richtig interessant wird YQL allerdings, wenn wir in einer Anfrage mehrere APIs und Datenquellen vermischen. Als Beispiel werden wir nun die neuesten Nachrichten der BBC Webseite abrufen und aus den Titeln Schl&uuml;sselw&ouml;rter erstellen. Dadurch kann man eine Liste von derzeit interessanten »Hot Topics« erstellen.</p>
<p>Um das zu erreichen brauchen wir zwei Datentabellen in YQL: Die HTML-Tabelle, die es erlaubt HTML von Seiten zu laden und per XPATH auf das Notwendigste zu reduzieren, und die <a href="http://developer.yahoo.com/search/content/V1/termExtraction.html">Yahoo Term Extractor API</a> (eine API die aus Texten Schl&uuml;sselw&ouml;rter extrahiert). Um mehrere APIs in YQL zu verwenden, müssen wir den <code>in()</code> Befehl aufrufen:</p>
<pre><code>select * from search.termextract where context in (
  select content from html where url="http://news.bbc.co.uk"  <b>»</b>
     and xpath="//table[@width=800]//a"
)</code></pre>
<p>Hier kann man <a href="http://developer.yahoo.com/yql/console/?q=select%20*%20from%20search.termextract%20where%20context%20in%20%28select%20content%20from%20html%20where%20url%3D%22http%3A%2F%2Fnews.bbc.co.uk%22%20and%20xpath%3D%22%2F%2Ftable[%40width%3D800]%2F%2Fa%22%29&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys">die Abfrage in der Konsole</a> sehen und <a href="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20search.termextract%20where%20context%20in%20%28select%20content%20from%20html%20where%20url%3D%22http%3A%2F%2Fnews.bbc.co.uk%22%20and%20xpath%3D%22%2F%2Ftable[%40width%3D800]%2F%2Fa%22%29&#038;format=xml">die Ergebnisse der Abfrage</a> sind auch erh&auml;ltlich. Auf Deutsch bedeutet die Anfrage:</p>
<ol>
<li>Gehe nach <code>http://news.bbc.co.uk</code> und gib mir das HTML zur&uuml;ck</li>
<li>Konvertiere das HTML mit HTMLTidy um eventuelle Markup-Probleme zu beheben</li>
<li>Gib mir alle Links innerhalb der Tabelle mit einem <code>width</code>-Attribut und einem Wert von <code>800</code></li>
<li>Extrahiere den Textinhalt (<code>content</code>) der inviduellen Links und schicke den Textinhalt als <code>context</code> an die Yahoo Term Extractor API.</li>
</ol>
<p>Wenn wir JSON-P als Ausgabeformat verlangen, k&ouml;nnen wir das Ergebnis der Anfrage direkt in JavaScript weiterverwenden (<a href="http://isithackday.com/24ways2009/hottopics.html">hier zu sehen</a> und <a href="http://github.com/codepo8/24-ways-2009/blob/master/hottopics.html">hier als Quellcode</a>):</p>
<pre><code>&lt;ul id=&quot;hottopics&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function hottopics(o){
  var res = o.query.results.Result,
      all = res.length,
      topics = {},
      out = [],
      html = &#x27;&#x27;,
      i=0;
  /* create hash from topics to prevent repetition */
  for(i=0;i&lt;all;i++){
    topics[res[i]] = res[i];
  };
  for(i in topics){
    out.push(i);
  };
  html = &#x27;&lt;li&gt;&#x27; + out.join(&#x27;&lt;/li&gt;&lt;li&gt;&#x27;) + &#x27;&lt;/li&gt;&#x27;;
  document.getElementById(&#x27;hottopics&#x27;).innerHTML = html;
};
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;  <b>»</b>
http://query.yahooapis.com/v1/public/yql?q=select  <b>»</b>
%20content%20from%20search.termextract%20where%20context  <b>»</b>
%20in%20(select%20content%20from%20html%20where%20url%3D  <b>»</b>
%22http%3A%2F%2Fnews.bbc.co.uk%22%20and%20xpath%3D%22%2F%2F  <b>»</b>
table%5B%40width%3D800%5D%2F%2Fa%22)&amp;format=json&amp;  <b>»</b>
callback=hottopics&quot;&gt;&lt;/script&gt;</code></pre>
<p>Nat&uuml;rlich kann man JSON auch in PHP verwenden, was bedeutet, dass jeder Besucher die »Hot Topics« sehen kann und nicht nur die, die JavaScript verwenden k&ouml;nnen (<a href="http://isithackday.com/24ways2009/hottopics.php">Beispiel hier</a> und <a href="http://github.com/codepo8/24-ways-2009/blob/master/hottopics.php">Quellcode bei GitHub</a>):</p>
<pre><code>&lt;ul id=&quot;hottopics&quot;&gt;&lt;li&gt;
&lt;?php
$url = &#x27;http://query.yahooapis.com/v1/public/yql?q=select&#x27;.
       &#x27;%20content%20from%20search.termextract%20where&#x27;.
       &#x27;%20context%20in%20(select%20content%20from%20html&#x27;.
       &#x27;%20where%20url%3D%22http%3A%2F%2Fnews.bbc.co.uk%22&#x27;.
       &#x27;%20and%20xpath%3D%22%2F%2Ftable%5B%40width%3D800%5D&#x27;.
       &#x27;%2F%2Fa%22)&amp;format=json&#x27;;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
curl_close($ch);
$data = json_decode($output);
$topics = array_unique($data-&gt;query-&gt;results-&gt;Result);
echo join(&#x27;&lt;/li&gt;&lt;li&gt;&#x27;,$topics);
?&gt;
&lt;/li&gt;&lt;/ul&gt;</code></pre>
<h4>Zusammenfassung</h4>
<p>Dieser Artikel kann aufgrund seiner L&auml;nge nur einen Bruchteil davon aufzeigen, was YQL einem Entwickler erm&ouml;glicht. Durch YQL kann man nicht nur APIs lesen, sondern auch schreiben. Wir können zum Beispiel <a href="https://developer.yahoo.com/yql/console/?q=use%20%27http%3A%2F%2Fwww.yqlblog.net%2Fsamples%2Ftwitter.status.xml%27%3B%20insert%20into%20twitter.status%20%28status%2Cusername%2Cpassword%29%20values%20%28%22Playing%20with%20INSERT%20UPDATE%20and%20DELETE%20in%20YQL%22%2C%20%22twitterusername%22%2C%22twitterpassword%22%29">Twitter updates verschicken</a>, <a href="http://developer.yahoo.com/yql/console/?q=insert%20into%20wordpress.post%20%28title%2C%20description%2C%20blogurl%2C%20username%2C%20password%29%20values%20%28%22Test%20Title%22%2C%20%22This%20is%20a%20test%20body%22%2C%20%22http%3A%2F%2Fyqltest.wordpress.com%22%2C%20%22yqltest%22%2C%20%22password%22%29&#038;env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys">neue Artikel in WordPress Blogs einpflegen</a> oder <a href="https://developer.yahoo.com/yql/console/?q=USE%20%22http%3A%2F%2Fwww.yqlblog.net%2Fsamples%2Fbitly.shorten.xml%22%3B%20INSERT%20INTO%20bitly.shorten%20%28login%2C%20apiKey%2C%20longUrl%29%20VALUES%20%28%27YOUR_LOGIN%27%2C%20%27YOUR_API_KEY%27%2C%20%27http%3A%2F%2Fyahoo.com%27%29">eine Webadresse mit bit.ly verk&uuml;rzen</a>. Mittels <a href="http://developer.yahoo.com/yql/guide/yql-opentables-chapter.html">Open Tables</a> können wir jeden Datenendpunkt im Netz zu YQL hinzuf&uuml;gen und <a href="http://developer.yahoo.com/yql/guide/yql-execute-chapter.html">JavaScript auf dem Server ausf&uuml;hren</a>, was zum Beispiel sehr sinnvoll ist, um <a href="http://www.wait-till-i.com/2009/11/02/getting-a-list-of-flickr-photos-by-location-andor-search-term-with-a-yql-open-table/">Flickr-Fotos als HTML zu erhalten</a> oder <a href="http://www.wait-till-i.com/2009/11/16/using-yql-to-read-html-from-a-document-that-requires-post-data/">HTML-Inhalte von Seiten zu lesen, die POST-Daten ben&ouml;tigen</a>.</p>
<p>Das Web der Daten ist hier und YQL erlaubt es jedem teilzunehmen &#8211; nicht nur den Webservice-Experten.</p>
<h4>Anmerkung der Redaktion</h4>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2007/12/zz5f8167c1.png"  lang="en" alt="24 ways to impress your friends" class="bild-rechts" />Dieser Artikel ist die deutsche Übersetzung von <a href="http://24ways.org/200917">Christians Beitrag</a> für die Seite <a href="http://24ways.org/">24ways</a>. Dieser Adventskalender bietet noch viele weitere interessante Beiträge, alle in englischer Sprache.</p>
<h4>Zum Autor:</h4>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2006/12/cheilmann.jpg" alt="Autorenfoto: Christian Heilmann" class="bild-links" /><a href="http://icant.co.uk">Christian Heilmann</a> arbeitet als Developer Evangelist bei Yahoo! in London, England. Er trägt überall auf der Welt auf Konferenzen vor, und <a href="http://wait-till-i.com">bloggt</a> unter andere darüber. Zuletzt veröffentlichte er sein <a href="http://developer-evangelism.com/">Handbuch für Developer Evangelists</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/17/webinhalte-einfach-vermischen-mit-yql/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Standardkonforme Photoshop-Slices</title>
		<link>http://www.webkrauts.de/2009/12/16/photoshop-slices/</link>
		<comments>http://www.webkrauts.de/2009/12/16/photoshop-slices/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 06:00:06 +0000</pubDate>
		<dc:creator>Maxx Hilberer</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=718</guid>
		<description><![CDATA[<div class="advent advent-16">16. Türchen des Webkrauts-Adventskalenders</div>
<p>Der Export von Photoshop-Slices ist vielen Webdesignern als Relikt tabellenbasierter Layouts bekannt. Maxx Hilberer zeigt, wie man diese Funktion elegant und standardkonform nutzen kann.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-16">16. Türchen des Webkrauts-Adventskalenders</div>
<p>Wenn ein Layout für eine Webseite mit Photoshop erstellt und vom Kunden abgenommen wurde, beginnt ein Arbeitsschritt, der es mitunter in sich haben kann &ndash; was man meist aber erst später festellt: Der Export der einzelnen Bestandteile.</p>
<p>Dafür wird das gesamte Bild erstmal in sog. Slices aufgeteilt, wobei diese jeden einzelnen Bestandteil, bzw. Region der späteren Seite darstellen. Diese Slices können sowohl Bilder, als auch Text beinhalten.<br />
Ein Text kann direkt in das Textfeld des Slice-Optionen-Fensters eingeben werden.</p>
<p>An dieser Stelle behelfen wir uns mit einem kleinen Trick, um die Standardkonformität zu 100 Prozent zu gewährleisten und fügen ein Paragraph-Tag ein und schließen es am Ende wieder, da Photoshop nur DIVs als Container-Form kennt.</p>
<div id="attachment_720" class="wp-caption alignleft" style="width: 470px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/slice_options-460x287.jpg" alt="Slice Options" title="slice_options" width="460" height="287" class="size-medium wp-image-720" /><p class="wp-caption-text">Slice Options</p></div>
<p>Bei den Slice-Optionen eines Bild-Slices ist eigentlich nur die Benennung wichtig: Voreingestellt ist ein Namensmix aus Dateiname des Layouts und der fortlaufenden Slice Nummerierung, die Photoshop von oben links nach unten rechts verteilt.</p>
<p>Schritt 2 ist dann der eigentliche Export aus Photoshop nach HTML und CSS: »Datei &#8211; für Web speichern«</p>
<p>Nachdem das Dateiformat der Bilder ausgewählt wurde (JPEG, GIF oder PNG), kommt der spannendste Teil des gesamten Prozederes: »Speichern«, Dateityp: »HTML und Bilder«</p>
<p>Wichtigster Bestandteil des nun erscheinenden Kontextmenus ist der Punkt »Einstellungen«.<br />
Hier legt man die wichtigsten Eigenschaften der zukünftigen (Web-)Struktur fest, beginnend mit »Andere« im Auswahlmenü, falls man noch keine Einstellungen (»Eigene«) gespeichert hat.</p>
<p>Insgesamt befinden sich vier Optionen im Dropdown unter den Einstellungen:</p>
<div id="attachment_721" class="wp-caption alignleft" style="width: 470px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/output_settings-460x427.jpg" alt="Vier Optionen bei den Einstellungen" title="output_settings" width="460" height="427" class="size-medium wp-image-721" /><p class="wp-caption-text">Vier Optionen bei den Einstellungen</p></div>
<ul>
<li>»Datei speichern«: Dateibenennung festlegen und den Bildern einen Ordner wie »img«, »images« oder »Bilder« zuweisen.</li>
<li>»HTML«: hier gibt es einige kleine aber feine Möglichkeiten den Output zu steuern, wie Code Einrückungen und die Wahl zwischen ISO 8859-1 und UTF-8, welches mittlerweile als Standard gelten dürfte.</li>
<li>»Hintergrund«: Pfad zu einem HG Bild</li>
<li>»Slices«: zwischen Tabellen und DIVs wählen. Hier fällt sicherlich die Wahl meist auch nicht so schwer&#8230; <img src='http://www.webkrauts.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<p>Beim Slices Unterpunkt »CSS generieren« kann man wählen, ob IDs, Klassen oder Inline-Styles generiert werden sollen. Auch das ist keine große Frage: Ein globales Layout beschränkt sich ja meist nur auf die wesentlichen Bestandteile einer Site, also IDs.</p>
<p>An dieser Stelle findet sich leider der einzige Punkt, der spätere Nacharbeit erfordert, weil hier lediglich numerische Namensgebung wie »#1« usw. möglich ist.</p>
<p>Fertig und los.</p>
<p>Die Styles landen jetzt erstmal im Kopf des HTML Dokuments. Man braucht sie hier nur ausschneiden und in eine separate CSS-Datei kopieren, verlinken und fertig ist ein validierendes Webdokument.</p>
<h4>Über den Autor</h4>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2008/07/maxx_hilberer_60x60.jpg" alt="Autorenfoto: Maxx Hilberer" title="Autorenfoto: Maxx Hilberer" class="bild-links" width="60" height="60"/> <a href="http://monozellen.de">Maxx Hilberer</a> arbeitet seit 2001 als Webdesigner; seit 2004 in eigener Regie für Agenturen und Endkunden. Bei seiner Arbeit belegen Standardkonformität und ein hohes Maß an Nutzbarkeit und Zugänglichkeit stets die vordersten Startpositionen auf den virtuellen Parcours des <span class="caps">WWW</span>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/16/photoshop-slices/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Kürzere Ladezeiten durch CSS-Sprites</title>
		<link>http://www.webkrauts.de/2009/12/15/kuerzere-ladezeiten-durch-css-sprites/</link>
		<comments>http://www.webkrauts.de/2009/12/15/kuerzere-ladezeiten-durch-css-sprites/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 06:00:10 +0000</pubDate>
		<dc:creator>Tobias Otte</dc:creator>
				<category><![CDATA[Adventskalender 2009]]></category>

		<guid isPermaLink="false">http://www.webkrauts.de/?p=713</guid>
		<description><![CDATA[<div class="advent advent-15">15. Türchen des Webkrauts-Adventskalenders</div>
<p>Heute schrauben wir an der Performance: CSS-Sprite sind vor allem durch Hover-Effekte bekannt geworden, helfen aber auch dabei, die Anzahl an HTTP-Request zu verringern. Tobias Otte zeigt, wie es geht.</p>]]></description>
			<content:encoded><![CDATA[<div class="advent advent-15">15. Türchen des Webkrauts-Adventskalenders</div>
<p>Sprites sind eine CSS-Technik die bislang eher für <a href="http://www.webkrauts.de/2007/10/20/hovereffekte-mit-css-sprites/">Hovereffekte</a>, in den letzten Jahren aber mehr und mehr zur Verkürzung der Ladezeiten einer Website genutzt werden. Sie reduzieren die Anzahl der benötigen HTTP-Requests, was wiederum der Performance der Seite zugute kommt. Anstelle von vielen verschiedenen Grafiken, die einzeln auf einer Seite eingebunden werden, kombiniert der Entwickler möglichst viele in einer Datei. Diese wird dann mit der CSS-Eigenschaft <code>background-position</code> an die gewünschte Position »verschoben«.</p>
<h4>Zwei Beispiele</h4>
<div id="attachment_714" class="wp-caption alignleft" style="width: 470px"><a href="http://www.webkrauts.de/wp-content/uploads/2009/12/fb_gross.png"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/fb_gross-460x197.png" alt="CSS-Sprite von Facebook" title="fb_gross" width="460" height="197" class="size-medium wp-image-714" /></a><p class="wp-caption-text">CSS-Sprite von Facebook</p></div>
<div id="attachment_715" class="wp-caption alignleft" style="width: 174px"><img src="http://www.webkrauts.de/wp-content/uploads/2009/12/google.png" alt="CSS-Sprite von Google" title="google" width="164" height="106" class="size-full wp-image-715" /><p class="wp-caption-text">CSS-Sprite von Google</p></div>
<h4>Warum verbessert das die Performance?</h4>
<p>Nun, der Flaschenhals der Ladezeiten ist, dank der fast flächendeckenden Verbreitung von DSL-Anschlüssen, über die letzten Jahre weg von der Übertragungsgeschwindigkeit hin zu der Anzahl an HTTP-Requests gewechselt. Der Grund hierfür ist, dass bei jedem Request wertvolle Zeit für das Senden von Metadaten und die Latenzzeiten der Webserver verloren geht. Wenn wir nun die Gesamtanzahl der Request verringern, wobei die Grafiken meist einen Großteil davon ausmachen, verbessert sich auch die Performance.</p>
<h4>Wie baue ich mein Sprite auf?</h4>
<p>Natürlich ist es, gerade bei größeren Projekten, unsinnig alle verwendete Grafiken in eine Datei zusammen zufügen. Es gibt verschiedene Faktoren, welche Grafik überhaupt und in welcher Art von Sprite gesetzt werden sollte.</p>
<p>Wichtig ist, dass man sich darüber im Klaren ist, dass diese Grafiken auf allen Seiten geladen werden. Muss ein Icon, das auf einer Seite vorkommt, die nur von 2% aller Besucher ausgerufen wird, auch von den restlichen 98% geladen werden oder kann diese Seite einen zusätzlichen Request vertragen? Auch die Methode der Einbindung sollte beachtet werden. Wenn die Dimensionen des Elements, welches das Sprite in den Hintergrund erhalten soll, in Breite und Höhe begrenzt sind, können die einzelnen Grafiken neben und untereinander positioniert werden. Soll allerdings beispielsweise ein Icon an der linken, oberen Ecke einer Box erscheinen, muss das Sprite entsprechend Weißraum in horizontaler und vertikaler Richtung aufweisen. Ein rein vertikales oder horizontales Sprite ist in diesem Fall wohl der beste Weg. Hierbei ist auch noch die mögliche Änderung der Dimensionen zu beachten, bei flexiblen Layouts oder bei Schriftvergrößerung können sich Breiten und Höhenangaben auch nach dem Rendern einer Seite noch ändern.</p>
<p>Ausgehend von dem Ziel, eine möglichst kleine Datei zu erzeugen, empfiehlt sich außerdem die Sortierung nach Farben. Denn hier lässt sich die Dateigröße noch ein bisschen mehr reduzieren. Bei der Verwendung von PNG-8 oder GIF ist die Anzahl der unterschiedlichen Farben auf 256 beschränkt. Sobald die Anzahl unter den Maximalwert sinkt, verringert sich auch die Dateigröße. So ist es möglich, durch geschicktes Zusammenfügen ein Sprite ohne sichtbare Farbunterschiede auf fünfzig bis hundert Farben reduzieren.</p>
<h5>Zum Autor</h5>
<p><img src="http://www.webkrauts.de/wp-content/uploads/2008/07/tobias_otte.jpg" alt="" title="Autorenfoto Tobias Otte" class="bild-links" width="60" height="60"/><a href="http://tobias-otte.de">Tobias Otte</a> arbeitet als Frontend Engineer bei der <a href="http://xing.com">XING.com</a> Neben seinem täglichen Kampf mit HTML/CSS und JavaScript interessiert er sich für Web Accessibility, Usability, Typografie und Webstandards.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webkrauts.de/2009/12/15/kuerzere-ladezeiten-durch-css-sprites/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
