4.4 Unternavigation

Der Navigation möchte ich in diesem Kapitel noch eine Unternavigation spendieren, so dass weitere Unterpunkte möglich sind. Dies ist vor allem für Seiten mit viel Inhalt interessant, da diese somit einfach gruppiert und dem Nutzer übersichtlich präsentiert werden können. Sollten Sie keine Unternavigation benötigen, so können Sie dieses Kapitel selbstverständlich auch überspringen.

HTML

Im HTML-Code sind für die Unternavigation der Seite lediglich kleinere Änderungen notwendig. Vergleichen Sie dazu einfach Quellcode 1 mit Ihrem aktuellen Stand.

Quellcode 1 - HTML Die Unternavigation ist bereits durch kleine Änderungen im HTML-Code realisierbar.
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
  3.  
  4. <head>
  5.   <title>Webdesign Tutorial</title>
  6.   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7.   <meta name="Description" content="Beschreibung der Seite" />
  8.   <link rel="Stylesheet" type="text/css" href="style.css" media="screen" />
  9. </head>
  10.  
  11. <body>
  12.   <div class="root">
  13.     <a id="top" name="top"></a>
  14.     <div id="header">
  15.       <a style="background-image:url(design/webdesigntutorial.jpg);" href="http://www.webdesign-tutorial.net">Webdesign Tutorial</a>
  16.     </div>
  17.  
  18.     <div id="navi">
  19.       <span id="corner_left"></span><span id="corner_right"></span>
  20.       <ul>
  21.         <li>
  22.           <a class="navilink" href=""><span>1</span> Grundlagen</a>
  23.           <div>
  24.             <ul>
  25.               <li><a href=""><span>1.1</span> Untermenü-Element</a></li>
  26.               <li><a href=""><span>1.2</span> Untermenü-Element</a></li>
  27.             </ul>
  28.           </div>
  29.         </li>
  30.         <li>
  31.           <a class="navilink" href=""><span>2</span> Konzept</a>
  32.         </li>
  33.         <li>
  34.           <a class="navilink" href=""><span>3</span> Design</a>
  35.         </li>
  36.         <li>
  37.           <a class="navilink" href=""><span>4</span> Umsetzung</a>
  38.         </li>
  39.         <li>
  40.           <a class="navilink" href=""><span>5</span> Programmierung</a>
  41.         </li>
  42.         <li>
  43.           <a class="navilink" href=""><span>6</span> Optimierung</a>
  44.         </li>
  45.       </ul>
  46.     </div>
  47.     <div class="subnavi"></div>
  48.   </div>
  49. </body>
  50. </html>

Neu hinzugekommen sind die Zeilen 23 bis 28 und Zeile 47, wobei letztere einen Platzhalter für die Unternavigation darstellt. Im Fall dieser Seite ist dies der hellbraune Bereich direkt unter der Hauptnavigation.
Direkt unter den Navigationspunkten wird zum Beispiel in Zeile 23 ein div-Container mit einer darin befindlichen Liste an weiteren Anker-Tags erzeugt. Diese Elemente habe ich der Übersicht halber lediglich unter dem ersten Navigationspunkt platziert. Für alle Weiteren ist das Vorgehen identisch.

CSS

