Zum Inhalt springen

Dynamisches horizontales Untermenü mit Ultimate Dropdown!

Erstellt am 17. Januar 2007 · 20 Antworten · letzte Antwort am 19. Februar 2007 · Seite 1 von 2

Tags: HTML & CSS, Frage

flashsilver ·

Hallo Typo3 Gemeinde 🙂 ,

ich habe eine anspruchsvolle Website in Typo3 umzusetzen, die hoffe ich doch schon jemand so in der Art mal realisiert hat.
Habe folgende Menüstruktur:

Seite1 Seite2 Seite3 Seite4 Seite5

Jetzt direkt darunter soll je nach dem welche Seite gewählt würde die Untermenü erscheinen, als Beispiel die Seite3:

Seite3a Seite3b Seite3c Seite3d Seite3e

Und wenn man jetzt über diese Untermenüpunkte mit der Maus fährt soll ein dropdownmenü erscheinen mit weiteren Unterpunkten.
Habe es in meinem template als probe so realisiert:

<div id="subnavigation">
	<ul id="menu2">
		
    <li><a href="#">Seite3a</a></li>
			
		
    <li><a href="#">Seite3b</a></li>  
			
		
    <li><a classaktuell="" href="#">Seite3c</a></li>
				<ul><span>
				  
      <li><a href="#">Seite3c_1</a></li>
							
				  
      <li><a href="#">Seite3c_2</a></li>
							
				  
      <li><a href="#">Seite3c_3</a></li>
							
				  
      <li><a href="#">Seite3c_4</a></li>
							
				  
      <li><a href="#">Seite3c_5</a></li>
				</span></ul>
		
    <li><a href="#">Seite3d</a></li>
			
		
    <li><a href="#">Seite3e</a></li>
	</ul>
</div>

Und der dazugehörige CSS-Code:

/* Unternavigation */
#subnavigation {
height:3%;
weight:100%;
font-size:x-small;
background-color:#BFBFFF;
margin:1px;
padding:5px 5px 10px 5px;
}

/* Die Subnavigation */
div#subnavigation div{
clear:left;
}

  ul#menu2 {
    margin: 0; padding: 0;
    text-align: left;
	background-color:#9999FF;
  }

  ul#menu2 li {
    list-style: none;
    float: left;  /* ohne width - nach CSS 2.1 erlaubt */
    position: relative;
    margin: 0; padding: 0 5px;
  }
  * html ul#menu2 li {  /* Korrektur fuer den IE */
    margin-bottom: -0.4em;
  }

  ul#menu2 li ul {
    margin: 0; padding: 0;
    position: absolute;
    top: 1.6em; left: -0.4em;
    display: none;  /* Untermenu2 ausblenden */
  }
  * html ul#menu2 li ul {  /* Korrektur fuer IE 5.x */
    left: -1.5em;
    lef\t: -0.4em;
  }
  ul#menu2 li:hover ul {
    display: block;  /* Untermenu2 in modernen Browsern einblenden */
  }
  ul#menu2 li ul li {
    float: none;
    display: block;
	margin-left:-0.8em;
	margin-bottom:0.3em;
	margin-top:-0.3em;
	border-top:1px solid #fff;
	width:180px;
  }
  
    ul#menu2 li ul li a:hover{
    background:#BFBFFF;
	width:180px;
  }

  ul#menu2 a, ul#menu2 span {
    display: block;
    width: 100%;  /* Breite den in li enthaltenen Elementen zuweisen */
    padding: 0.1em 0em;
    text-decoration: none;
    color:#000000;
  }
  * html ul#menu2 a, * html ul#menu2 span {
    width: 8.6em;   /* Breite nach altem MS-Boxmodell für IE 5.x */
    w\idth: 6.4em;  /* korrekte Breite fuer den IE 6 im standardkompatiblen Modus */
  }
  ul#menu2 li a:hover {
    text-decoration:underline;
	color:#000000;
  }
  
  ul#menu2 span a:hover {
    /*background-color:#BFBFFF;*/
	text-decoration:none;
	color:#000000;
  }
  li a#aktuell {  /* aktuelle Rubrik kennzeichnen */
    color:#000000;
	text-de?coration:underline;	
  }
  ul#menu2 li ul span a{  /* aktuelle Unterseite kennzeichnen */
    background-color:#9999FF;
	width:180px;
	padding-left:10px;
  }

Hab diesen code teilweise von selfhtml übernommen! #giggle#
Wie ist wohl so ein Menüstruktur mit TS zu realisieren? Ich habe es soweit, das die Untermenü von Seite3 korrekt angezeigt werden, nur weiß ich nicht wie ich das dropdownmenü einbinden soll #paralyzed#
Mein bisheriges TS:

