Technische Umsetzung einer Navigation mit Submenü

Status
Nicht offen für weitere Antworten.
Red ich hier chinesisch? Und wie gut kennst du dich eigentlich in der Auszeichnungssprache HTML aus? :suspekt:

Code:
ul#main li a#sport:hover, ul#main li#current a#sport {
background-image:url(sport_aktiv.gif);
}
Wird beispielsweise die Seite "sport" aufgerufen, wird in dem dazugehörigen HTML-Dokument die ID #current im entsprechenden Menüpunkt gesetzt:

Code:
<div id="wrapper">
     <div id="header"><span>bild</span></div>
     <ul id="main">
         <li><a href="#" id="home"><span>home</span></a></li>
         <li id="current"><a href="#" id="sport"><span>sport</span></a>
                <ul id="sportsub">
                    <li><a href="#" id="laufen"><span>laufen</span></a></li>
                    <li><a href="#" id="studiotraining"><span>studiotraining</span></a></li>
                    <li><a href="#" id="funsport"><span>funsport</span></a></li>
                    <li><a href="#" id="laufstrecken"><span>laufstrecken</span></a></li>
                    <li><a href="#" id="studiofinder"><span>studiofinder</span></a></li>
                </ul>
         </li>
         <li><a href="#" id="food"><span>food</span></a></li>
         <li><a href="#" id="health"><span>health</span></a></li>
         <li><a href="#" id="sex"><span>sex</span></a></li>
         <li><a href="#" id="travel"><span>sex</span></a></li>
     </ul>
</div>
Und so "wandert" die ID #current in jedem Dokument entsprechend durch das Hauptmenü.
 
(verdammt wieder aneinander vorbeigeredet)
Das hatte ich ja auch gemacht, aber dafür brauch ich ja dann auch die Sport Seite.

Also die Navigation von mir steht alleine, ich soll keine anderen Seiten, kein Content, kein Header machen nur die navi, deshalb war meine Frage ob man das alles in einer seite machen kann denn ansonsten hab ich 5 seiten in der nur die navi is damit der bildwechsel klappt.

aber wenn du mir das da so zeigst dann geh ich mal davon aus das es nur auf diese Art und Weise geht

sry falls ich manchmal etwas schwer von Begriff bin, aber du solltest auch nicht davon ausgehen, dass alles was für dich einfach ist auch alle anderen sofort verstehen. ich bin was Programmieren an geht halt nicht so gut, ich mag eher photoshop..aber was muss das muss -.-

Fuu
 
Zuletzt bearbeitet:
Moin :)

Naja, selbst wenn die Navigation bei dir derzeit alleine existiert, wird sie ja wohl zu einem späteren Zeitpunkt des Projektverlaufs ihrem angedachten Verwendungszweck zugeteilt: nämlich entweder einzelne Dokumente (Seiten) aufrufen, oder beispielsweise mit der serverseitigen Scriptsprache PHP die Inhalte dynamisch in das Hauptdokument laden.

Und für diesen in der Praxis doch weit verbreiteten Anwendungsfall hab ich dir jetzt mal ein kleines Beispiel erstellt - Stichwort: eine Navigation mit "index.php?section=link1".

Wir haben also ein Dokument namens index.php, in das in einem vordefinierten Anzeigebereich #contentBox die verlinkten Inhalte link1.php, link2.php und link3.php hineingeladen werden.

Als Arbeitsvorlage hat "Teil 1" meines CSS-Tutorials "CSS-Rollover" gedient, den ich zusätzlich mit zwei PHP-Scripts ausgestattet habe, um zum einen im DIV #contentBox die Inhalte reinzuladen, und zum anderen beim Aufruf eines Inhalts, die CSS-Klasse des Links zu tauschen, damit sein "aktives" Hintergrundbild angezeigt wird.

Hierfür habe ich das Stylesheet, insbesondere die Selektoren neu strukturiert, da entgegen meinem Tutorial die Links nun keine IDs mehr besitzen, sondern im Normalzustand mit der Klasse .normal ausgezeichnet sind, die beim Aufruf des Verweiszieles in die Klasse .current gewechselt wird.

Stattdessen besitzen nun die einzelnen Listenpunkte li der Hauptmenüpunkte den jeweiligen ID-Bezeichner, damit die Links weiterhin im Markup trotz ihres gleichlautenden Klassenbezeichners voneinander unterschieden und ihnen ihre individuellen Hintergrundbilder zugeordnet werden können:

Code:
<ul id="nav">
    <li id="link1"><a href="index.php?section=link1" class="<?php echo $styles['link1']; ?>"><span>Link 1</span></a></li>
    <li id="link2"><a href="index.php?section=link2" class="<?php echo $styles['link2']; ?>"><span>Link 2</span></a></li>
    <li id="link3"><a href="index.php?section=link3" class="<?php echo $styles['link3']; ?>"><span>Link 3</span></a></li>