So wenig HTML-Quellcode erfordert dafür einige zusätzliche CSS-Eigenschaften, wie dies Quellcode 2 zeigt.
Quellcode 2 - CSS Erweitern Sie Ihre CSS-Datei mit diesen Klassen und Ids um eine dynamische Unternavigation zu erhalten.
  1. .subnavi
  2. {
  3.     background-color: #d9d6d1;
  4.     padding: 5px 30px;
  5.     height: 105px;
  6. }
  7. .subnavi span
  8. {
  9.     padding-right: 10px;
  10. }
  11.  
  12. #navi li div
  13. {
  14.     position: absolute;
  15.     margin: 31px 0 0 0;
  16.     padding: 10px 20px;
  17.     width: 940px;
  18.     height: 95px;
  19.     left: -999em;
  20.     background-color: #d9d6d1;
  21.     font-size: 12px;
  22. }
  23. #navi .selected a.navilink
  24. {
  25.     color: #ffffff;
  26.     background: url(design/navi_arrow_selected.gif) no-repeat 50% 24px;
  27. }
  28. #navi .selected div
  29. {
  30.     display: block !important;
  31.     left: 0 !important;
  32. }
  33. #navi li:hover div
  34. {
  35.     display: block;
  36.     left: 0;
  37.     z-index: 1;
  38. }
  39. #navi li div span
  40. {
  41.     color: #98948e;
  42.     padding-right: 10px;
  43. }
  44. #navi li div a
  45. {
  46.     padding: 5px;
  47. }
  48. #navi li div ul
  49. {
  50.     float: left;
  51. }
  52. #navi li div li
  53. {
  54.     display: block;
  55.     padding-bottom: 5px;
  56. }

Zeilen 1 bis 10 sorgen dafür, dass die Unternavigation einen 115 Pixel hohen Platzhalter erhält. Dieser Wert ergibt sich aus der angegebenen Höhe von 105 Pixeln zuzüglich des 5 Pixel hohen Innenabstandes (padding) oben und unten.
Zeile 12 selektiert alle div-Container unterhalb eines li-Tags und natürlich innerhalb der navi-Id. Durch Zeile 19 werden alle div-Elemente weit außerhalb des sichtbaren Bereiches platziert. Somit sind zunächst alle Untermenüs unsichtbar, aber dennoch vorhanden.
Die Zeilen 23 bis 27 sorgen dafür, dass ein selektiertes Navigationselement von dem zuvor erstellten ausgefüllten Pfeil markiert werden. Der Menüpunkt, der die CSS-Klasse selected erhält, ist wie in diesem Kapitel der Menüpunkt 4 Umsetzung, durch einen Pfeil markiert. Wie und wann Sie die Klasse setzen hängt ganz von Ihrer weiteren Umsetzung ab. Sie könnten etwa eine neue Unterseite anlegen und die Klasse für den entsprechenden Menüpunkt setzen oder aber die Seite entscheidet dynamisch selbst darüber, welcher Menüpunkt gerade aktiv sein müsste, was beispielsweise durch PHP umsetzbar ist.
Durch die Zeilen 28 bis 32 wird das vom Nutzer selektierte div-Element für die Unternavigation eingeblendet, indem etwa die Position auf 0 Pixel gesetzt wird. Der Ausdruck !important sorgt dafür, dass zuvor definierte Eigenschaften von dieser überschrieben werden.
Ebenso soll die Unternavigation beim Mouseover eingeblendet werden, was aufgrund der Zeilen 33 bis 38 geschieht. Die Definition, dass ein li-Element ebenfalls wie ein Anker-Tag auf ein Mouseover durch :hover reagieren kann, funktioniert leider erst in aktuelleren Browsern. Der Internet Explorer 6 etwa unterstützt diese Definition nicht.
Alle weiteren Eigenschaften in den Zeilen 39 bis 56 sind notwendig um die Menüpunkte der Unternavigation zu formatieren. Um zu verstehen wofür diese genau gedacht sind hilft es Ihnen vermutlich am meisten, wenn Sie diese der Reihe nach hinzufügen und die Veränderungen der Seite beobachten.

JavaScript