lib.subnavi = HMENU
lib.subnavi {
	special = directory
	special.value = 9
	wrap = <ul id="menu2">|</ul>
	1 = TMENU
	1.NO.stdWrap.htmlSpecialChars = 1
	1.NO.allWrap = <li>|</li>
	1.NO.linkWrap =| |*| | ||*| | |

        1.CUR = 1
        1.CUR.allWrap = <li class="aktuell">|</li>
        1.CUR.linkWrap =| |*| | ||*| | |
        1.Act = 1
	1.ACT < .1.NO
	
	2 = TMENU
	2.NO.stdWrap.htmlSpecialChars = 1
	2.NO.allWrap = <li>|</li>
	2.NO.linkWrap =| |*| | ||*| | |

        2.CUR = 1
        2.CUR.allWrap = <li class="aktuell">|</li>
        2.CUR.linkWrap =| |*| | ||*| | |
        2.Act = 1
	2.ACT < .1.NO
}
flashsilver ·

Hat den keiner sowas in der Richtung mal entwickelt.
Habe nach dropdown gesucht und auch ein thread gefunden, nur leider bezieht
sich das auf ein statisches horizontales menü. Aber ich möchte eine änderne horizontales menü mit farbwechsel des containers, entpsrechend des obigen menüs
Nur weiß ich leider nicht wie man das in TS umsetzt, kann mir da keiner zu helfen?
Eine idee wäre zu probieren, den unterseiten ein einzelnes template zu zuweisen
und dort dann special.value = id die entsprechende id angeben und dem
container über TS zu sagen wechsel deine farbe #paralyzed#

just2b ·

Hallo,

funktioniert denn die statische Variante von dir?

du solltest dein menü übrigens mit NO.wrapItemAndSub = <li>|</li> umsetzen, um einen validen code zu bekommen!!

georg

flashsilver ·

hallo,

hab es auf NO.wrapItemAndSub umgestellt. Nein auch statisch funktioniert es nciht wirklich. Im moment erscheinen alle Seiten der ersten und zweiten Ebene.
ich versteh auch das wrappen auch nich so wirklich, wie ich welchen wrpa nutzen muss, um css-klassen einzubinden etc. Gibt es da ausser die REferenz noch detailliteres?

just2b ·

die TsRef ist da eigentlich ziemlich detailiert!

lass mal das ganze CSS raus und schau, dass du - schrittweise !! - das Menü in TS "übersetzt". Beginne bei der 1. Ebene

temp.MENU = HMENU
temp.MENU {
 1 = TMENU
 1.wrap = <ul id="menu2">|</ul>
 1.NO.wrapItemAndSub = <li>|</li>
 2 = TMENU
 2.wrap = <ul><span>|</span></ul>
 2.NO.wrapItemAndSub = <li>|</li>
}

georg

flashsilver ·

so die erste ebene erscheint sprich Seite 3a Seite 3b erscheinen, fehlt noch die dropdownmenü mit der zweiten ebene. mein TS sieht jetzt so aus:

lib.subnavi = HMENU
lib.subnavi {
	special = directory
	special.value = 4
	#wrap = <ul id="menu2">|</ul>
	1 = TMENU
	1 {
		wrap = <ul id="menu2">|</ul>
		#expAll = 1
		NO = 1
		NO.ATagTitle.field = title//subtitle
		NO.ATagParams = class = "aktuell"
		NO.wrapItemAndSub = <li>|</li>
	}
	
	2 = TMENU
	2 {
		wrap = <ul><span>|</span></ul>
		expAll = 1
		NO.ATagTitle.field = title//subtitle
		NO.wrapItemAndSub = <li>|</li>
	}
flashsilver ·

danke für den hinweis, egal wie ich wrappe die 2te ebene erscheint nicht einmal im quellcode, is doch komplizierte als ich dachte...

flashsilver ·

dann erscheint gar nichts mehr! muss also directoy benutzen, der quelltext sieht so:

<div id="subnavigation">
	<ul id="menu2"><li><a href="index.php?id=Seite3a" title="Seite3a" class = "aktuell">Seite3a</a></li><li><a href="index.php?id=Seite3b" title="Seite3b" class = "aktuell">Seite3b</a></li></ul>
</div>
flashsilver ·

dann erscheint gar nichts mehr! muss also directoy benutzen, der quelltext sieht so aus:

<div id="subnavigation">
	<ul id="menu2"><li><a href="index.php?id=Seite3a" title="Seite3a" class = "aktuell">Seite3a</a></li><li><a href="index.php?id=Seite3b" title="Seite3b" class = "aktuell">Seite3b</a></li></ul>
</div>
just2b ·
flashsilver schrieb

dann erscheint gar nichts mehr! muss also directoy benutzen, der quelltext sieht so aus:

oder deine seitenstruktur ganz einfach umbauen

flashsilver ·

Was soll den an so einer Struktur falsch sein?

Seite1
Seite2
Seite3
-->Seite3a
---->Seite3a_1
---->Seite3a_2
---->Seite3a_3
-->Seite3b
---->Seite3b_1
---->Seite3b_2
Seite4
Seite5

Wie gesagt Seite3a und Seite 3b werden als Unternaviagtion von Seite3 angezeigt,
nur die 3 bzw. 2 Unterpunkte von Seite3a bzw. Seite3b halt nicht #paralyzed#

flashsilver ·

hab ich vergessen zu sagen ich gehe im moment von Seite3 aus sprich special.value = 4 bezeiht sich auf Seite3. Dort soll er anfangen, dann muss cih doch nur die erste und zweite ebene einfügen. is schon so richtig, nur die 2te wird die in erwägen gezogen . wenn ich id = 11 sprich Seite3a nehme, dann werden die seiten seite3a_1 etc angezeigt. deshalb kommt mir das ja alles so merkwürdig vor

Ich werd mich nachher bzw heut abned nochmal dran setzen, aber erstma dnke für deine hilfe

flashsilver ·

so hab mal wider einigees ausprobiert, hab es mal ohne special probiert, aber auch mal special = list gesetzt etc. half alles nix. Hab es dann mal mit entryLevel = -1 ausprobiert, funktioniert auch nicht. Leigt es am TemplateVoila? Ich benutze die aktuelle Version.
Hab jetzt den Seite1, Seite2 etc eine eeigene Template angelegt und da verscuht ein menü aufzubauen, aber auch hier komme ich über die erste Menüebene nicht hinaus, ich versteh nicht was am folgenden TS so flasch sein kann, hab jetzt schon hin und her probeirt und weiß da echt nicht mehr weiter...

lib.subnavi = HMENU
lib.subnavi {
	entryLevel = -1
	#special = list
	#special.value = 10, 11
	wrap = <ul id="menu2">|</ul>
	1 = TMENU
	1 {
		NO = 1
		NO.ATagTitle.field = title//subtitle
		NO.ATagParams = class = "aktuell"
		NO.wrapItemAndSub = <li>|</li>
		noBlur = 1
		collapse = 1
	}
	
	2 = TMENU
	2 {
		IFSUB = 1
		IFSUB {
			allWrap = <ul><span>|</span></ul>
			ATagTitle.field = title//subtitle
			wrapItemAndSub = <li>|</li>
		}
		ACTIFSUB < .IFSUB
		#wrap = <ul><span>|</span></ul>
		#NO = 1
		#NO.ATagTitle.field = title//subtitle
		#NO.wrapItemAndSub = <li>|</li>
	}
}

die id's 10, 11 sind Unterseiten von Seite3, die auch korrekt angezeigt werden, wie auch bei entryLevel, nur dessen Unterseiten werden nie angezeigt.
Hoffe mir kann da mal einer weiter helfen, die ideen vvon just2b hab ich alle ausprobiert

flashsilver ·

So hab es geschafft, dass das menü aufklappt 🙂
Nun wollte ich das ganze in eine Farbnavigation umändern, sprich wenn man

Seite1 Seite2 Seite3 Seite4 Seite5

anklickt soll sich die Hintergrundfarbe des div-containers ändern
(siehe HTML-Code auf erste Seite

<div id="subnavigation"></div>

Diese hab ich per TemplaVoila angewählt, das dort das Menü eingesetzt werden
soll. Jetzt funktioniert das mit dem aufklappen nicht mehr, obwohl ich folgenden
TS-Code erfolgreich war, aber da hatte ich nicht den div-container, sondern direkt die unsortierte Liste angewählt, deshalb ist die einzige änderung im TS,
das ich per wrap = <ul id="menu2">|</ul> die unsortierte Liste eingefügt habe, sonst nix!
Hier das TS,was auch funzt:

lib.subnavi = HMENU
lib.subnavi {
	#
        special = directory
        special.value = 5
        ###Hier diese Zeile auskommentieren!!!###
        wrap = <ul id="menu2">|</ul>
        ### Hauptmenue
        1 = TMENU
        1 {
            #wrap = <ul> | </ul>
                expAll = 1
                noBlur = 1

                NO.ATagTitle.field = title//subtitle
                NO.ATagParams = class = "aktuell"
                NO.wrapItemAndSub = <li> | </li>
               
                IFSUB = 1
                IFSUB {
                        wrapItemAndSub = <li> | </li>
                        allWrap = | <!--<![endif]-->
                        linkWrap = |<!--[if IE 7]><!-->
                        ATagBeforeWrap = 1
                }
        }
        
        2 = TMENU
        2 {
                #wrap = <table><tr><td><ul> | </ul></td></tr></table><!--[if lte IE 6]></a><![endif]-->
		wrap = <ul><span> | </span></ul>
                expAll = 1
                noBlur = 1
                
                NO.ATagTitle.field = title//subtitle
                NO.wrapItemAndSub = <li> | </li>

                IFSUB = 1
                IFSUB {
                        wrapItemAndSub = <li> | </li>
                        allWrap = | <!--<![endif]-->
                        linkWrap = |<!--[if IE 7]><!-->
                        ATagBeforeWrap = 1
                }
        }
        3 < .2
        4 < .2
}
flashsilver ·

Die Farbnavigation hab ich mittlerweile hinbekommen, aber das Menü klappt nicht mehr auf, obwohl die Seiten im Quellcode stehen.

Scheiß IE 6 & 7, denn der Firefox macht es ganz brav 🙂
Habe auch ein javascript kopiert und eingebunden mit:

# Default PAGE object:
page = PAGE
page.typeNum = 0
page.includeCSS {
	file1 = fileadmin/css/style.css
	file1.media = screen
	file2 = fileadmin/css/search.css
	file2.media = screen
	file3 = fileadmin/css/login.css
	file3.media = screen
}
page.headerData = COA
page.headerData.11 = TEXT
page.headerData.11.value = <script type="text/javascript" src="fileadmin/javascript/ie6hover.js"></script> 
page.10 = USER
page.10.userFunc = tx_templavoila_pi1->main_page

In der javascript steht folgendes, was offline auch funktioniert hat!

// JavaScript Document
if(window.navigator.systemLanguage && !window.navigator.language) {
  function hoverIE() {
    var LI = document.getElementById("menu2").firstChild;
    do {
      if (sucheUL(LI.firstChild)) {
        LI.onmouseover=einblenden; LI.onmouseout=ausblenden;
      }
      LI = LI.nextSibling;
    }
    while(LI);
  }

  function sucheUL(UL) {
    do {
      if(UL) UL = UL.nextSibling;
      if(UL && UL.nodeName == "UL") return UL;
    }
    while(UL);
    return false;
  }

  function einblenden() {
    var UL = sucheUL(this.firstChild);
    UL.style.display = "block";
  }
  function ausblenden() {
    sucheUL(this.firstChild).style.display = "none";
  }

  window.onload=hoverIE;
}

Der CSS-Code sieht für das Menü folgendermaßen aus:

/* Die Subnavigation */
div#subnavigation div{
clear:left;
}

  ul#menu2 {
    margin: 0; padding: 0;
    text-align: left;
    /*background-color:#9999FF;*/
  }

  ul#menu2 li {
    list-style: none;
    float: left;  /* ohne width - nach CSS 2.1 erlaubt */
    position: relative;
    margin: 0; padding: 0;
  }
  * html ul#menu2 li {  /* Korrektur fuer den IE */
    margin-bottom: -0.4em;
  }

  ul#menu2 li ul {
    margin: 0; padding: 0;
    position: absolute;
    top: 1.9em; left: -0.8em;
    display: none;  /* Untermenu2 ausblenden */
  }
  * html ul#menu2 li ul {  /* Korrektur fuer IE 5.x */
    left: -1.5em;
    lef\t: -0.4em;
  }
  ul#menu2 li:hover ul {
    display: block;  /* Untermenu2 in modernen Browsern einblenden */
  }
  ul#menu2 li ul li {
    float: none;
    display: block;
	margin-left:-1.2em;
	margin-bottom:0.2em;
	margin-top:-0.3em;
	border-top:1px solid #fff;
	width:180px;
  }
  
    ul#menu2 li ul li a:hover{
        background:#BFBFFF;
	width:180px;
  }

  ul#menu2 a, ul#menu2 span {
    display: block;
    width: 100%;  /* Breite den in li enthaltenen Elementen zuweisen */
    padding: 0.1em 0em;
    text-decoration: none;
    color:#000000;
  }
  * html ul#menu2 a, * html ul#menu2 span {
    width: 8.6em;   /* Breite nach altem MS-Boxmodell f&uuml;r IE 5.x */
    w\idth: 6.4em;  /* korrekte Breite fuer den IE 6 im standardkompatiblen Modus */
  }
  ul#menu2 li a:hover {
    text-decoration:underline;
	color:#000000;
  }
  
  ul#menu2 span a:hover {
    /*background-color:#BFBFFF;*/
	text-decoration:none;
	color:#000000;
  }
  li a#aktuell {  /* aktuelle Rubrik kennzeichnen */
    color:#000000;
    text-decoration:underline;	
  }
  ul#menu2 li ul span a{  /* aktuelle Unterseite kennzeichnen */
    
	width:180px;
	padding-left:10px;
  }