</ul>
In deiner Menüstruktur lauten diese IDs weiterhin #home, #sport, #food usw.

Und das ist der relevante überarbeitete Auszug aus dem Stylesheet mit der neuen Selektor-Architektur für das Menü:

Code:
/* #link1 */
ul#nav li#link1 a.normal:link, ul#nav li#link1 a.normal:visited {
background-image:url(bgImage/link_1_normal.png);
}
ul#nav li#link1 a.normal:hover, ul#nav li#link1 a.current {
background-image:url(bgImage/link_1_active.png);
}

/* #link2 */
ul#nav li#link2 a.normal:link, ul#nav li#link2 a.normal:visited {
background-image:url(bgImage/link_2_normal.png);
}
ul#nav li#link2 a.normal:hover, ul#nav li#link2 a.current {
background-image:url(bgImage/link_2_active.png);
}

/* #link3 */
ul#nav li#link3 a.normal:link, ul#nav li#link3 a.normal:visited {
background-image:url(bgImage/link_3_normal.png);
}
ul#nav li#link3 a.normal:hover, ul#nav li#link3 a.current {
background-image:url(bgImage/link_3_active.png);
}
Das vollständige Beispiel incl. den PHP-Scripts, sowie den erforderlichen Grafik- und PHP-Dateien lad ich hier als ZIP-Archiv hoch.

So, nun wünsche ich dir viel Spaß beim Testen und Studieren, und hoffe, dass dir der Code nicht zu "kryptisch" erscheint, und du mit der angewandten Technik zurechtkommst :)

mfg Maik
 

Anhänge

  • demo_Fuu.zip
    4,4 KB · Aufrufe: 17
So, frischgestärkt mit einem leckeren Frühstück schieb ich als kleine Zugabe noch eine "PHP"-freie Variante hinterher, in der nun mit Hilfe von Javascript die Klasse des angeklickten Links getauscht wird - am CSS-Code hat sich gegenüber dem ersten Beispiel von vorhin nichts verändert.

In diesem Demo werden keine Inhalte in das Hauptdokument geladen, oder weitere Seiten aufgerufen, sondern lediglich beim Klick auf einen Link anhand seines href-Attributwertes die Klasse .normal gegen .current getauscht, damit zum "aktiven" Link sein entsprechendes Hintergrundbild angezeigt wird.

JS-Code
Code:
<script type="text/javascript">
<!--
function aktivieren(strHref)
{
    if(document.getElementById)
        {
            for(i=0;i<document.links.length;++i)
                {
                    if(String(document.links[i].className).match(/^(normal|current)$/))
                        {
                            document.links[i].className=(document.links[i].href==strHref)?'current':'normal';
                        }
                }
        }
}

//-->
</script>
Markup für das Menü:

Code:
<ul id="nav">
    <li id="link1"><a href="#link1" class="current" onclick="aktivieren(this.href)"><span>Link 1</span></a></li>
    <li id="link2"><a href="#link2" class="normal" onclick="aktivieren(this.href)"><span>Link 2</span></a></li>
    <li id="link3"><a href="#link3" class="normal" onclick="aktivieren(this.href)"><span>Link 3</span></a></li>
</ul>

Fazit: Diese beiden Beispielvarianten sollen dir verdeutlichen, dass es grundsätzlich schon möglich ist, sich durch die Navigation zu klicken, ohne hierbei eine neue Seite zu öffnen, und dennoch den aktuell angeklickten Link im Menü optisch hervorzuheben. In diesen beiden skizzierten Fällen ist aber eine Scriptsprache (server- oder clientseitig) erforderlich, um den Status des Links zu manipulieren, ihm also eine andere CSS-Klasse zuzuweisen, da ja keine einzelne Seiten aufgerufen werden, in denen, wie von mir vor zwei Tagen erläutert, der dazugehörige Menüpunkt in der Navigation mit der entsprechenden ID oder Klasse ausgezeichnet ist, die ihn von den übrigen Menüpunkten absetzt.

mfg Maik
 

Anhänge

  • demo_Fuu_2.zip
    3,7 KB · Aufrufe: 15
ok das wird ne zeit dauern, bis ich da durch bin und den quellcode verstanden hab (will ja schließlich auch was lernen) ^^

vielen Dank für die ausführliche Erläuterung

Gruß Fuu
 
Zuletzt bearbeitet:
Hi da bin ich mal wieder -^^-

Also, ich hab mir den Quelltext angeguckt und war erstmal ein wenig überfordert und dachte mir, fang doch erstmal mit was einfacheren an. Und da ich eh 3 Navis machen muss ist es ja egal welches ich zuerst fertig hab :) .

