Entries tagged as de
2009-04-16 Zu Gast im Mindgarden
Vor kurzem durfte ich zu Gast im Shoreditch Studio des Mindgarden Podcasts sein. Mindgärtner Tobs interviewte mich zum vergangenen BarcampLondon6. Wir plauschten eine halbe Stunde über das Barcamp an sich und darüber wie ich, zusammen mit dem Rest des Teams, das Barcamp organisiert hatte.
Der Mindgarden Podcast ist übrigends generell eine Emfehlung wert. Die tolle Mischung von Web Dev Themen, Humor und Musik ist klasse und daher erlasse ich hiermit Subscribe-Befehl ![]()
2009-02-07 jQuery Accessible Tabs - Wie man Tabs WIRKLICH zugänglich macht
Während viele Tabs-Scripts behaupten zugänglich zu sein sind es die meisten leider weit davon entfernt. Während ich dieses jQuery Plugin zusammen mit meinem Kollegen Artur Ortega entwickelte, suchten wir nach existierenden Javascript Tabs die Artur mit seinem Screenreader tatsächlich bedienen kann. Wir gaben die Suche irgendwann auf.
Das Problem, dass selbst die besseren Scripts haben, ist die Fehlende Rückmeldung an den Nutzer, dass tatsächlich etwas Passiert. Die meisten Tabs Scripts ändern das Aussehen der Tabs und die Sichtbarkeit der zugehörigen Inhalte aber lassen den Nutzer da zurück wo er war - auf dem Tab auf den geklickt wurde - ohne Ahnung was gerade passiert ist (vergleichbar mit einem Klick auf die immer noch viel zu beliebten "Blinden Links" (a href="#")).
Das ist auch genau der große Unterschied den dieses Script macht. Während das Verhalten für Nutzer ohne Sehbehinderung exakt die gleiche ist passiert sehr viel unter der Haube. Aber erstmal zurück zum Anfang.
jQuery Accessible Tabs benutzt ein sehr einfaches und flexibles HTML Markup als Basis. Alles was es braucht ist ein Wrapper mit Headlines und Inhalts-Elementen nacheinander. Die einfachste und bestmöglichste Alternative ohne Javascript ohne Auszusehen als würde etwas fehlen oder etwas währe kaputt.
<div class="tabs">
<h2>eine Beispielüberschrift</h2>
<div class="tabbody">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
<h3>Lorem ipsum</h3>
<p>Nullam malesuada suscipit pede. Nullam ipsum lacus, varius</p>
</div>
<h2>noch eine Beispielüberschrift</h2>
<div class="tabbody">
<p>Integer tincidunt. Cras dapibus. Vivamus elementum nisi.</p>
<p>Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel.</p>
</div>
<h2>alles andere</h2>
<div class="tabbody">
<p>Hier könnte Ihr Inhalt stehen</p>
</div>
</div>
Ein einfacher jQuery Aufruf transformiert das Markup in accessible Tabs:
$(document).ready(function(){
$('.tabs').accessibleTabs();
});
Um nicht nur so zugänglich sondern auch so flexibel wie möglich zu sein, kann das Script mit verschiedensten Einstellmöglichkeiten konfiguriert werden.
$('.tabs').accessibleTabs({
// Der Name der Klasse die dem Div zugewiesen
// welche um das Markup herumgeschrieben wird
wrapperClass: 'content',
// Der Name der Klasse die das aktuelle Tab markiert
currentClass: 'current',
// Tag oder valider Query Selector der Elemente
// aus denen die Tabs Navigation erzeugt wird
// (die Originale werden entfernt)
tabhead: 'h4',
// Tag oder valider Query Selector der Elemente die
// als Inhalte der Tabs genutzt werden sollen
tabbody: '.tabbody',
// Anzeigeeffekte: 'fadeIn', 'slideDown' oder 'show'
fx:'show',
// Geschwindigkeit (String|Number): 'slow', 'normal', oder 'fast')
// oder die Milisekunden die die Anzeigeeffekte dauern sollen
fxspeed: 'normal',
// Text um Screenreadern anzuzeigen welches der ausgewählte Tab ist
currentInfoText: 'current tab: ',
// Definition wo der Text eingefügt wird
// Entwender 'prepend' oder 'append'
currentInfoPosition: 'prepend',
// Klasse des span mit dem Infotext
currentInfoClass: 'current-info'
});
Also gut, warum ist dieses Script zugänglicher als andere?
Das, was dieses Script hauptsächlich besser macht als die anderen ist ein Feedback für Nutzer von Screenreadern nach dem Klick. Wenn der Nutzer auf einen der Tabs klickt wird tatsächlich auf der Seite navigiert.
Jeder Link in den Tabs führt tatsächlich zu einem fokusierbaren Inhalt. Um dies zu ermöglichen, erzeugen wir einen benannten Anker in dem zugehörigen Inhalt des Tabs. Dieser Anker, da er keine href-Egenschaft hat, kann von Haus aus aber keinen Fokus erhalten. Um dies zu ermöglichen wird ihm die Eigenschaft tabindex="0" zugewiesen. Warum 0? Weil ein Tabindex von 0 nicht die natürliche Tabordnung des Dokumentes verändert aber dem zugewiesenen Element trotzdem ermöglicht Tab-Fokus zu bekommen.
<h4>
<a id="accessibletabscontent" name="accessibletabscontent" class="accessibletabsanchor" tabindex="0">
Eine Beispielüberschrift
</a>
</h4>
In dem benannten Anker wird der selbe Text wie im Tab eingefügt welches gerade geklickt wurde und das ganze mit einer Headline umklammert. Dies stellt eine sehr angenehme Erfahrung für die Nutzer von Screenreadern dar, da es auf nette Art und Weise bestätigt, dass man gerade zu einem anderen Inhalt auf der Seite gesprungen ist.
Ein weiteres Zusatzfeature für Screenreader Nutzer ist ein kleiner Text der auf den aktuell ausgewählten Tab kennzeichnet. Standardmäßig lautet dieser Text "current tab: " gefolgt von dem Standardtext des Tabs. Dieser Text, ebenso wie seine Position (entweder davor oder danach) ist aber sehr leicht internationalisierbar.
Problem: Das Fokussieren von versteckten oder eben noch versteckt gewesenen Elementen
Während dem Testen der Tabs stießen wir auf ein sehr interessantes und ebenso störendes Verhalten des Screenreaders Jaws (und sehr wahrscheinlich auch von anderen). Wir wollten auf die Headline in dem Inhaltselement eines Tabs fokussieren nachdem es eingeblendet wurde. Bei jedem Test war der Screenreader nicht in der Lage das entsprechende Element zu finden und sprach statt dessen um Ende des Dokumentes oder einer anderen zufälligen Position. Dieses Phänomen wird durch den virtuellen Buffer des Screenreaders verursacht, einer internen Kopie des DOMs in dem der Screenreader navigiert. Der virtuelle Buffer gleicht seinen Inhalt regelmäßig mit dem DOM des Browsers ab aber dies ist stets erst nach einer Verzögerung.
Um um dieses Problem herum zu arbeiten nutzen wir einen anderen Lösungsansatz. Der benannte Anker auf den wir verlinken ist tatsächlich nicht in dem versteckten Inhaltselement sondern im DOM davor und "offscreen" (position:absolute;left:-999em) versteckt. Tatsächlich zeigt jeder Tab auf den exakt selben Anker. Wir schreiben den Inhalt des Headline-Elementes einfach jedes mal neu und blenden das zugehörige Inhaltselement entsprechend ein oder aus. Das empfundene Verhalten ist genau das gleiche. Der Screenreader Nutzer klickt auf den Tab, folgt dem Link und findet den verlinkten Inhalt mit der entsprechenden Headline.
Man kann sich das Script hier in einer einfachen Version und hier in einer YAML Umgebung in Aktion ansehen. Das jQuery Plugin wird ebenfalls Teil der kommenden Version 3.1.1 des CSS Framework Yaml sein.
Man kann das script zusammen mit den demos hier herunterladen.
2009-02-01 CSS Voodoo - Die dunkle Kunst der CSS Hacks
CSS Hacks sind etwas über das man nur hinter verschlossenen Türen redet. Entwickler schämen sich sie zu benutzten. Sie sind schlecht, sie sind böse und man sollte sie wirklich überhaupt nicht benutzen...
... aber manchmal gibt es einfach keinen anderen weg - und dann verkauft man seine Seele an den Hack-Teufel...
Seit ich angefangen habe bei Yahoo! zu arbeiten habe ich aus Performance Gründen (weniger HTTP Abfragen) aufgehört Conditional Comments zu benutzen. Ich musste mich also plötzlich wieder mit den üblichen Hacks für Internet Explorer vertraut machen die ich schon völlig vergessen hatte.
Seither bin ich fast nie in Situationen geraten in denen sich auch andere Browser schlecht benommen hätten - aber es kam vor (immerhin sind sie alle nur Software und, wie wir alle wissen, gibt es keine Software ohne Bugs...).
Es folgt der aktuelle Stand meiner CSS Hack Sammlung. Man kann sich eine funktionierende Demo auf meiner CSS Hacks Beispielseite anschauen. Bitte nur mit besonderer Vorsicht benutzen und tu dir selbst den Gefallen und probier ALLES ERDENKLICHE BEVOR du aufgibst und sie selber benutzt.
In meiner Demo habe ich Absätze, die den Namen der Browser enthalten, die mit den Hacks angesprochen werden können, standardmäßig ausgeblendet.
body p { display: none; }
Dann benutze ich die Browser spezifischen Hacks um die jeweiligen Browsernamen wieder sichtbar zu machen:
Internet Explorer
/* IE 6 only */
body #ie6 {
_display: block;
}
/*IE 6 and IE 7 */
#ie6andie7 {
*display: block;
}
/* IE 7 only */
html > body #ie7 {
*display: block;
}
/* IE 6, IE 7 and 8 */
body #ie6andie7andie8{
display:block\9;
}
/* IE 8 only */
body #ie8{
display:block\9;
*display: none; /*overrule for ie6 and ie7 which also read this rule*/
}
Firefox
#firefox2, x:-moz-any-link {
display: block;
*display: none; /*overrule for ie6 and ie7 which also read this rule*/
}
/*Firefox 3 only (for Firefox 2 only use the rule above and this to overwrite for Firefox 3*/
#firefox3, x:-moz-any-link, x:default {
display: block;
*display: none; /*overrule for ie6 and ie7 which also read this rule*/
}
Safari
/* Safari */
@media screen and (-webkit-min-device-pixel-ratio:0) {
#safari {
display: block;
}
}
Opera
/* Opera */
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
head~body #opera {
display: block;
}
}
So - jetzt fühle ich mich schmutzig und gehe duschen...
2009-01-31 Barcamp London 6 - ich bin im Orga-Team
Nach, sage und schreibe, 7 Barcamps als Teilnehmer ist es an der Zeit meine gesammelte "Erfahrung" und "Weisheit" einzusetzen.
Zusammen mit einigen anderen der üblichen Barcamp-Verdächtigen habe ich das kommende Barcamp London 6 organisiert.
Nachdem wir gestern endlich die finale Zusage von the Guardian als location bekommen haben gibt es jetzt endlich die offizielle Ankündigung:
Vom 28. - 29. März 2009 findet in den schicken neuen Räumen der Zeitung the Guardian das sechste Londonder Barcamp statt.
In 2 Wochen werden schon die ersten Tickets vergeben (genauer Tag und Uhrzeit werden noch bekannt gegeben). Damit Ihr diesen wichtigen Termin nicht verpasst, folgt uns auf twitter, tragt euch in den Reminder auf der Website ein, macht euer Häkchen bei Upcoming und und und...
english
