<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>Peter Kröner • Webtechnologie • Weblog</title>
<link>http://feeds2.feedburner.com/kroener</link>
<description><![CDATA[Weblog von Peter Kröner, HTML5-Trainer, Webentwickler und Autor]]></description>
<language>de</language>
<ttl>120</ttl>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kroener" /><feedburner:info uri="kroener" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>kroener</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
<title><![CDATA[Ubuntu 13.04 mit Konfiguratoren und Patches zurechtbiegen]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/I8mriD6voNI/</link>
<description><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/ubuntu.png" alt=""></figure>

<p>
Man kann es mit Ubuntu als Betriebssystem vergleichsweise gut aushalten, weil es gut funktioniert. <span lang="en"Out of the Box</span> kann man so ziemlich alles machen, und alle Dinge tun was sie sollen. Allein, die Art und Weise <em>wie</em> sie tun, das ist teilweise ganz schön diskutabel und so manche Design-Entscheindung verleitet geradezu zum Fazialpalmieren. Meine Wenigkeit erschlägt das Ganze immer mit ein paar zusätzlichen Stücken Software, die ich im Folgenden einfach mal aufliste –&#8230;</p></img>]]></description>
<pubDate>Mi, 08 Mai 2013 15:33:54</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/ubuntu-13.04-mit-konfiguratoren-und-patches-zurechtbiegen/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/ubuntu.png" alt=""></figure>

<p>
Man kann es mit Ubuntu als Betriebssystem vergleichsweise gut aushalten, weil es gut funktioniert. <span lang="en"Out of the Box</span> kann man so ziemlich alles machen, und alle Dinge tun was sie sollen. Allein, die Art und Weise <em>wie</em> sie tun, das ist teilweise ganz schön diskutabel und so manche Design-Entscheindung verleitet geradezu zum Fazialpalmieren. Meine Wenigkeit erschlägt das Ganze immer mit ein paar zusätzlichen Stücken Software, die ich im Folgenden einfach mal aufliste&nbsp;&ndash; jedenfalls die Software, die ich im Moment bei Raring Ringtail 13.04 im Einsatz habe. Falls ihr noch mehr in dieser Richtung vorschlagen wollt: Ab damit in die Kommentare!
</p>

<ul>

<li><strong>Neuen Nautilus loswerden:</strong> in Ubuntu 13.04 wird aus unerfindlichen Gründen Nautilus 3.6 verwendet, eine schlecht integrierte, fehlgeleitete Karikatur des vorherigen Dateimanagers mit der Versionsnummer 3.4&nbsp;&ndash; hässliches Aussehen, Funktionen fehlen, Hotkeys tun es nicht mehr usw. Einen gepatchten, zu Ubuntu 13.04 kompatiblen Nautilus 3.4 <a href="http://www.webupd8.org/2013/04/get-nautilus-34-features-back-in-ubuntu.html">gibt es bei Webupd8</a>. Installieren und alle Probleme verschwinden.

<li><strong>Unity konfigurieren:</strong> <a href="http://www.florian-diesch.de/software/unsettings/">Unsettings</a> ist ein GUI zur Konfiguration von Unity. Neuerdings gibt es mit dem <a href="https://launchpad.net/unity-tweak-tool">Unity Tweak Tool</a> auch eine offizielle Lösung, aber warum die nicht standardmäßig installiert ist, ist mir schleierhaft. Aber beide Tools funktionieren ganz gut. Das Wichtigste ist die Auswahl der passenden Hintergrundfarbe für das Dash.

<li><strong>Gepatchtes Notify-OSD:</strong> Die Ubuntu-Notifications sind in ihrem Auslieferungszustand nicht konfigurierbar, also müssen <a href="https://launchpad.net/~leolik/+archive/leolik">eine gepatchte Version</a> und <a href="https://launchpad.net/~amandeepgrewal/+archive/notifyosdconfig">ein damit kompatibler Konfigurator</a>) her. Auch hier: Hintergrundfarbe das wichtigste, Kontrolle über Positionierung und Timeout <span lang="en">nice to have.</span>

<li><strong>Compiz konfigurieren:</strong> Falls man auf die (aus Canonical-Sicht wohl völlig abwegige) Idee kommen sollte, seinen Window Manager konfigurieren zu wollen: <code>sudo apt-get install compizconfig-settings-manager &amp;&amp; ccsm</code>

</ul>