Mein TypoScript sieht so aus, um das Untermenü einzubinden:

lib.subnavi = HMENU
lib.subnavi {
	#
        special = directory
        special.value = 3
        wrap = <div class="fest"><ul id="menu2"> | </div></ul>
        ### Hauptmenue
        1 = TMENU
        1 {
            #wrap = <ul> | </ul>
                expAll = 1
                noBlur = 1

                NO.ATagTitle.field = title//subtitle
                NO.ATagParams = class = "aktuell"
                NO.wrapItemAndSub = <li> | </li>
               
                IFSUB = 1
                IFSUB {
                        wrapItemAndSub = <li> | </li>
                        allWrap = | <!--<![endif]-->
                        linkWrap = |<!--[if IE 7]><!-->
                        ATagBeforeWrap = 1
                }
        }
        
        2 = TMENU
        2 {
                #wrap = <table><tr><td><ul> | </ul></td></tr></table><!--[if lte IE 6]></a><![endif]-->
		wrap = <ul><span style="background-color:#fb9d00"> | </span></ul>
                expAll = 1
                noBlur = 1
                
                NO.ATagTitle.field = title//subtitle
                NO.wrapItemAndSub = <li> | </li>

                IFSUB = 1
                IFSUB {
                        wrapItemAndSub = <li> | </li>
                        allWrap = | <!--<![endif]-->
                        linkWrap = |<!--[if IE 7]><!-->
                        ATagBeforeWrap = 1
                }
        }
        3 < .2
        4 < .2
}