Das Tolle an dieser Navigation, die sich erst beim Mouseover öffnet ist, dass diese vollständig ohne JavaScript auskommt. Das ist besonders dann wichtig, wenn beispielsweise ein Nutzer JavaScript in seinem Browser deaktiviert hat und somit nicht alle Unterseiten erreichen kann.
Die Ausnahme ist jedoch der Internet Explorer 6, der zwar mittlerweile extrem veraltet ist und daher nicht mehr verwendet werden sollte, aber dennoch auf älteren Rechnern oder größeren Firmen verbreitet ist, da diese Firmen etwa ihre gesamte Software auf diesen Browser optimiert haben. Da die Zahl der Nutzer dieses Browsers meines Erachtens nach stetig abnimmt, müssen Sie für sich entscheiden inwiefern Sie teilweise sehr umständliche Wege gehen um auch dort eine korrekte Darstellung der Webseite garantieren zu können. Ich denke hierbei spielt vor allem die Zielgruppe Ihrer Webseite eine große Rolle.
Quellcode 3 zeigt das JavaScript, durch das die Unternavigation auch im Internet Explorer 6 funktioniert. Diesen Codeschnipsel können Sie einfach im Kopfbereich zwischen den head-Tags platzieren. Um den Quellcode in den folgenden Kapiteln möglichst übersichtlich zu halten, wird dieser Code nicht dargestellt.

Quellcode 3 - JS Ein kleines JavaScript sorgt dafür, dass die Unternavigation auch im IE6 funktioniert.
  1. <!--&#91;if lte IE 6&#93;>
  2. <script type="text/javascript">
  3.  
  4. function addHover()
  5. {
  6.   var hoverElements = document.getElementById("navi").getElementsByTagName("li");
  7.   for (var i=0; i<hoverElements.length; i++)
  8.   {
  9.     hoverElements&#91;i&#93;.onmouseover = function()
  10.     {
  11.       this.className = "navihover";
  12.     }
  13.     hoverElements&#91;i&#93;.onmouseout = function()
  14.     {
  15.       this.className = "";
  16.     }
  17.   }
  18. }
  19. if (window.attachEvent)
  20. {
  21.   window.attachEvent("onload", addHover);
  22. }
  23.  
  24. </script>
  25. <!&#91;endif&#93;-->

Da dies unter Umständen Ihr erster Kontakt mit JavaScript ist, möchte ich an dieser Stelle nicht zu sehr ins Detail gehen, da dazu einiges an Grundwissen vorausgesetzt wird. Wichtig für Sie zu wissen ist etwa, dass Sie durch Zeile 1 und 25 bewirken, dass der Quellcode dazwischen ausschließlich vom Internet Explorer 6 ausgeführt wird. In Zeile 4 definiere ich eine Funktion namens addHover. Bei einer Funktion handelt es sich zum Beispiel um Quellcode, den Sie stetig wiederverwenden.
In Zeile 6 werden alle Menüpunkte ausgelesen, indem das Dokument nach einem Element mit der Id navi mit sich darunter befindlichen li-Elementen durchsucht wird. In einer Schleife (Zeile 7 bis 17) werden diese einzelnen Elemente durchlaufen und deren sogenannte Eventhandler und dessen Verhalten definiert. Beim Eventhandler onmouseover (beim überfahren eines Navigationspunktes mit der Maus) soll beispielsweise die CSS-Klasse navihover hinzugefügt werden, die Sie zuvor der CSS-Datei wie in Quellcode 4 gezeigt hinzufügen.
Damit die Unternavigation auch wieder verschwindet wenn Sie den Menüpunkt mit der Maus verlassen, definiere ich in Zeile 13 des JavaScripts ein Verhalten für den Eventhandler onmouseout, bei dem die CSS-Klasse wieder entfernt werden soll.
Damit das JavaScript überhaupt ausgeführt werden kann, sorgen Zeile 19 bis 22 dafür, dass die Funktion initial beim Laden der Seite ausgeführt wird.

Quellcode 4 - CSS Eine Hilfsklasse für den IE6
  1. .navihover div
  2. {
  3.     left: 0 !important;
  4.     display: block;
  5. }

Ergebnis

Die in diesem Kapitel entstandene Unternavigation wird in Abbildung 1 beispielhaft dargestellt. In diesem Fall werden die Menüpunkte der Unternavigation beim Mouseover über den ersten Menüpunkt der Hauptnavigation dargestellt.

Abbildung 1Die Unternavigation wird in diesem Beispiel beim Mouseover über den ersten Menüpunkt eingeblendet.