Dropdown-Menü für die Webseite mit CSS

Die Übersichtlichkeit der Seite wird durch Javascript erhöht. Ist dies aktiviert, werden die Texte unter den Überschriften durch Anklicken der Überschriften ein- und ausgeblendet.

Vorwort

Um möglichst viel Menü mit möglichst wenig Platzaufwand anzubieten, bietet sich ein Dropdown-Menü an. Dieses zu erstellen ist ohne Programmierung einfach durch die Anwendung von CSS möglich. Wie das genau funktioniert möchte ich hier beschreiben.

nach oben

HTML-Code

Hauptmenü

Für das Hauptmenü wird zunächst eine einfache unorderd-List mit den verschiedenen Listen punkten zwischen den <ul> </ul> -Tags. Die Listenpunkte enthalten Ihrerseits die Links auf die späteren Inhalte. Für die erste Erstellung des Menüs werden zunächst dummy-Links erstellt die nur aus dem #-Zeichen bestehen. Den ul-Elementen wird noch eine Klasse navmenu zugeordnet, um später einfacher mit CSS darauf zugreifen zu können. Das Hauptmenü sieht dann in Beispielsweise so aus:

<ul class="navmenu">
  <li> <a href="#">Punkt1</a> </li>
  <li> <a href="#">Punkt2</a> </li>
  <li> <a href="#">Punkt3</a> </li>
  <li> <a
  href="#dd.php?show=impressum>Impressum</a> </li>
</ul>

nach oben

Untermenü 1

Ein Untermenü besteht zunächst auch nur wieder aus einer unorderd-Liste wie das Hauptmenü. Diese Liste wird in einen Listenpunkt des Hauptmenüs eingebettet. Um das Untermenü später mittels CSS leichter ansprechen zu können, geben wir dem <ul>-Element eine Klasse. Um anzuzeigen, dass ein Untermenü folgt, wird ein kleiner Pfeil eingebettet, bevor das eigentliche Untermenü folgt. in diesem Fall ist es ein Pfeil nach unten, dieser wird durch &#9660; representiert und über <span class ="darrow">&#9660;</span> eingebettet. Dies beim obigen Punkt2 eingebettet sähe dann zum Beispiel folgender Maßen aus:

<li> <a href="#">Punkt2</a>
  <ul class="sub1">
    <span class="darrow">&#9660;</span>
    <li> <a href="#">Punkt2.1</a></li>
    <li> <a href="#">Punkt2.2</a></li>
    <li> <a href="#">Punkt2.3</a></li>
  </ul>
</li>

nach oben

Untermenü 2

Um noch ein Untermenü zum Untermenü anzubieten, wird mit einem Listenpunkt eines Untermenüs genau so verfahren, wie zuvor mit dem Hauptmenüpunkt. Es wird also eine weitere unorderd-List in eines der Listenelemente des Untermenüs eingebetet und diesem dann die Klasse sub2 zugewiesen. Auch hier wird vor dem eigentlichen Untermenü ein Pfeil eingebetett, der für die Richtung rechts mit <span class="rarrow">&#9654;</span> angegeben wird.

nach oben

CSS

Einige Formatierungen vorab

Abstände für alle Elemente aus null setzen

Zunächst stören die Abstände. Um diese zu setzten bzw. auf Null zu stellen werden für alle Elemente (Selektor *) die Eigenschaften margin und padding jeweils mit den Wert Null belegt:

#+BEGINN_SRC: *{ margin: 0px; padding: 0px; }

nach oben

Body mit einigen Voreinstellungen belegen

Mit dem Selector body wird nun allen darin eingebetteten Elementen einige gewünschte Standardeigenschaften zugewiesen:

font-family
Die Schriftart
background-color
Die Hintergrundfarbe
padding
Der Innenabstand

#+BEGINN_SRC: body { font-family: verdana; bachground-color : #ABC; padding: 50px; }

nach oben

Überschrift

Die Überschrift soll zentriert und unterstrichen werden. Dafür wird mit

text-align: center;
der Text zentriert
boder-bottom: 2px solid #009;
ein Pixel starker unterer Rand gezogen
margin-bottom: 50px;
ein Abstand von 50 Punkten darunter festgelegt.
h1 {
 text-align: center;
 boder-bottom: 2px solid #009;
 margin-bottom: 50px; 
}

nach oben

Formatierungen für das Menü

Das Zurücksetezen der Abstände war ein erster Schritt. Dadurch sind nun alle Elemente untereinander angeordnet. Nun soll das Menü daraus geformt werden.

Pfeile

.darrow

Dies ist der Down-Pfeil, also Pfeil nach unten. Dieser soll im Butten des Hauptmenüelemets angezeigt werden um zu verdeutlichen, dass sich hier ein Untermenü versteckt. Dieser wird hier wie folgt designd:

font-size: 11pt;
setzt die Größe des Pfeils, genau wie bei einer Schrift
position: absolut;
ermöglicht es den Pfeil direkt auf dem dazu gehörigen Hauptmenü-Listenfeld zu plazieren
top: 5px;
setzt diesen dann 5px unter die

Oberkante des zugehörigen Listenelementes

right: 4px
setzt diesen dann 4 Pixel neben

die rechte Kante des zugehörigen Listenelements

.darrow{
 font-size: 11pt;
 position: absolut;
 top: 5px;
 right: 4px;
}

nach oben

.rarrow

Mit diesem Selector wird jetzt der Pfeil nach rechts designd, der auf dem sub1-Menüpunkt nach rechts zeigen soll, um anzuzeigen, dass ein Untermenü folgt:

font-size: 13pt;
setzt die Schriftgröße auf 13 Punkte
position: absolute;
sorgt für die Positionierbarkeit auf dem Listenfeld
top: 6px;
6 Pixel von oben
right: 4px;
4 Pixel von rechts

nach oben

ul

Da es im späteren Verlauf der Seite ggf. weitere Listen geben kann, die sich nicht wie das Menu verhalten sollen werden die ul-Elemente über ihre ID bzw ihre Klasse angesprochen. Diesem Selector wird nun mitgegeben, dass

list-style-type: none;
keine Listenpunktkennzeichnungen mehr angezeigt werden sollen. Dadurch werden nun für die Hauptmenüpunkte keine Listenpunkte mehr vorangestellt.
font-size:9px;
setzt die Schriftgröße auf 9 Pixel
ul#navmenu, ul.sub1, ul.sub2{
 list-style-type: none;
 font-size: 9px;
}
#+END:SRC

*** ul#navmenu li

Um sich zunächst anzuschauen, welchen Bereich die
Elemente auf der Seite einnehmen, kann mann die
Eigenschaft outline: 1px solid red; nutzen.
Daurch ist zu erkennen, dass derzeit alle
Listenpunkte untereinander stehend jeweils den
kompletten Bildschirm in der Breite ausnutzen.
Um das zu ändern wird nun zunächst für die
Listenpunkte des Hauptmenüs mit:

- width: 125px; :: eine Breite von 125 Punkten
                   festgelegt 
- text-align: center; :: Die Listentexte innerhalb
     dieser Breite zentriert.
- position: relative; :: festgelegt, das sich die
     Positionsbeschreibungen relativ auf das
     Vorgängerelement beziehen.
- float: left; :: ordnet die Listenpunkte nicht
                  mehr untereinander sondern
                  direkt fließend hintereinander
                  von links nach rechts an.
- margin-right: 4px :: Sorgt für 4 Punkte Abstand
     zwischen den Listenpunkten des Hauptmenüs

Danach sind die Listenelemente des Hauptmenus
nebeneinander angeordnet und ihre Untermenüs
befinden sich direkt unter Ihnen mit der selben Breite.

ul#navmenu li{
 width: 125px;
 text-align: center;
 position: relative;
 float: left;
 margin-right: 4px;
}

nach oben

ul#navmenu a

Für die Links werden nun mit

text-decoration: none;
die Unterstreichungen abgeschaltet
display: block;
sorgt dafür das sich das Inline-Element wie ein Blockelement verhält. Damit ist es möglich Höhe und Breite festzulegen, so dass sich die Links wie Button verhalten.
width: 125px;
legt nun entsprechend die

Breite von 125 Punkten fest

height: 25px;
legt die Höhe von 25 Punkten

fest

line-height: 25px
sorgt dafür, dass die Menüpunkte in der Höhe zentrierter wirken. Dies funktioniert allerdings nur bei einzeiligen Links unproblematisch.
background-color: #FFF
Setzt die Hintergrundfarbe auf weis
border: 1px solid #CCC;
setzt einen licht-grauen Rahmen
border-radius; 5px;
rundet die Ecken ab

Vor diesen Einstellungen, musste man zum aktivieren der Links exakt den Text anklicken, nach diesen Einstellungen ist wird im gesamten festgelegten Bereich mit der Breite von 125 und der Höhe von 25 Punkten der Link ausgelöst, was durch den veränderten Mauszeiger beim Überfahren sichtbar wird. Durch den fein abgesetzten und abgerundeten Rand wirken die Menüpunkte jetzt wie einzelne sortiert unter einander angeordnete Button.

ul#navmenu a{
 text-decoration: none;
 display: block;
 width : 125px;
 height:  25px;
 line-height: 25px;
 background-color: #FFF;
 border: 1px solid #CCC;
 border-radius: 5px;
}

nach oben

ul#navmenu .sub1 a

Als nächstes werden die Links des Untermenüs1 etwas angepasst:

margin-top: 3px;
legt einen Abstand von 3 Punkten zum darüber liegenden Element fest. Es ist wichtig dies für das Linkelement zu tun, um den Abstand zwar sichtbar zu machen, aber zu verhindern, das zwischen den einzelnen Listenpunkten Freiräume entstehen, so dass der Mauszeiger beim darüber fahren den Fokus verlieren könnte. Wen das passieren würde, würde sich unser Dropdownmenü ungewollt schließen.
ul#navmenu .sub1 a{
 margin-top: 3px;
}

nach oben

ul#navmenu .sub1 li

Es ist ganz wichtig dass sich alle Listenpunkte untereinander berühren. Es darf also auf keinen Fall ein Abstand dafür definiert werden, da sonnst der Mauszeiger beim drüber fahren den Fokus verliert. Die Abstände sind durch die a-Elmente zu definieren!

nach oben

ul#navmenu .sub2 a

Dieses Untemenü soll jetzt abweichend vom 1. zur Seite aufgehen. Deshalb werden hier andere Regeln festgelegt, die das Verhalten sicherstellen:

margin-left: 10 px;
sorgt nun für Abstand zum jeweiligen linken Vorgänger, da dieses Menü ja nach rechts öffnen soll.
ul#navmenu .sub2 a{
 margin-left: 10px;
}

nach oben

ul#navmenu li:hover > a

Nun soll darauf reagiert werden, wenn wir mit dem Mauszeiger über einen "Button" fahren. Dazu ändern wir mit:

background-color: #CFC;
die Farbe des a-Elementes, über dem sich der Mauszeiger befindet. Mit Hilfe des > a- Selectors wird das direkte Kindelement des Listenelementes angesprochen, über dem wir uns mit dem Mauszeiger befinden und augenblicklich die Farbe geändert. Da wir beim überfahren eines Untermenüs auch weiterhin über dem Listenpunkt des darüberligenden Menüs sind, wird dieser ebenfalls eingefärbt, so dass der komplette Pfad farblich erkennbar ist.
ul#navmenu li:hover >a{
 background-color: #CFC;
}

nach oben

ul#navmenu li:hover a:hover

Nun möchten wir den tatsächlich unter dem Mauszeiger befindlichen Button zusätzlich andersfarbig sichtbar machen:

background-color: #FF0;
färbt den aktuellen Button geblich ein.
#ul#navmenu li:hover a:hover {
 background-color: #FF0;
}

nach oben

ul#navmenu ul.sub1

Nun müssen wir dafür sorgen, dass das Untermenü ausgeblendet wird. Dies geschieht mit:

display: none;
blendet das Untermenü aus
position: absolut
lässt nun ein freies Positionieren zu
top: 26px;
positioniert die Liste jetzt mit

einem Abstand von 26 Punkten zum Kontainerrand, der ja von dem darüber liegenden Listenelement dargestellt wird.

left: 0px;
positioniert die Liste jezt ohne

einen Abstand zum linken Containerrand, so dass diese direkt unter dem Elternmenüpunkt liegt

nach oben

ul#navmenu ul.sub2

Hier gilt wieder zu beachten, dass im Gegensatz zum sub1-Memenü, das sub2-Menü nach rechts aufgehen soll. Entsprechend sind folgende Eigenschaften zu setzen:

display: none;
blendet auch dieses Menü

standardmäßig aus

position: absolut
um das freie Positionieren neben den Elternmenüpunkt zu ermöglichen
top: 0px;
setzt dieses Untermenü auf die

Gleiche Höhe wie das Elternmenü

left: 126px
setzt dieses Untermenü direkt

links neben das Elternmenü

Bei der Wahl der Positionsangabe ist es wichtig, das hierbei kein Freiraum zwischen den Listenelementen entstehen dar, durch den der Mauszeiger den hower-Effekt verlieren könnte.

ul#navmenu ul.sub2{
 display: none;
 position: absolute; 
 top: 0px;
 left: 126px;
}

nach oben

Einblenden durch die Maus realisieren

ul#navmenu li:hover .sub1

Über diesen Selector wird nun eingestellt, dass das sub1-Menü eingeblendet wird, wenn man mit der Maus auf den dazugehörigen darüberliegenden Menüpunkt fährt.

display: block;
setzt die Sichtbarkeit des Untermenüs
ul#navmenu li:hover .sub1{
 display: block;
}

nach oben

ul#navmenu .sub1 li:hover .sub2

Dies ist der Selektor für das 2. Untermenü, der nur dann gilt, wenn der darüberliegende Untermenüpunkt des sub1-Menus mit der Maus überfahren wird.

display: block;
auch hier wird damit das sub2-Menu eingeblendet
ul#navmenu .sub1 li:hover .sub2{
 display: block;
}

nach oben