Tipp: In der wrap-zeile unter special.value binde ich die klasse ein, die die jeweiligen hintergrundfarbe des containers beinhaltet, z.B. für den Menüpunkt aus der ersten Ebene Feste.

Ist das ein Typo3 oder doch eher ein IE - Problem, warum das Menü nicht ausklappt? Wie gesagt im html-code stehen die Unterseiten bereit und wenn ich in der CSS-datei probehalber display:none in display:blockändere zeigt der IE es auch brav an, nur ich will es halt erst bei einem mouseover!

just2b ·

ehrlich gesagt nur überflogen, aber das ist mal falsch geschachtelt:

wrap = <div class="fest"><ul id="menu2"> | </div></ul>

besser wohl

wrap = <div class="fest"><ul id="menu2"> | </ul></div>

georg

flashsilver ·

danke für den hinweis :o , nach stunden des suchens ist mir dieser fehler gar nicht aufgefallen, aber es hat nix bewirkt, der IE weigert sich immer noch...

Es hat mal kurz funktioniert, aber da hatte ich über TemplaVoila den Punkt zum ersetzten direkt auf die <ul id="menu2">... gesetzt, jetzt sitzt der Einstiegspunkt auf dem div-container <div id="subnavigatio">... und seitdem funktioniert es im IE nicht mehr, abe am TV kann es nicht liegen, weil ja die Seiten die im dropdown-menü erscheinen sollen ja auch im quellcode stehen, als Beispiel die erste Menüebene Event, hat 2 Unterpunkte, die widerrum jeweils 3 Unterpunkte haben die dann in dem dropdown erschienen sollen, so spuckt der IE den Quellcode aus:

<div id="subnavigation"><div class="event"><ul id="menu2"><li><a href="index.php?id=anlaesse">Anlässe<!--[if IE 7]><!--></a><!--<![endif]--><ul><span><li><a href="index.php?id=marketingevent" title="Marketingevent">Marketingevent</a></li><li><a href="index.php?id=bestriebsfest" title="Betriebsfest">Betriebsfest</a></li><li><a href="index.php?id=sommerfest" title="Sommerfest">Sommerfest</a></li></span></ul></li><li><a href="index.php?id=eventmodule" title="Eventmodule" class = "aktuell">Eventmodule</a></li></ul></div></div>