Mann merkt auch schon das ich langsam ein bisschen was verstehe (aber nur ein bisschen) -^^-

Ich hab die zweite Navigation nun im Grunde genommen Fertig, aber da sind ein paar "Schönheitsfehler" die ich einfach nicht loswerde weil ich beim besten Willen nicht weiß woher sie kommen :-(

Und zwar:
Meine Hauptnavigation zeigt immer die aktive Farbe und dabei solls ja ein Rollover sein.
Außerdem funktioniert das current nicht bei meinen Divs die ebenfalls ihre Farbe ändern (ja bei denen klappt es aus irgenteinem grund) aber nicht aktiv bleiben wenn man auf der richtigen Seite ist.

und da dachte ich mir, vielleicht hast du ja zeit und lust dir mein Quellcode anzugucken und ein bisschen konstruktive kritik zu geben + mir zu sagen warums nicht geht :)



hier die css datei :
HTML:
@charset "utf-8";
.tab {
	height:30px;
	width:120px;
	padding:2px 10px 2px 10px;
	border-top: 2px solid #999;
	border-left: 2px solid #999;
	border-right: 2px solid #999;
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12px;
	display:inline;
	-moz-border-radius-topleft:20px;
	-moz-border-radius-topright:20px;
	-khtml-border-radius-topleft:20px;
	-khtml-border-radius-topright:20px;
	text-decoration:none;
	}
	
.kasten {
	text-align: right;
	text-decoration:none;
	vertical-align: middle;
	height: auto;
	width: 700px;
	left: 329px;
	top: 14px;
	width:700px; 
	margin:0px auto;
	
	}

/* mousover effekte main navi */ 
#home a:link  { text-decoration:none; color:#999; }
#home a:visited, #home a:hover, #home a:active  { text-decoration:none; color:#963; }
#home:visited, #home:hover, #home:active { border-color:#963; background-color:transparent; } 
#home a:current { border-color:#963; background-color:transparent; }
 
#sports a:link    { text-decoration:none; color:#999;	}
#sports a:visited, #sports a:hover, #sports a:active { text-decoration:none; color:#fc6; }
#sports:visited, #sports:hover, #sports:active { background-color:transparent; border-color:#fc6; }
#home a:current { border-color:#fc6; background-color:transparent; }
  
#food a:link    { text-decoration:none; color:#999; }
#food a:visited, #food a:hover, #food a:active  { color:#f96; text-decoration:none; }
#food:visited, #food:hover, #food:active  { background-color:transparent; border-color:#f96; }
#home a:current { border-color:#f96; background-color:transparent; }

#health a:link    { text-decoration:none; color:#999;}
#health a:visited, #health a:hover, #health a:active  { color:#3c9; text-decoration:none; }
#health:visited, #health:hover, #health:active  { background-color:transparent; border-color:#3c9; }
#home a:current { border-color:#3c9; background-color:transparent; }

#sex a:link    { text-decoration:none; color:#999;}
#sex a:visited, #sex a:hover, #sex a:active  { color:#f69; text-decoration:none; }
#sex:visited, #sex:hover, #sex:active  { background-color:transparent; border-color:#f69; }
#home a:current { border-color:#f69; background-color:transparent; }

#travel a:link    { text-decoration:none; color:#999; }
#travel a:visited, #travel a:hover, #travel a:active  { color:#69f; text-decoration:none; }
#travel:visited, #travel:hover, #travel:active  { background-color:transparent; border-color:#69f; }
#home a:current { border-color:#697; background-color:transparent; }


/*subnavi balken */
.balken {
	text-align:right;
	vertical-align:middle;
	height: uto;
	width:700px;
	margin:0px auto;
		
}

/*subnavi balken farbe*/
#braun { border:2px solid #963; }
#gelb {	border:2px solid #fc6;}
#orange { border:2px solid #f96; }
#gruen { border:2px solid  #3c9; }
#magenta { border:2px solid #f69; }
#blau { border:2px solid #69f; }

/*subnavi text allgemein */
.sub {
	height:30px;
	width:120px;
	padding:2px10px 2px 10px;
	font-family:Verdana, Arial, Helvetica, sans-serif;
	font-size:11px;
	display:inline;
	border:none;
	border-color:#fff;
}

/*subnavi linkfarben */
#subgelb a:link { text-decoration:none; color:#999; }
#subgelb a:visited, a:hover { color:#fc6; }

#suborange a:link { text-decoration:none; color:#999; }
#suborange a:visited, a:hover { color:#f96; }

#subgruen a:link { text-decoration:none; color:#999; }
#subgruen a:visited, a:hover { color:#3c9; }