<p>
Das ist ungefähr der Werkzeugkasten, mit dem ich mir alle halbe Jahr, nach jedem Release, den Desktop wieder in genehme Form bringe. Ich verstehe nicht, warum man die Konfiguratoren nicht zum Standard macht bzw. eigene bereitstellt. Bei rechtlichen Fragen (Codecs usw.) habe ich vollstes Verständnis, aber hier <em>muss</em> man einfach Böswilligkeit und/oder Arroganz unterstellen. Canonical hält mich anscheinend für blöder als ich bin und ihre Designer für besser als sie sind. Grr&nbsp;&hellip; aber hey, immerhin <em>kann</em> man die Sachen patchen und alles andere fluppt ja ganz gut. Und alles zu patchen hat mich gestern abend auch nur 30 Minuten gekostet.<img src="http://vg09.met.vgwort.de/na/be954ccb762f4f889131c0dac05e9ccf" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=I8mriD6voNI:-fDUqcqkFzI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/I8mriD6voNI" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/ubuntu-13.04-mit-konfiguratoren-und-patches-zurechtbiegen/</feedburner:origLink></item>
<item>
<title><![CDATA[Pik7 - Ein HTML5-Präsentationsframework für Nerds]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/nsUx5eEklV0/</link>
<description><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/pik7-logo.png" alt="Meine Ausrede für ein Logo für Pik7"></figure>

<p>
Die letzten Jahre habe ich ständig Seminare und Vorträgen zu HTML5, CSS3, JavaScript und verwandten Themen gegeben. Bei diesen Themen ist es natürlich naheliegend, HTML/JS-Demos und -Codeschnipsel direkt in die Präsentation einzubetten. Auf HTML fußende Präsentationstools, mit denen das theoretisch denkbar wäre, gibt es wie Sand am Meer. Allerdings haben all diese meine dringendsten Präsentationsprobleme nicht gelöst, weswegen ich (nach mehreren Anläufen)&#8230;</p></img>]]></description>
<pubDate>Di, 07 Mai 2013 16:07:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/pik7-ein-html5-praesentationsframework-fuer-nerds/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/pik7-logo.png" alt="Meine Ausrede für ein Logo für Pik7"></figure>

<p>
Die letzten Jahre habe ich ständig Seminare und Vorträgen zu HTML5, CSS3, JavaScript und verwandten Themen gegeben. Bei diesen Themen ist es natürlich naheliegend, HTML/JS-Demos und -Codeschnipsel direkt in die Präsentation einzubetten. Auf HTML fußende Präsentationstools, mit denen das theoretisch denkbar wäre, gibt es wie Sand am Meer. Allerdings haben all diese meine dringendsten Präsentationsprobleme nicht gelöst, weswegen ich (nach mehreren Anläufen) mein eigenes Tool geschrieben habe. <a href="http://hoersuppe.de/">Die Hörsuppe</a> hat mich vor ein paar Tagen dazu veranlasst, dem Ganzen mal ein ordentliches Release zu gönnen: <a href="http://pik.peterkroener.de/">Pik7 v. 1.0.0 ist da!</a>

<figure><a class="imagelink" href="http://cdn2.peterkroener.de/uploads/2013/pik7-screenshot.png"><img width="600" height="354" src="http://cdn2.peterkroener.de/uploads/2013/pik7-screenshot-klein.png" alt="Pik7 - Präsentation und Presenter Mode" style="padding:0.75em"></a></figure>

<p>
Ich bin nicht restlos davon überzeugt, dass irgendwer außer mir Pik7 einsetzen sollte, weil ich doch sehr spezielle Primärziele damit hatte:

<ul>

<li><strong>Performance.</strong> Dinge wie mein Canvas-Intensivkurs haben deutlich mehr als 100 Slides, auf denen zu allem Überfluss auch noch allerhand Animationen usw. ablaufen. Das brauche ich in flüssig.

<li><strong>Presenter View.</strong> Ein aus „richtigen“ Präsentationstools wie Power Point bekanntes Feature, das auf einem Zweitbildschirm nicht für das Publikum gedachte Infos anzeigt&nbsp;&ndash; so kann der Vortragende zum Beispiel sehen, welche Slide als nächste dran ist und wie viel Zeit er noch hat. Bei der Masse meiner ganzen Folien darf dieses Feature nicht fehlen.

<li><strong>Druckbarkeit.</strong> Ich brauche PDF-Fassungen all meiner Slides. Druckbare Präsentationen + Chromes „print to PDF“ = Problem erledigt. Mit ein bisschen JavaScript und CSS kann man außerdem mehrere verschiedene PDFs erzeugen, z.B. einen Cheat Sheet für den Workshop und eine Komplettfassung für das spätere Nacharbeiten.

<li><strong>Einfache Programmier- und Stylebarkeit.</strong> Versteht sich von selbst: simple Themes, JavaScript-Events beim Folienwechsel usw.

<li><strong>Nobrainer-Funktionen für Nerds.</strong> Eingebautes Syntax-Highlighting. Eingebautes prefix-free. Auto-Synchronisation von mehreren offenen Präsentationen und Presenter Views. Ich muss kompliziertes Zeugs erzählen, ich habe keine Zeit komplizierte Tools zu bedienen.

<li><strong>Kein Firlefanz.</strong> Ich brauche weder fancy 3D-Animationen noch verschachtelte Slides noch eine Funktion, die mich Bullet Points nach und nach einblenden lässt. Die könnte man sicher alles einbauen, aber ich habe daran erst mal keinen Bedarf.

</ul>

<p>
Kleiner Screencast mit den wichtigsten Features:
<p>
<iframe width="640" height="360" src="http://www.youtube.com/embed/CKS366kCpvI?rel=0" frameborder="0" allowfullscreen></iframe>

<p>
Da es, zumindest als ich anfing meine eigenen Tools zu basteln, diese Features in dieser Kombination  nirgendwo zu finden gab, musste ich eben selbst ran. Pik7 ist selbstverständlich Open Source (MIT), <a href="https://github.com/SirPepe/Pik7">liegt auf Github rum</a> oder kann von <a href="http://pik.peterkroener.de/">pik.peterkroener.de</a> heruntergeladen werden. Eine Präsentation zu erstellen ist recht einfach&nbsp;&hellip;

<pre><code class="prettyprint language-html">&lt;!-- /presentations/MySlides/index.html --&gt;
&lt;!doctype html&gt;
&lt;html id="PikSlides"&gt;
&lt;script src="../../core/pik7.js"&gt;&lt;/script&gt;

&lt;div class="pikSlide"&gt;First Slide&lt;/div&gt;
&lt;div class="pikSlide"&gt;Second Slide&lt;/div&gt;</code></pre>

<p>
&hellip; aber wie schon gesagt: ich bin nicht sicher, ob ich Pik7 wirklich empfehlen sollte. Zu den Nachteilen gehört unter anderem der etwas bei HTML-Slides übliche, mühsame Folienbau (Snippets für ST2 liegen aber bei) und dass zwingend ein Websever benötigt wird. Ein kleiner Node.js-Server wird zwar mitgeliefert, ist aber <em>sehr</em> spartanisch gehalten. Außerdem fehlen, wie erwähnt, Animationen und Co. Aber falls ihr euer Glück mit Pik7 versuchen wollt, werde ich euch nicht aufhalten.<img src="http://vg09.met.vgwort.de/na/d99f105762bd4247b4355b5875506fa5" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=nsUx5eEklV0:3QQofFm8w3A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/nsUx5eEklV0" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/pik7-ein-html5-praesentationsframework-fuer-nerds/</feedburner:origLink></item>
<item>
<title><![CDATA[Fragen zu HTML5 & Co beantwortet 9 - Leerzeichen, Canvas-Resizing, Slashes, Fullscreen-Video unter iOS]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/GRJHsSFhlHs/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 & Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 & Co 5</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-6/">Fragen zu HTML5 & Co 6</a>
<li><a&#8230;</a></li></li></li></li></li></li></li></ol></p></div>]]></description>
<pubDate>Di, 26 Mär 2013 14:21:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-9-leerzeichen-canvas-resiszing-slashes-fullscreen-video-ios/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 &amp; Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 &amp; Co 5</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-6/">Fragen zu HTML5 &amp; Co 6</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-7-doctypes-css-transformationen-codecs-semantik/">Fragen zu HTML5 &amp; Co 7</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-8-cors-z-index-drag-und-drop-default-styles/">Fragen zu HTML5 &amp; Co 8</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-9-leerzeichen-canvas-resiszing-slashes-fullscreen-video-ios/">Fragen zu HTML5 &amp; Co 9</a>
</ol>
</div>

<p>
Ich bin zwar kein Doktor und draußen ist auch gerade alles andere als Sommer, aber Fragen beantworte ich trotzdem gern. Bevorzugt solche zu HTML5, CSS3, JavaScript und anderen Themen rund um Webentwicklung. Die folgenden vier Fragen sind alle in den letzten Wochen via <a href="https://twitter.com/sir_pepe">Twitter</a> und <a href="kontakt/">E-Mail</a> an mich herangetragen worden, was genau die beiden Kanäle sind, über die ich auch euch gerne die Fragen beantworte, die euch unter den Nägeln brennen. Einfach anschreiben!

<h3>Leerzeichen bei mobiler Datenverbindung verschwunden?</h3>
<blockquote>
<p>
In mobilen Browsern (Verbindung über EDGE/3G/LTE) werden manchmal Leerzeichen aus meiner Webseite entfernt. Weißt du etwas darüber? Ist das vielleicht eine Art von Kompression?
</blockquote>
<p>
Ohne es konkret testen zu können ist eine Antwort schwer, aber es kann durchaus sein, dass Mobilfunkanbieter das HTML einer Seite komprimieren, um hier und da ein paar Bytes zu sparen. Es ist jedenfalls nicht unüblich, dass die Provider <a href="http://codecandies.de/2011/01/20/hinter-dem-mobilen-proxy/">in auszulieferndes Markup eingreifen</a>. Besonders problematisch wird das Ganze, wenn, wie im verlinkten Artikel beschrieben, der Inhalt verändert wird, aber auch wenn „nur“ komprimiert (d.h. Whitespace zwischen Tags entfernt) wird, kann es durchaus zu sichtbaren Veränderungen in der Seite kommen, denn egal ist solcher Whitespace bei HTML nicht. Vergleichen wir doch mal:
<pre><code class="prettyprint language-html">&lt;!doctype html&gt;
&lt;meta charset="utf-8"&gt;
&lt;title&gt;Whitespace ist wichtig&lt;/title&gt;


&lt;h1&gt;Mit Whitespace&lt;/h1&gt;
&lt;p&gt;
    &lt;span&gt;Test&lt;/span&gt;
    &lt;span&gt;Test&lt;/span&gt;
    &lt;span&gt;Test&lt;/span&gt;
&lt;/p&gt;


&lt;h1&gt;Ohne Whitespace&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;Test&lt;/span&gt;&lt;span&gt;Test&lt;/span&gt;&lt;span&gt;Test&lt;/span&gt;&lt;/p&gt;</code></pre>
<p>
Der Unterschied zwischen den beiden Absätzen ist an <a href="http://cdn2.peterkroener.de/uploads/2012/whitespace.html">im gerenderten Endergebnis</a> sichtbar und kommt daher, dass die Leerzeichen und Zeilenumbrüche zu zusätzlichen Textknoten zwischen den Elementen führen. Man beachte die <code>childNodes</code>-Eigenschaft im DOM:
<figure>
<a class="imagelink" href="http://cdn2.peterkroener.de/uploads/2012/textnodes.png"><img width="640" height="198" src="http://cdn2.peterkroener.de/uploads/2012/textnodes-klein.png" alt="Unterschiedliches DOM je nach Leerzeichen-Einsatz"></a>
</figure>
<p>
Streicht ein übereifrig optimierender Mobildatendienstleister diese Leerzeichen weg, hat man natürlich plötzlich ein ganz anderes DOM und das kann ein handfestes Problem werden. Schnelle Abhilfe schafft möglicherweise die Codierung von Leerzeichen als Entity (<code>&amp;#32;</code>) an kritischen Stellen.


<h3>Bilder und Videos per Canvas verkleinern</h3>
<blockquote>
<p>Vielen Dank für <a href="http://www.peterkroener.de/video-manipulation-mit-canvas-schritt-fur-schritt-erklart/">das Tutorial</a>! Eine Frage hätte ich allerdings: was müsste ich machen, um das Video oder das Bild in eine kleine Canvas zu skalieren, also z.B. statt 400&times;300 in ein 40&times;30, wenn die Originaldatei aber 400&times;300 hat?</blockquote>
<p>
Das ist zum Glück ganz einfach. Die <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage">drawImage-Methode</a> kann man nicht nur mit zwei Parametern (Bild, X-Koordinate, Y-Koordinate) aufrufen, <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage">sondern auch mit vier oder acht</a>. Die beiden zusätzlichen Parametern bestimmen dann die Höhe und Breite des gemalten Bildes und wenn die Quelle andere Maße hat, wird sie automatisch gestreckt oder verkleinert. Außerdem kann man auch nur einen Ausschnitt aus der Quelle verwenden. Ein Bild sagt mehr als tausend Worte; der Aufruf <code>context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)</code> bedeutet:
<figure>
<img src="http://cdn2.peterkroener.de/uploads/2013/drawImage.png" alt="sy, sx, sw und sh definieren den zu zeichnenden Ausschnitt der Quelle, der dann an die Koordinaten dx/dy mit den Maßen dw*dh gezeichnet wird">
</figure>
<p>
Leider wird diese Technik noch viel zu selten genutzt. Warum zum Beispiel sollte man bei Bilduploads eine viel zu große Datei hochladen, nur um sie dann auf dem Server von einem PHP-Script kleinrechnen zu lassen? Das kann man dank HTML5 viel besser auf dem Client erledigen.


<h3>End-Slashes für Leer-Elemente</h3>
<blockquote>
<p>
Hallo, ich beobachte, dass häufig ein End-Slash im IMG-Tag gesetzt wird (<code>&lt;img /&gt;</code>). Bisher funktionieren auch die alten Tags ohne „/“. Kann es sein, dass der End-Slash zukünftig zwingend geschrieben werden muss? Und wenn ja, ab wann?
</blockquote>
<p>
Nein, dieser schließende Slash wird voraussichtlich nie auf breiter Front Pflicht werden. Der Slash rührt daher, dass das W3C <em>zwischenzeitlich</em> mal plante, HTML auf XML-Basis neu aufzustellen&nbsp;&ndash; XHTML sollte der neue Standard werden. Dort wäre dann schließende Slash für Elemente wie <code>&lt;img&gt;</code> Pflicht geworden. Diese XML-Umstellung hat aber aus einer ganzen Reihe von Gründen nicht so recht funktioniert und heute (d.h. in HTML5) ist der Slash damit wieder optional. Die HTML5-Parser in modernen Browsern werden durch ihn nicht gestört, benötigen ihn aber auch nicht. Es ist buchstäblich völlig egal ob man ihn verwendet oder nicht.
<p>
Es existiert zwar auch XHTML5, wo der Slash Pflicht wäre, aber wegen vieler vieler Problem damit (u.A. funktioniert es nicht im Internet Explorer 6, 7 und 8) ist die Verwendung von XHTML5 nicht zu empfehlen. Man nur Nachteile, keine Vorteile.


<h3>Inline-Video mit HTML5 auf dem iPhone</h3>
<blockquote>
<p>
Gibt es irgendwie die Möglichkeit, mit HTML5 eingebundene Videos auf dem iPhone inline d.h. ohne automatischen Fullscreen darzustellen?
</blockquote>
<p>
Zunächst sollten wir festhalten, dass sich das iPhone nicht direkt unkorrekt verhält, wenn es Videos ausschließlich im Vollbild abspielt. Die in den Spezifikationen festgeschriebenen Regeln lassen sich mit geringem Aufwand so weit dehnen, dass dieses Verhalten standardkonform erscheint. <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#the-video-element">Zitat</a>:
<blockquote>
<p>
User agents may allow users to view the video content in manners more suitable to the user (e.g. full-screen or in an independent resizable window). As for the other user interface features, controls to enable this should not interfere with the page's normal rendering unless the user agent is exposing a user interface. In such an independent context, however, user agents may make full user interfaces visible, with, e.g., play, pause, seeking, and volume controls, even if the controls attribute is absent.
</blockquote>
<p>
Wenn der Browser ein Interface mit Steuerungselementen für das Video anzeigt, darf er das im Fullscreen-Modus machen. Und wenn der Browser im Fullscreen-Modus ein Video anzeigt, soll er dort auch ein Interface mit Steuerungselemente anzeigen, selbst wenn das dafür normalerweise nötige <code>controls</code>-Attribut auf dem Video-Element gar nicht gesetzt ist. Und so startet iOS auf iPhone und iPod Touch jedes Video im Vollbild, da es schließlich ein Steuerungsinterface zeigt, das es auch in Abwesenheit des <code>controls</code>-Attributs anzeigen darf, da das im Vollbild passiert. Richtig falsch ist das also nicht.
<p>
Kann man denn etwas dagegen tun? Leider nicht. Es gibt zwar das proprietäre HTML-Attribut <a href="http://developer.apple.com/library/safari/#documentation/appleapplications/reference/SafariHTMLRef/Articles/Attributes.html#//apple_ref/doc/uid/TP40008058-SW30"><code>webkit-playsinline</code></a>, aber das scheint nur für native Apps mit UIWebViews gedacht zu sein und funktioniert nicht auf iPhones und dem iPod Touch.


<h3>Weitere Fragen?</h3>
<p>
Eure Fragen zu HTML5, JavaScript und anderen Webtechnologien beantworte ich gerne! Einfach <a href="kontakt/">eine E-Mail schreiben</a> oder <a href="https://twitter.com/sir_pepe">Twitter bemühen</a> und ein bisschen Geduld mit der Antwort haben. Ansonsten <a href="profil/">kann man mich natürlich auch mieten!</a><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=GRJHsSFhlHs:oCwXGq35vA4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/GRJHsSFhlHs" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-9-leerzeichen-canvas-resiszing-slashes-fullscreen-video-ios/</feedburner:origLink></item>
<item>
<title><![CDATA[Über die verschiedenen Zukunftsprognosen für eine Welt ohne Presto]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/5f6fpPQR44c/</link>
<description><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/opera.png" alt="" style="margin:0 0 0.75em 0"></figure>
<p>
Wie den wenigsten Webdesignern und -entwicklern entgangen sein dürfte, hat Opera angekündigt, in all ihren Produkten die hauseigene Presto-Engine gegen Webkit auszutauschen. So richtig habe ich die Gründe aus den <a href="http://my.opera.com/haavard/blog/2013/02/13/webkit">entsprechenden</a> <a href="http://my.opera.com/ODIN/blog/300-million-users-and-move-to-webkit">Blogposts</a> nicht herauslesen können, aber die wohl (für Nicht-Opera-Mitarbeiter) auch nicht so&#8230;</p></img>]]></description>
<pubDate>Do, 14 Feb 2013 14:58:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/ueber-die-verschiedenen-zukunftsprognosen-fuer-eine-welt-ohne-presto/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/opera.png" alt="" style="margin:0 0 0.75em 0"></figure>
<p>
Wie den wenigsten Webdesignern und -entwicklern entgangen sein dürfte, hat Opera angekündigt, in all ihren Produkten die hauseigene Presto-Engine gegen Webkit auszutauschen. So richtig habe ich die Gründe aus den <a href="http://my.opera.com/haavard/blog/2013/02/13/webkit">entsprechenden</a> <a href="http://my.opera.com/ODIN/blog/300-million-users-and-move-to-webkit">Blogposts</a> nicht herauslesen können, aber die wohl (für Nicht-Opera-Mitarbeiter) auch nicht so wichtig ist, wie die web-weiten Folgen dieses Schritts. An Prognosen hierüber herrscht kein Mangel&nbsp;&ndash; von goldener Zukunft bis hin zum Untergang der Webstandards lässt sich so ziemlich jede Aussage im Web finden. Eine besonders schöne Fundgrube stellt <a href="http://news.ycombinator.com/item?id=5211953">Hacker News</a> dar. Ich habe zur Zeit noch keine fertige Meinung zu dieser Angelegenheit und möchte mich an dieser Stelle darauf beschränken, ein paar meiner Meinung nach leicht abenteuerliche Vorstellungen über die Folgen der Webkit-Entscheidung zu besprechen.

<p>
<strong>Alles wird besser!</strong> Auf dem Holzweg sind meines Erachtens vor allem jene, die glauben, dass es Entwicklern mit einer Engine weniger einfacher fallen wird, Web-Frontends zu bauen. Zum einen haben viele nicht ganz so professionelle Entwickler Opera ob seines eher geringen Marktanteils ohnehin völlig ignoriert. Alle, die ihre Werke auch in Opera getestet haben, werden gemerkt haben, dass dieser Browser sich seit jeher sehr standardkonform verhielt und selten die ganz großen Probleme machte (und wenn, dann hat selbst ein mittelschwerer Darstellungsfehler aufgrund des geringen Marktanteils wohl kaum fatale Auswirkungen auf das Gesamtprojekt gehabt). Und vor allem: um zu behaupten, dass es zwischen Browsern, die eine gemeinsame Engine haben, keine großen Unterschiede gibt, muss man die diversen Mobile-Browser ignorieren. Die verwenden zwar fast alle Webkit als Engine, aber in so unterschiedlichen Versionen und Zusammensetzungen mit anderen Komponenten, dass man davon als Webentwickler nicht wirklich viel merkt.

<p>
<strong>Das Ende ist nah!</strong> Die Apokalyptiker-Fraktion sieht hingegen eine neue Browsermonokultur unmittelbar vor der Tür stehen. Das ist, Stand heute (mit neben Webkit noch Gecko und Trident als relevanten Browserengines), natürlich noch längst nicht der Fall. Allerdings kann man das Ende von Presto schon als Wegfall eines Glieds aus der Monokultur-Abwehrkette interpretieren. Immerhin reicht es jetzt, wenn entweder Mozilla oder Microsoft aus dem Browsermarkt ausscheiden oder selbst zu Webkit wechselt, denn das dann bestehende Engine-Duopol könnte sich aufgrund des Übergewichts der Webkit-Browser als instabil erweisen. Aber selbst dann ist nicht gesagt, dass das Web im Innovationsstillstand versackt&nbsp;&ndash; die Konkurrenz durch die nativen Plattformen könnte das verhindern. Die Frage ist natürlich, wie der weitere Fortschritt dann aussehen könnte, was uns direkt zu Prognose Nummer drei bringt&nbsp;&hellip;

<p>
<strong>Gut für Webstandards!</strong> Manche sagen auch, weniger Engines seien besser für die Entwicklung und Durchsetzung von Standards. Ich weiß nicht so recht. Wenn man der Presto-Engine etwas <em>nicht</em> vorwerfen kann, dann sind das gewohnheitsmäßige Standards-Abweichungen. An dieser Front war Opera sicher nie das größte Problem. Andersherum könnte durchaus ein Schuh draus werden, denn Webstandards richten sich oft nach den Implementierungen&nbsp;&ndash; was in allen Browsern vorhanden ist, und sei es noch so größer Käse, wird früher oder später Standard. So war es zum Beispiel mit <code>&lt;center&gt;</code> oder der grausligen Drag &amp; Drop-API. Mit nun einer Engine weniger fällt es vielleicht etwas leichter, Fakten zu schaffen, die dann in einem Standard münden. Das kann man durchaus gut finden weil es schneller gemeinsame APIs produziert, andererseits ist ein hohes Tempo ein Risiko für die Qualität dieser gemeinsamen Features. Allerdings hat Opera nun auch nicht all seine Entwickler entlassen, sondern lässt diese <a href="https://bug-15553-attachments.webkit.org/attachment.cgi?id=188026">jetzt an Webkit mitbasteln</a>, d.h. die Stimmen der Vernünftigen, die einst für Presto sprachen und programmierten, sind weiterhin zu hören. Ob das reicht wird man sehen.

<p>
Ich selbst habe, wie eingangs erwähnt, noch keine fertige Meinung zu diesem Schritt von Opera. Zu bejubeln finde ich nichts, aber die auch den unmittelbaren Weltuntergang vermag ich nicht festzustellen. Klar, im Prinzip sind das WWW der Webkit-Hegemonie einen Schritt näher gekommen, aber dass demnächst wirklich Mozilla und/oder Microsoft zumachen, fällt mir schwer zu glauben. Und beide haben einen ganz gesunden Marktanteil und können mit jeder Version steten Fortschritt vermelden. Selbst was die Entwicklung von Standards angeht, muss sich erst mal zeigen ob sich überhaupt etwas ändert. Das halte ich zwar noch am wahrscheinlichsten (jedenfalls wahrscheinlicher als eine Browser-Einheitsfront) aber wie genau sich das auswirkt, ist reine Spekulation.

<p>
<strong>Mein Fazit:</strong> Interessante Entwicklung, aber (noch) kein Grund die Gelassenheit zu verlieren.
<img src="http://vg09.met.vgwort.de/na/641109e8cc14420fbbce3ee431ee72e4" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=5f6fpPQR44c:soIEWwxrFIo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/5f6fpPQR44c" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/ueber-die-verschiedenen-zukunftsprognosen-fuer-eine-welt-ohne-presto/</feedburner:origLink></item>
<item>
<title><![CDATA[Indexed DB, die neue HTML5-Datenbank im Browser. Teil 2: Browsermacken, Tools und Polyfills]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/wa2XFTerlz0/</link>
<description><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/badge_offline.png" alt="Logo für HTML5 Offline-Technologien" style="margin:0 0 0.75em 0"></figure>
<p>
Nachdem wir in <a href="indexed-db-die-neue-html5-datenbank-im-browser-teil-1-ein-kurzer-ueberblick/">Teil 1</a> dieses Artikels die wichtigsten Parts der Indexed Database API kennen gelernt haben und auch erfahren haben, dass dieses Feature bisher nur in Chrome, Firefox und IE 10 zu finden ist, stellt sich die übliche HTML5-Fragen: kann man das Ganze überhaupt benutzen? Ja, man kann. Für die Browser ohne Unterstützung&#8230;</p></img>]]></description>
<pubDate>Do, 24 Jan 2013 14:28:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-2-browsermacken-tools-und-polyfills/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/badge_offline.png" alt="Logo für HTML5 Offline-Technologien" style="margin:0 0 0.75em 0"></figure>
<p>
Nachdem wir in <a href="indexed-db-die-neue-html5-datenbank-im-browser-teil-1-ein-kurzer-ueberblick/">Teil&nbsp;1</a> dieses Artikels die wichtigsten Parts der Indexed Database API kennen gelernt haben und auch erfahren haben, dass dieses Feature bisher nur in Chrome, Firefox und IE&nbsp;10 zu finden ist, stellt sich die übliche HTML5-Fragen: kann man das Ganze überhaupt benutzen? Ja, man kann. Für die Browser ohne Unterstützung für Indexed&nbsp;DB gibt es gute Polyfills und die wenigen Macken, die die vorhandenen Implementierungen haben, lassen sich recht einfach ausmerzen. Ein wenig problematischer ist der noch herrschende Mangel an Tools und Libraries. Aber alles der Reihe nach&nbsp;&hellip;


<h3>Polyfill(s) für Safari, Opera und andere</h3>
<p>
Opera und Safari inklusive Mobile-Varianten unterstützen die Indexed Database API nicht. Was sie allerdings unterstützen, ist <a href="http://www.w3.org/TR/webdatabase/">Web&nbsp;SQL</a>, dieser aufgegebene Nun-doch-nicht-Standard für relationale Datenbanken im Browser. Es ist dann ziemlich naheliegend, einen Polyfill zu bauen, der die Funktionalität von Indexed&nbsp;DB mittels Web&nbsp;SQL herstellt, was <a href="https://github.com/axemclion/IndexedDBShim">IndexedDBShim.js</a> in gewohnt unkomplizierter Manier macht:
<pre><code class="prettyprint language-html">&lt;script src="IndexedDBShim.js"&gt;&lt;/script&gt;</code></pre>
<p>
Mit dieser Zeile Code im HTML läuft die Datenspeicherung dann auch in Opera, Safari, iOS, alten Android-Versionen und auch sonst fast <a href="http://caniuse.com/sql-storage">allen Browsern, die zwar Web&nbsp;SQL unterstützen</a>, denen es aber an Indexed&nbsp;DB gebricht.
<p>
Es gibt neben IndexedDBShim.js noch einen alternativen <a href="https://github.com/facebook/IndexedDB-polyfill/">Polyfill aus der Feder Facebooks</a>, den ich allerdings nicht getestet habe.



<h3>Härtefall 1: Android-Browser</h3>
<p>
Im Standard-Android-Browser (nicht mobile Chrome) ab Version&nbsp;4 ist Indexed&nbsp;DB implementiert. Dummerweise basiert diese Implementierung aber auf einer älteren, nicht mit anderen Browsern kompatiblen Version der Spezifikationen. Der bequemste Ausweg aus diesem Problemchen ist, den Polyfill statt der nativen, aber fossilen Implementierung zu verwenden, denn Web&nbsp;SQL macht Android sehr viel richtiger als Indexed&nbsp;DB.
<p>
Ob eine Implementierung von Indexed&nbsp;DB veraltet ist, lässt sich am Vorhandensein von <code>window.IDBVersionChangeEvent</code> ablesen. Diese Variable wird nur von der aktuellen Version der Spezifikation beschrieben; ein Browser, der sie nicht hat, hat entweder gar keine Indexed&nbsp;DB oder eine alte Version. Der Rest ist dann ganz einfach:
<pre><code class="prettyprint language-javascript">// Keine (aktuelle) Implementierung von Indexed DB vorhanden?
var requireShim = typeof window.IDBVersionChangeEvent == 'undefined';

// WebSQL vorhanden?
var supportsWebSql = typeof window.openDatabase != 'undefined';

if(requireShim && supportsWebSql){
  window.shimIndexedDB.__useShim(); // Verwendung des Polyfills erwzingen
}</code></pre>
<p>
Damit sind Android-Browser und auch alle anderen Fossilien, die eine alte Variante von Indexed&nbsp;DB mit sich herumschleppen, bedient.



<h3>Härtefall 2: Tools</h3>
<p>
Chrome bietet ein komfortables, in den Web Inspector einbgebautes UI zur Betrachtung von Indexed&nbsp;DB-Datenbanken im Resouces-Tab:
<figure><img width="634" height="416" src="http://cdn2.peterkroener.de/uploads/2013/idbinspector.png" alt="Der Indexed DB-Betrachter der Developer Tools von Chrome zeigt Datenbanken und Object Stores"></figure>
<p>
Und das war es dann auch schon mit guten Nachrichten von der Tool-Front, denn weder Firefox noch Internet Explorer können mit nativen Tools aufwarten. Am nächsten kommt man dem im Firefox noch mit dem Addon <a href="https://addons.mozilla.org/de/firefox/addon/sqlite-manager/">SQLite Manager</a>, denn unter der Haube speichert dieser Browser die Indexed Database in einer SQLite-Datenbank. Diese befindet sich in aller Regel im Profil-Verzeichnis der jeweiligen Firefox-Users im Unterverzeichnis <code>indexedDB/<wbr>&lt;ORIGIN&gt;/</code> und hat den Namen <code>&lt;KRYPTISCHE_ID&gt;.sqlite</code>. Da sich SQLite und Indexed&nbsp;DB in ihrem Wesen stark unterscheiden, ist der SQLite Manager nicht wirklich ein super-komfortables Tool, aber er ist besser als gar nichts.
<p>
<figure><img width="634" height="416" src="http://cdn2.peterkroener.de/uploads/2013/sqlmanager.png" alt="Das Firefox-Addon SQLite Manager stellt den Inhalt von Indexed DB in einer Tabellenstruktur dar"></figure>
<p>
Stichwort „gar nichts“: für den IE&nbsp;10 scheint es gar kein browserbasiertes Tool zu geben. Das nächstbeste sind sind diverse Ansätze für in HTML eingebaute Scripts, die dann einen Inspector-UI in die Seite rendern. Zu nennen wäre da vor allem der <a href="http://blogs.msdn.com/b/ie/archive/2012/01/25/debugging-indexeddb-applications.aspx">IDBExplorer</a>, den ich allerdings nicht gründlich genug gestestet habe, um eine Aussage über dessen Tauglichkeit zu machen.

<h3>Härtefall 3: Libraries</h3>
<p>
Dem Indexed&nbsp;DB-Universum fehlen noch vernünftige Libraries. Zwar ist die API nicht schlecht, aber mehr Komfort und Funktionalität darf man sich als Entwickler durchaus wünschen. Zum Beispiel wäre ein Möglichkeit zur Definition von Schemata (inklusive Validierung, Defaultwerten und Virtuals) ganz wünschenswert und auch eine etwas mehr an moderne Befindlichkeiten angepasste API (Stichwort Verkettung) würde sicher Abnehmer finden. Außer Ansätzen ist in dieser Richtung aber bisher noch nicht viel zu finden.
<p>
Am nächsten kommen dem gewünschten Featureset noch <a href="http://aaronpowell.github.com/db.js/">db.js</a> und <a href="https://github.com/jensarps/IDBWrapper">IDBWrapper</a>, die beide verkettbare APIs herstellen. Statt sich mit Transaktion und <code>onsuccess</code>-Callbacks herumzuschlagen, schreibt man einfach herunter, was man mit der Datenbank anstellen möchte:
<pre><code class="prettyprint language-javascript">// Beispiel mit db.js
server.people.add({
  firstName: 'Aaron',
  lastName: 'Powell',
  answer: 42
}).done(function(item){
  // item stored
});</code></pre>
<p>
Und das wäre eigentlich schon alles, was ich in Sachen Libraries auftreiben konnte. Aus der Ecke der Microsoft-Fans kommt außerdem noch <a href="http://linq2indexeddb.codeplex.com/">Linq2IndexedDB</a>, das aber in einem Maße unterdokumentiert ist, dass wir am besten so tun, als hätte ich es gar nicht verlinkt.


<h3>Fazit</h3>
<p>
Unter zuhilfenahme aller Polyfills und Tricks sieht es mit der Browserunterstützung für Indexed&nbsp;DB eigentlich vergleichsweise gut aus:
<table class="data">
<tr>
<th>Browser
<th>Unterstützung ab Version
<tr>
<td><b>Firefox</b>
<td>4*<sup>†</sup> / 16+
<tr>
<td><b>Chrome</b>
<td>11*<sup>†</sup> / 23* / 24+
<tr>
<td><b>Safari</b>
<td>- (&lt; 5.1+)
<tr>
<td><b>Opera</b>
<td>- (&lt; 12.1+)
<tr>
<td><b>Internet Explorer</b>
<td>10+
<tr>
<td><b>Mobile Safari</b>
<td>- (&lt; 5.1+)
<tr>
<td><b>Android Browser</b>
<td>4.?<sup>†</sup> (2.1+)
</table>

<p><small>
* Mit Vendor-Prefix
<br>
<sup>†</sup> Implementierung entspricht nicht aktuellen Specs
<br>
In Klammern: mit Polyfill</small>
<p>
Klar: die üblichen schwarzen Schafe, die alten IE und das, was bei Android als Browser durchgeht, sind mal wieder die Fortschrittsverhinderer. Richtig ruhmvoll ist natürlich auch das Abschneiden von Opera und Safari nicht, aber der recht gute Polyfill (bzw. die verschiedenen Polyfills) lindert den Schmerz doch erheblich. Dramatischer erscheint mir das Fehlen an richtig guten Tools für Indexed&nbsp;DB&nbsp;&ndash; die Browser mit nativer Unterstützung sowie interessierte JavaScript-Nerds mit Datenbank-Wissen sollten an dieser Front dringend nachrüsten. Ich hätte gern sowas wie <a href="http://mongoosejs.com/index.html">Mongoose</a> für Indexed&nbsp;DB.
<p>
Alles in allem lässt sich sagen, dass Indexed&nbsp;Database nach HTML5-Maßstäben eine bereits relativ runde Sache ist. Die Spezifikationen sind recht stabil und die Funktionen in allen Browserfamilien zum funktionieren zu bekommen. Allein in Sachen Tools und Libraries fehlt es noch, aber das sollte ein im Laufe der Zeit lösbares Problem sein.


<h3>Ein und Link eine Warnung</h3>
<p>
Da diese beiden Artikel hier nur einen sehr sehr grober Überblick geben konnten, möchte ich gern noch auf die wie immer erstklassige <a href="https://developer.mozilla.org/en-US/docs/IndexedDB">MDN-Dokumentation zum Thema</a> hinweisen, die aktuell und auch sehr vollständig ist. Und zum Abschluss noch eine Warnung: ähnlich wie die Implementierung im Android-Browser gibt es auch Artikel zu Indexed&nbsp;DB, die auf einer heute veralteten Fassung der Spezifikationen basieren. Diese Artikel kann man daran erkennen, dass in ihnen eine <code>setVersion()</code>-Funktion besprochen wird, die es in der aktuellen Fassung nicht mehr gibt. Wenn ihr also in einem Artikel zu Indexed&nbsp;DB über <code>setVersion()</code> stolpert, lest lieber anderswo weiter.<img src="http://vg09.met.vgwort.de/na/d894ca99f96d40d0a01fab92ab114f03" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=wa2XFTerlz0:9ymqTXpNOnY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/wa2XFTerlz0" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-2-browsermacken-tools-und-polyfills/</feedburner:origLink></item>
<item>
<title><![CDATA[Indexed DB, die neue HTML5-Datenbank im Browser. Teil 1: ein kurzer Überblick]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/jvsdL55HsFA/</link>
<description><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/badge_offline.png" alt="Logo für HTML5 Offline-Technologien" style="margin:0 0 0.75em 0"></figure>
<p>
Die <a href="http://www.w3.org/TR/IndexedDB/">Indexed Database API</a> (kurz Indexed DB) nimmt in der Web-Plattform die Rolle der dicken Datenbank ein. Während <a href="http://www.w3.org/TR/webstorage/">Web Storage</a> als Cookie-Ersatz eingeplant ist und nicht als zuverlässiger Datenspeicher für große Applikationen taugt, ist Indexed DB genau dafür gedacht. Anders als bei Web Storage kann Indexed DB neben Strings auch&#8230;</p></img>]]></description>
<pubDate>Mo, 21 Jan 2013 15:06:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-1-ein-kurzer-ueberblick/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<figure class="right"><img src="http://cdn2.peterkroener.de/uploads/2013/badge_offline.png" alt="Logo für HTML5 Offline-Technologien" style="margin:0 0 0.75em 0"></figure>
<p>
Die <a href="http://www.w3.org/TR/IndexedDB/">Indexed Database API</a> (kurz Indexed DB) nimmt in der Web-Plattform die Rolle der dicken Datenbank ein. Während <a href="http://www.w3.org/TR/webstorage/">Web Storage</a> als Cookie-Ersatz eingeplant ist und nicht als zuverlässiger Datenspeicher für große Applikationen taugt, ist Indexed DB genau dafür gedacht. Anders als bei Web Storage kann Indexed DB neben Strings auch Zahlen, Objekte und Arrays persistent speichern und selbst Blobs stellen kein Problem dar. Darüber hinaus können die gespeicherten Inhalte einfach aus der Datenbank herausgepickt werden und über Teile der Daten zu iterieren ist auch möglich&nbsp;&ndash; wie es bei einer richtigen Datenbank eben sein sollte. Damit stellt diese API einen wichtigen Mosaikstein im HTML5-Universum dar, denn einen anderen großkalibrigen Datenspeicher für offlinefähige Webapps wird es so bald nicht nicht browserübergreifend geben.
<p>
Nachdem ich fast zwei Wochen lang nichts weiter getan habe, als in den Spezifikationen und Implementierungen von Indexed&nbsp;DB herumzustochern, wird es Zeit, Bericht zu erstatten. Dieser erste Teil behandelt das Wesen der API gemäß der Spezifikationen. Das hier durchexerzierte Beispiel sollte aus dem Stand in aktuellen Chrome- und Firefox-Versionen sowie im Internet Explorer&nbsp;10 funktionieren&nbsp;&ndash; wie man Indexed&nbsp;DB auch allen anderen Browserfamilien beibringt und was es an Fallstricken und Tools gibt, folgt <a href="http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-2-browsermacken-tools-und-polyfills/">im zweiten Teil</a>.

<h3>Wieso Indexed DB?</h3>
<p>
IndexedDB ist eine <a href="http://de.wikipedia.org/wiki/NoSQL">NoSQL-Datenbank</a>, ähnlich wie die in der Open-Source-Welt bekannten CouchDB und MongoDB. Solche Datenbanken haben anders als z.B. MySQL keine festen Datenbanktabellen, sondern bestehen aus Ansammlungen von „Dokumenten“ (meist JSON-Objekte) als Datensätzen. Innerhalb einer solchen Ansammlung können die einzelnen Datensätze bei Bedarf unterschiedlich aufgebaut sein, was mit einer starren Tabellenstruktur wie in den bekannten SQL-Datenbanken nicht ohne weiteres möglich ist. Der Preis für diese Flexibilität ist natürlich, dass die Applikation, die mit der Datenbank arbeitet, für alle unterschiedlich aufgebauten Dokumente gerüstet sein muss&nbsp;&ndash; die Datenbank wird im Vergleich zu SQL also konzeptionell vereinfacht, die Applikation potenziell komplexer. Behauptungen, nach denen das eine Modell skalierbarer oder performanter sei als das andere, dürften für die Arbeit im Webbrowser wohl erst mal von untergeordneter Bedeutung sein.
<p>
Obwohl NoSQL zur Zeit recht hip ist (in dem Rahmen, in dem Datenbanken hip sein können), ist es dennoch im Vergleich zu SQL die eher ungewöhnliche Lösung. Warum kommt gerade die in unsere Browser? Es gab mit <a href="http://www.w3.org/TR/webdatabase/">Web SQL Database</a> mal einen Ansatz, SQL-Datenbanken im Rahmen von HTML5 zu standardisieren, was aber 2010 gescheitert ist. Alle Browserhersteller, die an Web SQL interessiert waren, haben als Basis ihrer Umsetzung SQLite gewählt, ein bewährtes Open-Source-Datenbanksystem. In Folge traten auf dem Weg zur Standardisierung zwei Probleme auf:
<ol>
<li>Hätte ein Browserhersteller ein anderes System als SQLite als Datenbank-Backend gewählt, wäre dessen Subset der SQL-Syntax nicht das gleiche gewesen, wie das der anderen Browser und die Implementierungen wären nicht kompatibel gewesen
<li>Solange nicht zwei voneinander unabhängige Implementierungen einer Technologie vorliegen, kann diese nicht zum Webstandard erhoben werden
</ol>
<p>
Aus dieser Zwickmühle gab es nur einen Ausweg: hinfort mit Web&nbsp;SQL, her mit einer von Grund auf neuen Lösung. Die Spezifikationen für Indexed&nbsp;DB beschreiben ein komplett eigenes NoSQL-System, von der Browser-API bis hin zu den <a href="http://www.w3.org/TR/IndexedDB/#database-operations">Algorithmen der einzelnen Datenbank-Operationen</a>. Jeder Browserhersteller kann anhand dessen seine eigene Implementierung bauen, die dann trotzdem kompatibel zur Konkurrenz ist und auf dem Weg zum Webstandard nicht stört.



<h3>Hallo Welt mit Indexed DB I: Datenbank und Object Stores</h3>
<p>
Die API von Indexed&nbsp;DB in ihrer Gesamtheit ist recht komplex, weswegen wir uns in diesem Post auf das Durchexerzieren eines einfaches Schreiben-Lesen-Löschen-Beispiels beschränken, bei dem wir lediglich die Namen toller Browser-Features in einer Datenbank ablegen. Wie jede NoSQL-Datenbank hat auch Indexed&nbsp;DB seine ganz eigene Terminologie. Diese wird in den Spezifikationen <a href="http://www.w3.org/TR/IndexedDB/#constructs">umfassend erklärt</a>; die wichtigsten Begriffe sind die Folgenden:
<ul>
<li><strong>Datenbanken</strong> enthalten <em>Object Stores</em>
<li><strong>Object Stores</strong> entsprechen Datenbank-Tabellen und enthalten <em>Datensätze</em>
<li>Ein <strong>Datensatz</strong> ist ein <em>Key</em> mit einem dazugehörigen <em>Wert</em>
<li>Ein <strong>Key</strong> kann ein String eine Zahl oder ein Array sein und identifiziert einen Datensatz
<li><strong>Werte</strong> können alles mögliche sein: Strings, Zahlen, Objekte, Arrays, Blobs&nbsp;…
<li><strong>Transaktion</strong> sind ein Set gemeinsam durchgeführter Operationen
<li><strong>Cursor</strong> sind ein Iterationsmechanismus für größere Mengen von Datensätzen
</ul>
<p>
Um etwas mit Indexed&nbsp;DB zu machen, braucht es zunächst eine Datenbank. Eine solche lässt sich ganz einfach per <code>window.indexedDB.open()</code> öffnen bzw. erzeugen:
<pre><code class="prettyprint language-javascript">// Datenbank anlegen
var request = indexedDB.open('html5', 1);</code></pre>
<p>
Die Datenbanken sind nach Origin (Kombination aus Host, Protokoll und Port einer Webapp) getrennt, d.h. foo.com kann nicht die Datenbank von www.bar.de öffnen.
<p>
Das erste Funktionsargument von <code>indexedDB.open()</code> ist der Name der Datenbank, das zweite die Versionsnummer. Diese Nummer wird für die interne Versionierung der Webapp verwendet&nbsp;&ndash; wann immer man Änderungen an der Struktur der DB vornehmen möchte, ändert man diese Zahl. Diese Änderung hat dann Auswirkung auf die Events der Datenbank-Anlege-Operation. Wie der obrige Code mit seinem <code>var request</code> bereits erahnen lässt, wird in der Zeile mit <code>indexedDB.open()</code> nicht wirklich die Datenbank angelegt, sondern es wird ein entsprechender asynchroner Request gestartet. Ist dieser abgeschlossen, feuern die folgenden Events auf dem <code>request</code>-Objekt:
<ol>
<li><code>error</code> wenn etwas beim Anlegen der Datenbank schiefgelaufen ist
<li><code>upgradeneeded</code> wenn die Datenbank-Version sich geändert hat oder die Datenbank erstmals angelegt wurde
<li><code>success</code> wenn die Datenbank geöffnet wurde (nach einem eventuellen <code>upgradeneeded</code>-Event)
</ol> 
<p>
Das <code>upgradeneeded</code>-Event ist von besonderer Bedeutung, denn nur im Event Handler von <code>upgradeneeded</code> können Änderungen an der Datenbankstruktur durchgeführt werden&nbsp;&ndash; versucht man z.B. einen neuen Object Store außerhalb von <code>upgradeneeded</code> anzulegen, setzt es eine Exception.
<p>
Beim ersten Aufruf unseres Beispiels legt der Browser die Datenbank „html5“ neu an, d.h. das <code>upgradeneeded</code>-Event feuert. Wir nutzen dies, um in der Datenbank einen Object Store anzulegen, der unsere liebsten HTML-Features enthalten wird:
<pre><code class="prettyprint language-javascript">// Änderungs/Erzeugungs-Event
request.onupgradeneeded = function(){
  console.log('Datenbank angelegt');
  var db = this.result;
  if(!db.objectStoreNames.contains('features')){
    store = db.createObjectStore('features', {
      keyPath: 'key',
      autoIncrement: true
    });
  }
};</code></pre>
<p>
Mit der <code>createObjectStore()</code>-Methode der frisch angelegten Datenbank (<code>this.result</code> im Event Handler) lassen sich neue Stores anlegen. Als Argumente werden ein Name sowie ein Konfigurations-Objekt übergeben, das in unserem Fall nur die Durchnummerierung der Datensätze festlegt. Hier entscheiden wir uns für automatisch generierte fortlaufende Nummern (<code>autoIncrement: true</code>) im Feld <code>key</code> unserer Einträge (<code>keyPath: 'key'</code>).
<p>
Nach dem <code>upgradeneeded</code>-Event (oder sofort, wenn es keine DB-Änderungen gab) feuert das <code>success</code>-Event, sofern sich die Datenbank fehlerfrei öffnen ließ:
<pre><code class="prettyprint language-javascript">// Öffnungs-Event (feuert nach upgradeneeded)
request.onsuccess = function(){
  console.log('Datenbank geöffnet');
  var db = this.result;
  ...
}</code></pre>
<p>
Ab hier können wir mit Indexed&nbsp;DB in die Vollen gehen und nach Herzenslust Datensätze speichern, auslesen und löschen.



<h3>Hallo Welt mit Indexed DB II: Operationen und Transaktionen</h3>
<p>
Als Beispiel-Datensatz nehmen wir das denkbar einfachste JavaScript-Objekt:
<pre><code class="prettyprint language-javascript">// Zu speichernder Datensatz
var item = { title: 'Web Storage' };</code></pre>
<p>
Um mit Datensätzen in Indexed&nbsp;DB zu arbeiten, braucht es immer die gleichen vier Schritte:
<ol>
<li>Transaktions-Objekt erstellen
<li>Object Store(s) auswählen
<li>Operation(en) starten (<code>put</code>, <code>delete</code> usw.)
<li>Events abwarten
</ol>
<p>
Ein Transaktions-Objekt erhält man, indem man <code>db.transaction()</code> mit den Namen der betroffenen Object Stores sowie den gewünschten Berechtigungen (<code>readonly</code> oder <code>readwrite</code>) füttert:
<pre><code class="prettyprint language-javascript">// Speicher-Transaktion
var trans = db.transaction(['features'], 'readwrite');</code></pre>
<p>
Ab dann ist alles weitere ganz einfach: aus dem Transaktions-Objekt die jeweiligen Object Stores herauspicken (<code>trans.objectStore('storeName')</code>), die gewünschten Operationen veranlassen und auf das <code>success</code>-Event warten:
<pre><code class="prettyprint language-javascript">var store = trans.objectStore('features')
var request = store.put(item); // `item` in dem Store ablegen

// Erfolgs-Event
request.onsuccess = function(evt){
  console.log('Eintrag ' + evt.target.result + ' gespeichert');
  ...
};</code></pre>
<p>
Das gleiche Prinzip greift, wenn Einträge aus eine Object Store ausgelesen werden sollen. Im einfachsten Fall, wenn nur ein Datensatz mit bekanntem Key ausgelesen werden soll, braucht es nur ein <code>store.get(42)</code> um z.B. den Eintrag mit dem Key&nbsp;42 auszulesen.
<p>
Wenn es ein bisschen mehr sein darf, werden Cursor und Key Ranges benötigt. Nachdem die Auslese-Transaktion eröffnet und der Object Store gewählt wurde&nbsp;&hellip;
<pre><code class="prettyprint language-javascript">var trans = db.transaction(['features'], 'readonly');
var store = trans.objectStore('features');</code></pre>
<p>
&hellip; muss Indexed&nbsp;DB mitgeteilt werden, für welchen Daten-Ausschnitt wir uns interessieren. <a href="http://www.w3.org/TR/IndexedDB/#range-concept">Key Ranges</a> sind hier das Mittel der Wahl. Mit einer der Methoden von <code>window.IDBKeyRange</code> lassen sich verschiedene Objekte erzeugen, die solche Ausschnitte beschreiben. Diese Objekte können zwei fixe Grenzwerte haben („alle Einträge von 23 bis 42“) oder nach oben oder unten offen sein (z.B. „alle Einträge ab 42“). Beispiele:
<ul>
<li><code>IDBKeyRange.lowerBound(0)</code> für alle Einträge von 0 bis Ende
<li><code>IDBKeyRange.upperBound(10)</code> für alle Einträge bis 10
<li><code>IDBKeyRange.only(23, 42)</code> für alle Einträge zwischen 23 bis 42
</ul>
<p>
Diese Grenzwerte beziehen sich in unserem Fall auf den Key der Datensätze; möchte man anhand anderer Felder durch die Datensätze rattern, kombiniert man Key Ranges mit <a href="http://www.w3.org/TR/IndexedDB/#index">Indizes</a>. In jedem Fall öffnet man mit <code>openCursor()</code>-Methode von Store oder Index einen Cursor (ggf. mit Richtungsangabe), dessen <code>success</code>-Event für jeden Datensatz einmal feuert. In unserem Fall machen wir es uns so einfach wie möglich:
<pre><code class="prettyprint language-javascript">// Cursor für alle Einträge von 0 bis zum Ende
var range = IDBKeyRange.lowerBound(0);
var cursorRequest = store.openCursor(range);

// Wird für jeden gefundenen Datensatz aufgerufen... und einmal extra
cursorRequest.onsuccess = function(evt){
  var result = evt.target.result;
  ...
};</code></pre>
<p>
Das <code>success</code>-Event feuert für jeden Datensatz sowie wenn alle Datensätze abgearbeitet wurden nochmal. Für gefundene Datensätze ist die <code>target.result</code>-Eigenschaft des Event-Objekts der gefundene Eintrag, beim letzten Event <code>null</code>. Mit dem Datensätzen kann dann die gewünschte Arbeit verrichtet werden und am Ende der Cursor mittels <code>target.result.continue()</code> zum nächsten Eintrag bewegt werden.
<p>
In unserem simplem Beispiel machen wir nichts weiter, als den Eintrag in die Konsole zu schreiben und ihn dann gleich wieder zu löschen:
<pre><code class="prettyprint language-javascript">if(result){
  console.log('Eintrag gefunden:', result.value);

  // Eintrag wieder löschen
  var trans = db.transaction(['features'], 'readwrite');
  var store = trans.objectStore('features');
  var key = result.value.key;
  var request = store.delete(key);
  request.onsuccess = function(evt){
    console.log('Eintrag ' + key + ' gelöscht');
  }
  
  // Cursor zum nächsten Eintrag bewegen
  result.continue();

}</code></pre>
<p>
Und fertig! Damit haben wir nur ein sehr sehr simples Beispiel (<a href="http://cdn2.peterkroener.de/uploads/2013/indexeddbwalkthrough.html">Demo</a>, <a href="https://gist.github.com/4586195">Gist</a>) geschaffen, aber eines, das zumindest die wichtigsten Eckpunkte von Indexed&nbsp;DB demonstriert. Und so richtig schwer war es ja nicht&nbsp;&ndash; Indexed&nbsp;DB folgt dem löblichen Trend moderner HTML5-APIs, möglichst einfache Schnittstellen für die Webapps von morgen bereitzustellen. Bleibt nur die ewige Frage nach der Browserunterstützung&nbsp;&hellip;



<h3>In welchen Browser funktioniert Indexed&nbsp;DB?</h3>
<p>
Grundsätzlich ist diese Frage leicht zu beantworten: <a href="http://caniuse.com/indexeddb">in Chrome, Firefox und IE&nbsp;10 gibt es Unterstützung, ansonsten sieht es finster aus.</a> In allen drei Browsern ist die API mittlerweile ohne Vendor-Prefix benutzbar und es wird allenthalben davon ausgegangen, dass das auch so bleibt, d.h. dass die aktuelle Spezifikationen den Stand des späteren Standards wiederspiegeln.
<p>
Problematisch sind alle Browser, die nicht Chrome, Firefox oder IE&nbsp;10 sind, wobei „problematisch“ gewohnt relativ ist. Zum einen lässt sich Indexed&nbsp;DB per Polyfill für die meisten Browser nachrüsten, zum anderen gibt es durchaus, anders als es Caniuse (noch) angibt, Indexed&nbsp;DB in Android-Browsern ab Version 4&nbsp;&ndash; wenn auch in einer Version aus der frühen Kreidezeit. Alles kein Problem, alles zu fixen, alles in <a href="http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-2-browsermacken-tools-und-polyfills/">Teil&nbsp;2 dieses Artikels</a> beschrieben.<img src="http://vg09.met.vgwort.de/na/d9c7b1ca86784cc7b0ab7a985c66ae42" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=jvsdL55HsFA:hpqkh1iomEk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/jvsdL55HsFA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/indexed-db-die-neue-html5-datenbank-im-browser-teil-1-ein-kurzer-ueberblick/</feedburner:origLink></item>
<item>
<title><![CDATA[Termine für Januar, Februar und März 2013]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/FHGSczpkd5k/</link>
<description><![CDATA[<p>
Der Erklärbär ist wieder auf Tour! Falls ihr euch mit HTML5- und CSS3-Wissen betanken lassen möchtet, habe ich im ersten Quartal exakt je eine solche Gelegenheit für euch auf Lager:

<ul>

<li><strong>4. - 6. Februar in München</strong>: <a href="http://www.opensourceschool.de/kurstermine/muenchen/schulung/html5-02-2013/">HTML5-Schulung bei der Open Source School.</a> Mein bewährtes drei­tä­gi­ges HTML5-Standardprogramm stattet die Teilnehmer im Druckbetankungsverfahren mit so gut wie allem aus, was man zu HTML5 wissen muss. Von semantischem Markup bis hin zu Canvas-Programmierung ist&#8230;</li></ul></p>]]></description>
<pubDate>Mi, 16 Jan 2013 13:37:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/termine-fuer-januar-februar-und-maerz-2013/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
Der Erklärbär ist wieder auf Tour! Falls ihr euch mit HTML5- und CSS3-Wissen betanken lassen möchtet, habe ich im ersten Quartal exakt je eine solche Gelegenheit für euch auf Lager:

<ul>

<li><strong>4. - 6. Februar in München</strong>: <a href="http://www.opensourceschool.de/kurstermine/muenchen/schulung/html5-02-2013/">HTML5-Schulung bei der Open Source School.</a> Mein bewährtes drei­tä­gi­ges HTML5-Standardprogramm stattet die Teilnehmer im Druckbetankungsverfahren mit so gut wie allem aus, was man zu HTML5 wissen muss. Von semantischem Markup bis hin zu Canvas-Programmierung ist alles dabei. Geboten wird ein großer Praxisanteil, kleine Arbeitsgruppen und ein Buch gibt es obendrein.

<li><strong>7. - 8. Februar in München</strong>: <a href="http://www.opensourceschool.de/kurstermine/muenchen/schulung/css3-02-2013/">CSS3-Schulung bei der Open Source School.</a> Mein zweitä­gi­ges CSS3-Standardprogramm katapultiert die Teilnehmer in das CSS3-Zeitalter, in dem Webfonts und Farbverläufe fließen. Einen großer Praxisanteil, kleine Arbeitsgruppen und ein Buch als Bonus gibt es auch hier.

</ul>

<p>
Das HTML5-Programm wird zur Zeit grundlegend aktualisiert, unter anderem kommen mittlerweile auch Indexed DB, getUserMedia und viele andere neuere Spielereien vor, die nicht im Buch stehen.<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=FHGSczpkd5k:4HfmazCTq9Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/FHGSczpkd5k" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/termine-fuer-januar-februar-und-maerz-2013/</feedburner:origLink></item>
<item>
<title><![CDATA[Ein neues Element für HTML5: &lt;main&gt;]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/XqvWisNtwq0/</link>
<description><![CDATA[<p>
Wie sicher den Wenigsten entgangen ist, wird fleißig an <a href="http://www.w3.org/TR/html-main-element/">einem neuen Element für HTML5 gearbeitet</a>. Das <code><main></code>-Element soll <q lang="en">for the identification of the main content area of a document</q> genutzt werden und damit die bekannten HTML5-Elemente <code><section></code>, <code><header></code> und Konsorten ergänzen. Stand heute ist das Ganze eigentlich noch nichts weiter, als ein Vorschlag zur Erweiterung des bestehenden Standards, doch da weitgehend Konsens über die Einführung des neuen Elements besteht, kann man sich&#8230;</header></section></main></p>]]></description>
<pubDate>Mi, 02 Jan 2013 14:59:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/ein-neues-element-fuer-html5-main/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
Wie sicher den Wenigsten entgangen ist, wird fleißig an <a href="http://www.w3.org/TR/html-main-element/">einem neuen Element für HTML5 gearbeitet</a>. Das <code>&lt;main&gt;</code>-Element soll <q lang="en">for the identification of the main content area of a document</q> genutzt werden und damit die bekannten HTML5-Elemente <code>&lt;section&gt;</code>, <code>&lt;header&gt;</code> und Konsorten ergänzen. Stand heute ist das Ganze eigentlich noch nichts weiter, als ein Vorschlag zur Erweiterung des bestehenden Standards, doch da weitgehend Konsens über die Einführung des neuen Elements besteht, kann man sich <code>&lt;main&gt;</code> durchaus schon genauer anschauen.



<h3>Wozu &lt;main&gt;?</h3>
<p>
Das neue Element bietet genau wie alle anderen neuen HTML5-Elemente zwei Dinge: zum einen ist es ein zusätzliches Sprachmittel für die Auszeichnung von Website-Teilbereichen, zum anderen hat es eingebaute ARIA-Funktionen, die wenn das neue Element korrekt benutzt wird, automatisch der Barrierefreiheit der Seite guttun. In Sachen Optik und Verhalten entspricht es genau wie <code>&lt;section&gt;</code> und Konsorten dem, was man vom guten alten <code>&lt;div&gt;</code> kennt.
<p>
Gedacht ist <code>&lt;main&gt;</code> für die Auszeichnung des jeweiligen Hauptinhalts einer Seite; im Falle eines Blogs wäre das zum Beispiel die Spalte mit allen Artikeln:

<pre><code class="prettyprint language-html">&lt;!doctype html&gt;
&lt;meta charset="utf-8"&gt;
&lt;title&gt;Katzenbilder24.com&lt;/title&gt;

&lt;header&gt;
  &lt;h1&gt;Katzenbilder-Blog&lt;/h1&gt;
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="/"&gt;Start&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="/about"&gt;Über&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
&lt;/header&gt;

<mark>&lt;main&gt;</mark>
  &lt;article&gt;
    &lt;h2&gt;Flauschiges Kätzchen&lt;/h2&gt;
    &lt;p&gt;Text, Bild...&lt;/p&gt;
  &lt;/article&gt;
  &lt;article&gt;
    &lt;h2&gt;Pelziges Kätzchen&lt;/h2&gt;
    &lt;p&gt;Text, Bild...&lt;/p&gt;
  &lt;/article&gt;
<mark>&lt;/main&gt;</mark>

&lt;aside&gt;
  &lt;section&gt;
    &lt;h2&gt;Tagcloud&lt;/h2&gt;
    &lt;p&gt;Tags, Tags, Tags&lt;/p&gt;
  &lt;/section&gt;
  &lt;section&gt;
    &lt;h2&gt;Blogroll&lt;/h2&gt;
    &lt;p&gt;Links, Links, Links&lt;/p&gt;
  &lt;/section&gt;
&lt;/aside&gt;</code></pre>

<p>
Anders als <code>&lt;section&gt;</code> hat <code>&lt;main&gt;</code> keinen Einfluss auf die Überschriftenstruktur (Outline) einer Webseite und es darf auch nicht in anderen Abschnitts-Elementen vorkommen&nbsp;&ndash; es soll den Hauptinhalt einer <em>Seite</em> markieren, nicht den Hauptinhalt eines Abschnitts der Seite. Ein korrekt verwendetes <code>&lt;main&gt;</code>-Element hat demnach keine <code>&lt;article&gt;</code>, <code>&lt;aside&gt;</code>, <code>&lt;footer&gt;</code>, <code>&lt;header&gt;</code> oder <code>&lt;nav&gt;</code>-Elemente als Vorfahren und ist das einzige Element seiner Art auf der Seite.

<p>
Als Bonus hat <code>&lt;main&gt;</code>, wie alle anderen neuen HTML5-Elemente auch, fest eingebaute <a href="http://www.w3.org/TR/wai-aria/">ARIA-Eigenschaften</a>. Das bedeutet im Endeffekt, dass man bei der korrekten Verwendung von <code>&lt;main&gt;</code> ohne zusätzlichen Aufwand eine zugänglichere Webseite erstellt, da das neue Element automatisch ein <code>role="main"</code> trägt. Dank <code>&lt;main&gt;</code> wird es in Zukunft ziemlich schwierig, diese Annotation zu vergessen.



<h3>Braucht man &lt;main&gt; überhaupt?</h3>
<p>
Einige haben argumentiert, dass man das neue Element gar nicht bräuchte, denn es wäre ja möglich, den Hauptinhalt einer Webseite einfach dadurch zu kennzeichnen, dass man ihn „den Rest“ sein lässt. Beispiel:

<pre><code class="prettyprint language-html">&lt;!doctype html&gt;
&lt;meta charset="utf-8"&gt;
&lt;title&gt;Katzenbilder24.com&lt;/title&gt;

&lt;header&gt;
  &lt;h1&gt;Katzenbilder-Blog&lt;/h1&gt;
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="/"&gt;Start&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="/about"&gt;Über&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
&lt;/header&gt;

&lt;article&gt;
  &lt;h2&gt;Flauschiges Kätzchen&lt;/h2&gt;
  &lt;p&gt;Text, Bild...&lt;/p&gt;
&lt;/article&gt;
&lt;article&gt;
  &lt;h2&gt;Pelziges Kätzchen&lt;/h2&gt;
  &lt;p&gt;Text, Bild...&lt;/p&gt;
&lt;/article&gt;

&lt;aside&gt;
  &lt;section&gt;
    &lt;h2&gt;Tagcloud&lt;/h2&gt;
    &lt;p&gt;Tags, Tags, Tags&lt;/p&gt;
  &lt;/section&gt;
  &lt;section&gt;
    &lt;h2&gt;Blogroll&lt;/h2&gt;
    &lt;p&gt;Links, Links, Links&lt;/p&gt;
  &lt;/section&gt;
&lt;/aside&gt;</code></pre>

<p>
Auch ohne <code>&lt;main&gt;</code> ist klar, was hier der Hauptinhalt ist; alles, was nicht in <code>&lt;header&gt;</code> und <code>&lt;aside&gt;</code> steht, also die Ansammlung der Article-Elemente. Dank <code>role</code>-Attribut ist auch der Barrierefreiheit so viel Genüge getan, wie es mit dem neuen Element der Fall wäre. Es gibt aber vier gute Argumente, die für die Einführung des neuen Elements sprechen:

<ul>

<li>Ein Bereich, der <em>der</em> Hauptinhalt einer Webseite ist, kommt auf vergleichsweise vielen Webseiten vor. Vermutlich auf den meisten. Insofern ist es naheliegend, hierfür ein eigenes Element einzuführen, denn schließlich haben andere häufig auftretende Konstruktionen wie z.B. Navigationen ja auch ihre eigenen Elemente.

<li>Aus eigener Erklärbär-Erfahrung kann ich berichten, dass HTML5-Neulinge, wenn man sie Markup schreiben lässt, fast immer den Hauptinhalt in ein Extra-Element Marke <code>&lt;section id="main"&gt;</code> kapseln. Es scheint so zu sein, dass es autorenfreundlich wäre, dafür ein passendes Werkzeug d.h. das neue Element bereitzustellen.

<li>Es wäre zwar möglich, manuell <code>role="main"</code>-Attribute zu vergeben, aber es ist zu bezweifeln, dass das wirklich auf breiter Front passiert. Mit dem neuen Element kann das nicht mehr vergessen werden, was (korrekte Verwendung des Elements vorausgesetzt) ohne zusätzlichen Aufwand der Zugänglichkeit der Webseite guttäte&nbsp;&ndash; weniger Arbeit für den Autoren, mehr Spaß beim Benutzer.

<li>Die HTML Design Principles <a href="http://www.w3.org/TR/html-design-principles/#priority-of-constituencies">sagen ganz klar</a>: <q lang="en">In case of conflict, consider users over authors over implementors over specifiers over theoretical purity</q>

</ul>

<p>
Bis auf die theorietreue Sparsamkeitsfraktion würden also alle Beteiligten von der Einführung des <code>&lt;main&gt;</code>-Elements profitieren. Bleibt also nur die Frage: wann kommt die Einführung?



<h3>Welche Browser unterstützen &lt;main&gt;?</h3>
<p>
Zur Zeit gibt es das neue (wirklich sehr neue) Element nur als Experimental-Implementierung in Preview-Versionen von Firefox und Chrome. Das ist allerdings nicht zwingend ein Problem, da die Funktionalität von <code>&lt;main&gt;</code> händisch nachgerüstet werden kann. Vorausgesetzt der Browser verarbeitet das Element prinzipiell richtig (was alle Browser außer IE&nbsp;6, 7 und 8 machen sollten), so muss es nur richtig formatiert und mit den passenden ARIA-Attributen versehen werden. Heißt also: <code>display:block</code> im CSS vergeben und bei der Benutzung in HTML nicht das Attribut <code>role="main"</code> vergessen. Dies wird zwar, sobald alle Browser das neue Element nativ unterstützen, doppelt gemoppelt sein, aber das ist, wenn überhaupt, ein Problem, dessen Lösung man sicher guten Gewissens auf diesen fernen Zeitpunkt vertagen kann.
<p>
Wie immer gilt aber, dass <a href="http://www.peterkroener.de/ueberlegungen-zur-html5-umstellung-von-webseiten/">in Sachen HTML5-Markup keine übermäßige Eile geboten ist</a>. Alle „alten“ Webseiten werden auch in Zukunft ohne <code>&lt;main&gt;</code> ganz wunderbar funktionieren&nbsp;&ndash; nur wenn ein Redesign ansteht, lohnt es sich, über den Einsatz des neuen Elements nachzudenken.<img src="http://vg09.met.vgwort.de/na/c6c640f4478445c2855adb4d8399013b" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=XqvWisNtwq0:avSLcI16BOs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/XqvWisNtwq0" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/ein-neues-element-fuer-html5-main/</feedburner:origLink></item>
<item>
<title><![CDATA[HTML 5 wird 2014 Webstandard - Was bedeutet das, was ändert sich?]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/2c1shQ3kg-4/</link>
<description><![CDATA[<p>
<a href="http://dev.w3.org/html5/decision-policy/html5-2014-plan.html">Man liest</a>, das W3C plane HTML 5.0 im vierten Quartal 2014 fertig, d.h. in einen stabilen Webstandard verwandelt zu haben. Features die sich nicht in diesen Zeitplan quetschen lassen, sollen nach HTML 5.1 verschoben werden, mit dem dann Ende 2016 zu rechnen ist. Das klingt erst mal recht unkompliziert, aber da allerorten mit dem Begriff „HTML5“ etwas unbedacht umgegangen wird (auch in dem W3C-Plandokument) ist etwas unklar, was konkret denn nun 2014 fertig sein soll. Und natürlich lohnt es sich zu fragen, welche Auswirkungen&#8230;</p>]]></description>
<pubDate>Do, 29 Nov 2012 15:07:00</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/html-5-wird-2014-webstandard-was-bedeutet-das-was-aendert-sich/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
<a href="http://dev.w3.org/html5/decision-policy/html5-2014-plan.html">Man liest</a>, das W3C plane HTML 5.0 im vierten Quartal&nbsp;2014 fertig, d.h. in einen stabilen Webstandard verwandelt zu haben. Features die sich nicht in diesen Zeitplan quetschen lassen, sollen nach HTML&nbsp;5.1 verschoben werden, mit dem dann Ende 2016 zu rechnen ist. Das klingt erst mal recht unkompliziert, aber da allerorten mit dem Begriff „HTML5“ etwas unbedacht umgegangen wird (auch in dem W3C-Plandokument) ist etwas unklar, was konkret denn nun 2014 fertig sein soll. Und natürlich lohnt es sich zu fragen, welche Auswirkungen diese Erhebung zum Standard denn haben wird. Ich hatte das bereits in der <a href="http://workingdraft.de/98/">letzten Folge von Working Draft</a> aufgedröselt, aber der Vollständigkeit halber möchte ich hier nochmal aufschreiben, was es mit diesem Plan auf sich hat und was er für HTML5 zu bedeuten hat.

<h3>HTML5 oder HTML&nbsp;5?</h3>
<p>
Man kann „HTML5“ entweder mit oder Leerzeichen vor der Fünf scheiben. Die Schreibweise ohne Leerzeichen <a href="http://blog.whatwg.org/spelling-html5">ist im WHATWG-Lager usus</a>, Freunde des W3C haben es lieber <a href="http://meiert.com/en/blog/20090911/html-5-or-html5/">mit Leerzeichen</a>. Die <a href="http://www.whatwg.org/">WHATWG</a> ist, wir erinnern uns, jene Arbeitsgruppe der Browserhersteller, die ursprünglich die Entwicklung der ganzen schönen neuen Webtechnologien losgetreten hatten. Die <a href="http://www.w3.org/html/wg/">HTML-Arbeitsgruppe des W3C</a> befasst sich mit einem Teilaspekt der WHATWG-Spezifikationen&nbsp;&ndash; jenem, der sich vorrangig mit HTML5 im Sinne von HTML befasst. Von diesen beiden Arbeitsgruppen ist weiterhin der allgemeine Sprachgebrauch zu unterscheiden, der den Begriff HTML5 noch viel weiter fasst. Ein Bild sagt mehr als tausend Worte:
<figure>
<a href="http://cdn2.peterkroener.de/uploads/2012/SpecGraph.png" class="imagelink"><img width="640" height="520" src="http://cdn2.peterkroener.de/uploads/2012/SpecGraph_klein.png" alt="Grafik, die das Verhältnis von diversen Webtechnologie-Spezifikationen zueinander illustriert"></a>
</figure>
<p>
Der große grüne Kreis ist die Spezifikation der WHATWG, und der große blaue Kreis innen ist die Spezifikation des W3C. Wenn man die Inhaltsverzeichnisse <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/">beider</a> <a href="http://www.w3.org/TR/html5/">Spezifikationen</a> vergleicht, wird der Unterschied klar: währen die WHATWG auch diverse JavaScript-APIs spezifiziert, enthält das W3C-Dokument fast nur HTML im Sinne von HTML. Das heißt aber nicht, dass das W3C sich nicht auch um die JS-Apis kümmern würde, nur ist es eben so, dass einiges, was bei der WHATWG Teil von HTML5 ist, beim W3C in einem eigenen Spezifikationsprozess bearbeitet wird (z.B. der Canvas 2D-Context bei <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#2dcontext">WHATWG</a> und <a href="http://www.w3.org/TR/2dcontext/">W3C</a>). Der große gelbe Kreis bildet den allgemeinen Sprachgebrauch ab, der unter HTML5 alles vereinigt, was es schönes neues im Browser gibt, von HTML-Tags bis hin zu clientseitigen Datenbanken. Das ist das, was Otto Normalverbraucher mit „HTML5“ meint.

<h3>Was wurde beschlossen (und wie schreibt man es)?</h3>
<p>
Das, was das W3C in seinem Plan für&nbsp;2014 anpeilt, ist die Anfertigung eines Snapshots vom Dokument der W3C HTML-Arbeitsgruppe (großer blauer Kreis). Die Spezifikationen sollen bis Ende&nbsp;2014 so weit stabilisiert werden, dass man es zur Recommendation, d.h. zu fertigen Standard erklären kann. Alle anderen Dokumente inklusive der HTML5-Spezifikationen der WHATWG sind davon nicht betroffen. Weil das W3C-Dokument sich vor allem um Parser und HTML-Tags und weniger um Browser-APIs dreht, würde dieser neue Webstandard dann auch tatsächlich eine neue Version von HTML darstellen. Dieser neue Standard hätte dann auch die Schreibweise „HTML&nbsp;5“ verdient&nbsp;&ndash; hier wäre die 5 eine echte Versionsnummer und nicht wie bei „HTML5“ nur Teil eines Namens. Und wenn man schon wieder Versionsnummern hat, so spricht auch nichts mehr gegen Folgeversionen wie 5.1 und weiteres.
<p>
Es wäre natürlich praktisch, wenn sich die Welt darauf einigen könnte, die Schreibweise „HTML5“ für die Buzzword-Bedeutung der neuen Technologien zu reservieren und „HTML&nbsp;5“ bzw. „HTML&nbsp;5.0“ für die W3C-Spezifikationen zu verwenden (das W3C wirft beides in seinem Plan-Dokument wild durcheinander). So würde uns einerseits der liebgewonnene Oberbegriff erhalten bleiben, andererseits könnte man über die nächste Version einer Auszeichnungssprache sprechen (oder eher schreiben), ohne sich dem Verdacht auszusetzen, ein JavaScript-Supernerd oder gar ein überhypter Nichtsblicker zu sein. Ob es soweit kommt, wird die Zeit zeigen, aber ich werde dieses System auf jeden Fall in Zukunft verwenden.
<p>
Dokumente und Recommendations hin oder her: was ändert sich denn nun durch die Standardisierung einer neuen HTML-Version? Eigentlich nichts.

<h3>Was sind die Auswirkungen?</h3>
<p>
Webstandards sind praktisch immer deskriptiv und nicht normativ. Eine Technologie wird nicht zum Standard, indem das W3C sie aufschreibt und folgsame Browserhersteller sie implementieren, sondern es läuft fast immer umgekehrt. Die Programmierer von Browser&nbsp;A erfinden ein neues Feature, die Programmierer von Browser&nbsp;B implementieren etwas ähnliches, man einigt sich auf einen einheitlichen Kompromiss und das W3C schreibt das Endergebnis auf. Somit dürfte klar sein, dass in dem fertigen Standard nichts drin stehen wird, was neu ist, sondern er wird die dann bestehende Browser-Realität abbilden und für die Zukunft festschreiben.
<p>
Für Webentwickler gibt es also eigentlich nichts, was sich im Q4&nbsp;2014 ändert. Falls auch dann jemand noch den Internet Explorer&nbsp;8 unterstützen muss (Gott bewahre!), so wird er sich nichts davon kaufen können, dass es eine Recommendation für <code>&lt;section&gt;</code> gibt, denn dieses Feature wird der IE8 auch 2014 nicht unterstützen. Auch wird die Standardisierung von HTML&nbsp;5.0 nicht das Ende des zur Zeit chaotischen Entwicklungsmodells oder des allgemein „unfertigen“ Eindrucks der Web-Plattform bedeuten. Zwar wird dann einiges in Browsern möglich sein, was heute nur in Chrome-Nightlies funktioniert, doch dafür werden sich die Browser-Programmierer bis dahin neue Features ausgedacht haben, über deren Nichtfunktionieren wir uns dann aufregen können.
<p>
Wenn also aus „HTML5“ demnächst „HTML&nbsp;5.0“ wird und es mit dem Recommendation-Stempel versehen wird, heißt es also aus der Perspektive der Webentwickler mal wieder: Raider heißt jetzt Twix&nbsp;&hellip; sonst ändert sich nix.<img src="http://vg09.met.vgwort.de/na/f9eee12caf1a4f24b1995415b41cc873" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=2c1shQ3kg-4:_XAOXelulrc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/2c1shQ3kg-4" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/html-5-wird-2014-webstandard-was-bedeutet-das-was-aendert-sich/</feedburner:origLink></item>
<item>
<title><![CDATA[Fragen zu HTML5 & Co beantwortet 8&nbsp;&ndash; CORS, Z-Index, Drag & Drop, Default-Styles]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/d9GH3zh9XuQ/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 & Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 & Co 5</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-6/">Fragen zu HTML5 & Co 6</a>
<li><a&#8230;</a></li></li></li></li></li></li></li></ol></p></div>]]></description>
<pubDate>Mo, 29 Okt 2012 10:33:58</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-8-cors-z-index-drag-und-drop-default-styles/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 &amp; Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 &amp; Co 5</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-6/">Fragen zu HTML5 &amp; Co 6</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-7-doctypes-css-transformationen-codecs-semantik/">Fragen zu HTML5 &amp; Co 7</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-8-cors-z-index-drag-und-drop-default-styles/">Fragen zu HTML5 &amp; Co 8</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-9-leerzeichen-canvas-resiszing-slashes-fullscreen-video-ios/">Fragen zu HTML5 &amp; Co 9</a>
</ol>
</div>

<p>
Es hat etwas gedauert, aber ich habe wieder vier Fragen und Antworten zu HTML5, CSS3 und Konsorten für euch zusammengekratzt. Warum kriege ich in letzter Zeit so wenig Fragen? Ihr wisst doch: <a href="kontakt/">eine E-Mail</a> oder <a href="https://twitter.com/sir_pepe">ein Tweet genügen</a>!


<h3>How to CORS?</h3>
<blockquote>
<p>
Ich möchte einen XMLHttpRequest an eine API machen, von der ich einen JSON-String abfragen werde. Wie bekomme ich das hin, dass ich keine Probleme mit Cross-Domain bekomme?
</blockquote>
<p>
Normalerweise werden durch die Same-Origin-Policy (also durch den Browser) Zugriffe unterbunden, die von einer Webseite aus auf eine andere Webseite mit andere Domain unternommen werden. Die Technologie um das zu ändern heißt <a href="http://www.w3.org/TR/cors/">Cross-Origin Resource Sharing</a> (CORS) und wird bereits von vielen Bowsern unterstützt. Um sie zu aktivieren muss man aber am Server Hand anlegen und einen speziellen Header verschicken&nbsp;&ndash; <a href="http://enable-cors.org/">enable-cors.org</a> erklärt wie das geht. Möchte man auch alte Internet Explorer mitschleifen, braucht man neben dem normalen Ajax-Code auch das IE-spezifische XDomainRequest-Objekt. Genaueres dazu weiß <a href="http://www.html5rocks.com/en/tutorials/cors/?redirect_from_locale=de">das CORS-Tutorial von HTML5 Rocks</a>.


<h3>Z-Index und Opacity</h3>
<blockquote>
<p>
Ich bin gerade mit dem nachlesen <a href="http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-7-doctypes-css-transformationen-codecs-semantik/">der siebten Fragerunde zu HTML5 und Co</a> auf deinem Blog fertig geworden. Zum Thema, Transformation und z-Index  war ich sehr verwundert, konnte mich aber an ein ähnliches Problem erinnern. Ich habe einfach mal die <code>transformation</code>-Anweisungen durch eine <code>opacity</code>-Angabe ersetzt. Siehe da ich habe das selbe Problem. Frage nun: ist es aus dem selben Grund? Gibts sowohl für die eine oder andere einen Workaround?</blockquote>
<p>
Ja, das ist in der Tat ganz ähnlich. Die Mechanik hinter Transformationen und Opacity ist fast die gleiche: die Kindelemente eines betroffenen Elements werden mit dem Elternelement zusammengerendert und nur dieses Gesamtwerk wird transformiert bzw. von Opacity-Effekt betroffen. Zitat <a href="http://www.w3.org/TR/css3-color/#transparency">Spezifikationen</a>:
<blockquote><p>
Conceptually, after the element (including its descendants) is rendered into an RGBA offscreen image, the opacity setting specifies how to blend the offscreen rendering into the current composite rendering [...] Since an element with opacity less than 1 is composited from a single offscreen image, content outside of it cannot be layered in z-order between pieces of content inside of it. For the same reason, implementations must create a new stacking context for
any element with opacity less than 1. If an element with opacity less than 1 is not positioned, implementations must paint the layer it
creates, within its parent stacking context, at the same stacking order that would be used if it were a positioned element with
<code>z-index:0</code> and <code>opacity:1</code>.
</blockquote>
<p>
Von einem Workaround ist mir nichts bekannt. Das Außer-Kontext-Rendern ist offenbar ein unumgängliches Funktionsprinzip von Transformationen und Opacity.




<h3>Drag &amp; Drop&nbsp;&ndash; kein Drop-Event im Firefox</h3>
<blockquote>
<p>
Hast du eine Idee, wieso das Drop-Event von HTML5 Drag &amp; Drop im Firefox nicht gefeuert wird? In Chrome funktioniert es ohne Probleme.
</blockquote>
<p>
Kurze Antwort: das Problem lässt sich lösen, indem man das <code>dragover</code>-Event abfängt und mit <code>preventDefault()</code> abbricht, in etwa so:
<pre><code class="prettyprint language-javascript">dropziel.ondragover = function(evt){
    evt.preventDefault();
};</code></pre>
<p>
Lange Antwort: während einer Drag-Operation feuert <a href="http://www.whatwg.org/specs/web-apps/current-work/#dndevents">eine ganze Menge Events</a> und viele von denen muss man, wenn man die API verwenden möchte, einfach abbrechen, damit andere Events funktionieren. Das klingt erst mal verquer, hat aber schon so seinen Sinn. Es sollen schließlich die meisten Elemente in einer Seite <em>keine</em> Ziele für Drag &amp; Drop sein und es ist ganz sinnvoll, auf diesen gar nicht erst <code>drop</code>-Events zuzulassen. Um ein Element zum potenziellen Ziel zu machen muss daher zunächst das <code>dragover</code>-Event abgebrochen werden.
<p>
Warum das neuerdings in Chrome nicht mehr nötig ist, darüber kann ich nur spekulieren. Entweder ist das ein Bug oder die Chrome-Entwickler finden ganz einfach diese Event-Abbrechen-um-Events-stattfinden-zu-lassen-Geschichte so blöde, dass sie sich bewusst dagegen entscheiden. Ich würde ihnen daraus auch keinen übergroßen Vorwurf stricken, denn die API ist im Originalzustand einfach zu bekloppt.



<h3>Wo stehen die Default-Styles?</h3>
<blockquote>
<p>
Gibt es irgendwo eine Übersicht, welches Default-Styling für welche HTML5-Elemente existiert?
</blockquote>
<p>
Diese Übersicht gibt es praktischerweise <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#the-css-user-agent-style-sheet-and-presentational-hints">direkt in den HTML5-Spezifikationen</a>. HTML5 hat den Anspruch, neben Tags und Attributen auch das ganze im Browser befindliche Drumherum zu spezifizieren&nbsp;&ndash; von <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/urls.html#parsing-urls">URL-Parsern</a> über <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/fetching-resources.html#processing-model">Download-Algorithmen</a> bis hin zu <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#common-dom-interfaces">DOM-Features</a> ist alles dabei. Und da dürfen die Default-Styles natürlich nicht fehlen.


<h3>Weitere Fragen?</h3>
<p>
Eure Fragen zu HTML5, JavaScript und anderen Webtechnologien beantworte ich gerne! Einfach <a href="kontakt/">eine E-Mail schreiben</a> oder <a href="https://twitter.com/sir_pepe">Twitter bemühen</a> und ein bisschen Geduld haben&nbsp;&ndash; falls ich gerade unterwegs bin, kann es mit Antwort manchmal etwas dauern, doch früher oder später schreibe ich garantiert zurück.<img src="http://vg09.met.vgwort.de/na/ba0650b86b6449f096da6fc6dc592d41" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=d9GH3zh9XuQ:8BzUCpyPnFs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/d9GH3zh9XuQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-8-cors-z-index-drag-und-drop-default-styles/</feedburner:origLink></item>
</channel>
</rss>
