Ich war vorgestern morgen noch nicht mal richtig wach, da schrieb mich jemand über ICQ an und meinte, er hätte einen Vorschlag zu meinem Drop-Down-Menü mit CSS und (fast) ohne Javascript. Nach einem kleinen Test stellte sich dieser Vorschlag als ausgesprochen nützlich heraus, denn er macht auf einfache Art und Weise die alte Navigation für Screenreader lesbar.
Was ist anders?
Eine umgebaute Navigation ist weder optisch noch codeseitig großartig anders als eine Navigation alter Machart. Die Kernunterschiede: Die Navigationspunkte haben fest definierte Höhen und das „Verstecken“ der Untermenüs geschieht nicht durch Ausblenden via display:none;
sondern dadurch, dass sie vom Elternelement abgeschnitten werden - overflow
macht es möglich.
Das ist denkbar schwer in Worte zu fassen, also lassen wir CSS sprechen. Alt:
/* Normalzustand eingeklappt */ #navi li ul { display:none; } /* Ausgeklappt */ #navi li:hover ul { display:block; }
Neu:
/* Normalzustand eingeklappt */ #navi > li { height:24px; overflow:hidden; } /* Ausgeklappt */ #navi > li:hover { height:auto; overflow:visible; }
Angesichts dieser Zeilen dürfte es der geübte CSSler verstehen um was es geht. Diese Methode hat den großen Vorteil, von Screenreadern verstanden zu werden.
Navigation im Screenreader
Moderne Vorlese-Programme sind nämlich sehr exakte Maschinen, die vielleicht nicht unrichtig der Marschroute was nicht angezeigt werden soll, das lese ich nicht vor
folgen. Das heißt, dass sich die alte Navigation vorgelesen so anhört, während die Neue wie folgt klingt.
Es zeigt sich: Die Navigation nach der neuen Methode wird vom Screenreader (in diesem Falle in der Kombination Jaws/Internet Explorer/Windows 2000) komplett vorgelesen, während beim alten Menü die Unterpunkte einfach verschluckt werden.
Ehre wem Ehre gebührt
Ausgebrütet hat diese Idee Sebastian Gebhard, der unter s.gebhard@friesenservice.de für Nachfragen und Lob bereit steht. Er bat mich um die Veröffentlichung, da ich seiner Ansicht nach mehr Leute erreichen könnte als er. Dafür ist seine Beispiel-Navigation viel schöner als meine.
Letzte Anmerkungen
Opera hat zur Zeit Probleme mit overflow
, die zu überflüssigen Scrollbalken an den Navigationsleisten führen. Das ist nicht schön, aber eben ein nicht zu ändernder Programmfehler. Dieser Fehler kann dazu führen, dass das Menü gar nicht mehr benutzbar wird, weswegen gründliches Testen (natürlich) nötig ist.
Kommentare (10)
Daniel ¶
23. August 2007, 20:08 Uhr
Werde ich mal testen bei Gelegenheit.
Benny ¶
24. August 2007, 07:50 Uhr
ich muss ehrlich sagen, ich kann der argumentation, wieso das besser für den screenreader ist, nicht ganz folgen.
wenn das nämlich wirklich so wäre, dass der screenreader das was per css als 'hidden' ausgezeichnet wird, nicht vorliest, dann macht doch zum beispiel das menu mit dem image-replacement-trick auch keinen sinn und man müsste die direkte grafik-variante vorziehen (mit alt-texten natürlich). denn auch dort sind die eigentlichen texte hidden, und würden nach deiner / eurer theorie nicht vorgelesen.
ganz allgemein zweifle ich an, dass sich ein screenreader ums css kümmert. denn 99,9% des inhalts der css-datei ist völlig irrelevant für ihn (wenn nicht sogar 100%). wieso sollte ich dann diese datei überhaupt beachten.
Peter ¶
24. August 2007, 08:07 Uhr
Das ist durchaus richtig. Liegt aber daran, dass der Artikel zu dieser Navi schon recht alt ist und ich es damals nicht besser wusste. Ich werde dazu einen Nachtrag schreiben, der eine bessere Methode als
display:none;
demonstriert.Wie kommen denn dann deiner Ansicht nach diese beiden unterschiedlichen Tonaufnahmen in diesem Posting zustande?
Benny ¶
24. August 2007, 08:32 Uhr
du hast bei dir auf linux irgend nen ominösen open-source screenreader und der ist der einzige der das so macht :P
sinn machts meiner meinung nach aber trotzdem nicht (also das der screenreader das weglässt, was hidden ist bzw überhaupt das css beachtet).
Sebastian Gebhard ¶
24. August 2007, 09:48 Uhr
Erstmal danke für die Veröffentlichung.
Ob das hinsichtlich von Screenreadern besser ist oder nicht darüber lässt sich sicher diskutieren. Hauptintention für mich dieses Menü zu schreiben, war aber, dass nun kein JavaScript mehr benötigt wird - und das ist barrieretechnisch ein Schritt nach vorne.
Philipp ¶
4. Juni 2008, 09:40 Uhr
Ein nützlicher Hinweis, danke!
Stefan ¶
13. Februar 2009, 23:50 Uhr
Den Opera fehler kann ich nicht nachvollziehen. Jedoch ist bei mir im Internet Explorer das Menü IMMER ausgeklappt :( Was kann ich da machen?
HTML
<ul id="navigation">
<li class="page_item page-item-3 current_page_item"><a href="http://www.beispiel.de/wer-wir-sind/" title="Jusos">Jusos</a></li>
<li class="page_item page-item-372"><a href="http://www.beispiel.de/themen/" title="Themen">Themen</a>
<!-- DIE ZWEITE EBENE-->
<ul id="themen">
<li class="cat-item cat-item-1"><a href="http://www.beispiel.de/kategorie/allgemein/" title="Alle unter Allgemein abgelegten Artikel ansehen">Allgemein</a>
</li>
<li class="cat-item cat-item-15"><a href="http://www.beispiel.de/kategorie/arbeit-wirtschaft/" title="Alle Beiträge in Arbeit und Wirtschaft">Arbeit und Wirtschaft</a>
</li>
<li class="cat-item cat-item-16"><a href="http://www.beispiel.de/kategorie/bildung/" title="Alle unter Bildung abgelegten Artikel ansehen">Bildung</a>
</li>
<li class="cat-item cat-item-17"><a href="http://www.beispiel.de/kategorie/europa/" title="Alle unter Europa abgelegten Artikel ansehen">Europa</a>
</li>
<li class="cat-item cat-item-18"><a href="http://www.beispiel.de/kategorie/finanzen-steuern/" title="Alle unter Finanzen und Steuern abgelegten Artikel ansehen">Finanzen und Steuern</a>
</li>
<li class="cat-item cat-item-19"><a href="http://www.beispiel.de/kategorie/frieden-internationales/" title="Alle unter Frieden und Internationales abgelegten Artikel ansehen">Frieden und Internationales</a>
</li>
<li class="cat-item cat-item-20"><a href="http://www.beispiel.de/kategorie/gesundheit-soziales/" title="Alle unter Gesundheit und Soziales abgelegten Artikel ansehen">Gesundheit und Soziales</a>
</li>
<li class="cat-item cat-item-21"><a href="http://www.beispiel.de/kategorie/gleichstellung/" title="Alle unter Gleichstellung abgelegten Artikel ansehen">Gleichstellung</a>
</li>
<li class="cat-item cat-item-23"><a href="http://www.beispiel.de/kategorie/innen-recht/" title="Alle unter Innen und Recht abgelegten Artikel ansehen">Innen und Recht</a>
</li>
<li class="cat-item cat-item-22"><a href="http://www.beispiel.de/kategorie/rechtsextremismus/" title="Alle unter Rechtsextremismus abgelegten Artikel ansehen">Rechtsextremismus</a>
</li>
<li class="cat-item cat-item-24"><a href="http://www.beispiel.de/kategorie/umwelt-verkehr/" title="Alle unter Umwelt und Verkehr abgelegten Artikel ansehen">Umwelt und Verkehr</a>
</li>
<li class="cat-item cat-item-5"><a href="http://www.beispiel.de/kategorie/wahlkampf/" title="Alle unter Wahlkampf abgelegten Artikel ansehen">Wahlkampf</a>
</li>
</ul>
</li>
<!-- WEITER GEHTS MIT DER 1. EBENE -->
<li class="cat-item cat-item-26"><a href="http://www.beispiel.de/kategorie/argumentationspapiere/" title="Alle unter Argumente abgelegten Artikel ansehen">Argumente</a>
</li>
CSS
ul#navigation {
font-family:Helvetica, Arial, sans-serif;
height:1.3em;
font-size:1.2em;
background:#FEF6E2;
margin-bottom:0.7em;
padding-left:0.3em;
}
ul#navigation li{
float:left;
height:1.3em;
width:4.4em;
margin-right:0.5em;
overflow:hidden;
}
ul#navigation li a{
font-size:0.9em;
}
ul#navigation li ul {
margin-top:0em;
}
ul#navigation li ul li{
background:#FEF6E2;
display:block;
width:14em;
height:1.5em;
z-index:100;
position:relative;
padding: 0.1em 0.3em 0.1em 0.3em;
}
ul#navigation li ul li a{
border-bottom:1px solid #D92819;
display:block;
width:100%;
height:100%;
}
ul#navigation li.page-item-372:hover {
overflow:visible;
z-index:100;
}
Liebe Grüße
Stefan
ps: tolle Seite, schönes Theme
Stefan ¶
17. Februar 2009, 16:44 Uhr
Habs gefunden, mir ein ein position:relative; in ul#navigation gefehlt...
André ¶
17. Februar 2009, 20:28 Uhr
Ein weiterer Vorteil der overflow:hidden-Methode ist, dass Tastenkürzel ("accesskey"-Attribut) in den ausgeblendeten Links funktionsfähig bleiben. Bei der display:none-Methode war das zumindest vor einer Weile bei einigen Browsern nicht der Fall.
Den Opera-Fehler kann man beheben, indem man noch #navi > li:hover ul { overflow: hidden; } setzt - diese Angabe aber ohne Gewähr, da das Menü, bei dem ich das herausgefunden habe, etwas anders konstruiert ist.
André
Jaskars ¶
1. September 2009, 20:12 Uhr
Hey, ich bin froh, dass ich das hier gefunden habe. Ist eine klasse Lösung! Danke dafür erstmal. ABER(!), was mache ich mit dem IE 5 und 6 ??? Hat dafür zufällig jemand einen Workaround ??? Das wäre mir eine große Hilfe. Viele Grüße.