#submagenta a:link { text-decoration:none; color:#999; }
#submagenta a:visited, a:hover { color:#f69; }

#subblau a:link { text-decoration:none; color:#999; }
#subblau a:visited, a:hover { color:#69f; }

span {
	color: #fff;
}

und dahinter eine beispiel seite:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Unbenanntes Dokument</title>
<style type="text/css">
</style>
<link href="externe.css" rel="stylesheet" type="text/css" />
</head>

<body>
	<div class="kasten"><img src="../header/food.jpg" width="700" height="78" /></div>
<div class="kasten">
  <div class="tab" id="home"><a href="home.html"> home </a></div>
  <div class="tab" id="sports"><a href="sport.html"> sport </a></div>
  <div class="tab" id="food"><a href="food.html"> food </a></div>
  <div class="tab" id="health"><a href="health.html"> health </a></div>
  <div class="tab" id="sex"><a href="sex.html"> sex&amp;soul </a></div>
   <div class="tab" id="travel"><a href="travel.html"> travel </a></div>
</div>
<div class="balken" id="orange">
			<div class="sub" id="suborange"><a href="abnehmen.html"> abnehmen </a></div>
  			<div class="sub" id="suborange"><a href="gesund essen.html"> gesund essen </a></div>
  			<div class="sub" id="suborange"><a href="rezepte">rezepte</a></div>
</div>

</body>
</html>

Die Bilder die über der Navi zu sehen sind siehst du natürlich nicht weil ich sie ja nicht hochgeladen hab :) aber die funktionieren eh vorschriftsmäßig

Gruß Fuu
 
Hi,
Code:
#home a:link  { text-decoration:none; color:#999; }
#home a:visited, #home a:hover, #home a:active  { text-decoration:none; color:#963; }
#home:visited, #home:hover, #home:active { border-color:#963; background-color:transparent; }
#home a:current { border-color:#963; background-color:transparent; }

#sports a:link    { text-decoration:none; color:#999;        }
#sports a:visited, #sports a:hover, #sports a:active { text-decoration:none; color:#fc6; }
#sports:visited, #sports:hover, #sports:active { background-color:transparent; border-color:#fc6; }
#home a:current { border-color:#fc6; background-color:transparent; }

#food a:link    { text-decoration:none; color:#999; }
#food a:visited, #food a:hover, #food a:active  { color:#f96; text-decoration:none; }
#food:visited, #food:hover, #food:active  { background-color:transparent; border-color:#f96; }
#home a:current { border-color:#f96; background-color:transparent; }

#health a:link    { text-decoration:none; color:#999;}
#health a:visited, #health a:hover, #health a:active  { color:#3c9; text-decoration:none; }
#health:visited, #health:hover, #health:active  { background-color:transparent; border-color:#3c9; }
#home a:current { border-color:#3c9; background-color:transparent; }

#sex a:link    { text-decoration:none; color:#999;}
#sex a:visited, #sex a:hover, #sex a:active  { color:#f69; text-decoration:none; }
#sex:visited, #sex:hover, #sex:active  { background-color:transparent; border-color:#f69; }
#home a:current { border-color:#f69; background-color:transparent; }

#travel a:link    { text-decoration:none; color:#999; }
#travel a:visited, #travel a:hover, #travel a:active  { color:#69f; text-decoration:none; }
#travel:visited, #travel:hover, #travel:active  { background-color:transparent; border-color:#69f; }
#home a:current { border-color:#697; background-color:transparent; }
eine Pseudoklasse namens ":current" gibt es überhaupt nicht, vielmehr willst du hier wohl eine Klasse .current implementieren. Und solange diese nirgends im HTML-Code aufgerufen wird, kann der "aktive" Link auch nicht dargestellt werden.

Desweiteren musst du in den Selektoren die ID #home für die nachfolgenden Menüpunkten umschreiben.

Ansonsten möchte ich dich an dieser Stelle darauf aufmerksam machen, dass ich hier mittlerweile genügend funktionstüchtige Vorlagen und Codebeispiele bereitgestellt habe, die nicht aus Jux und Dollerei enstanden sind, sondern dir zur Orientierung dienen sollen.

mfg Maik
 
ah ok denkfehler von mir -.-

Desweiteren musst du in den Selektoren die ID #home für die nachfolgenden Menüpunkten umschreiben.

sry ich versteh nicht was du damit meinst.

Ansonsten möchte ich dich an dieser Stelle darauf hinweisen, dass ich dir hier genügend funktionstüchtige Vorlagen bereitgestellt habe.
ja das problem ist bei mir das ja jeder link ne andere Farbe hat. und mit deinem code hat das nie funktioniert :confused: naja ich werd mal versuchen obs nun klappt
 
Status
Nicht offen für weitere Antworten.

Neue Beiträge

Zurück