Drzewiaste menu

W niniejszym artykule opiszę projekt drzewiastego menu. Cały kod oraz wszystkie potrzebne pliki są dostępne do pobrania w dziale freebies. Na początek przedstawię przykładowy kod html menu.

<ul id="menu"> 
	<li id="tutorialeid"><a>Tutoriale</a></li> 
	<li id="tutoriale">
		<ul class="menu2"> 
			<li><a href="http://google.pl">Photoshop</a></li>
			<li><a href="http://google.pl">Office</a></li>
			<li><a href="http://google.pl">Flash</a></li>
			<li id="webdesignid"><a>Webdesign</a></li>
			<li id="webdesign">
				<ul class="menu3">
					<li><a href="http://google.pl">HTML</a></li>
					<li><a href="http://google.pl">CSS</a></li>
					<li><a href="http://google.pl">JavaScript</a></li>
					<li><a href="http://google.pl">PHP</a></li>
				</ul></li>
		</ul>
	</li> 
	<li id="artykulyid"><a>Artykuły</a></li> 
	<li id="artykuly">
		<ul class="menu2">
			<li><a href="http://google.pl">Grafika</a></li>
			<li><a href="http://google.pl">Webdesign</a></li>
			<li><a href="http://google.pl">jQuery</a></li>
			<li><a href="http://google.pl">Matematyka</a></li>
			<li><a href="http://google.pl">Photoshop</a></li>
			<li><a href="http://google.pl">Inne</a></li>
		</ul>
	</li>
</ul>
Menu będzie działało na następującej zasadzie: np. po kliknięciu na element li o identyfikatorze tutorialeid rozwinie się podmenu o identyfikatorze tutoriale. Widać zatem, że nazwa tutoriale łączy klikany element listy z odpowiednią podlistą do rozwinięcia. Styl css menu przedstawia poniższy listing
 ul.menu2 {
list-style-type: none;
margin-top: 0px !important;
margin-top: -10px;
}
ul.menu2 li{
list-style-image: url('images/page.gif');
margin: 0;
padding: 0;
}
ul.menu3 {
margin-top: 0px !important;
margin-top: -10px;
}
ul.menu3 li{
list-style-image: url('images/page.gif');
}
#menu{
list-style-type: none;
list-style-image: url('images/folder.gif');
font: 12px Arial, Helvetica, sans-serif;
}
a {
cursor: pointer;
text-decoration: none;
color: black;
}
li#webdesignid 
{ 
list-style-image: url('images/folder.gif');
}
li#tutoriale, li#artykuly, li#webdesign
{
list-style-type: none;
list-style-image: none;
}
Klasy menu2 i menu3 reprezentują poziomy zagnieżdżenia listy. Warto również zwrócić uwagę na obrazki: folder.gif – reprezentuje element nierozwiniętej listy, folder_page.gif – element rozwiniętej listy, natomiast page.gif – zwykły element listy. Oczywiście obrazki te można podmienić na własne. Na zakończenie pozostaje tylko kod JavaScript.
function init()
{
	function toggle(){
		var zmm = this.getAttribute('id'); 
		var lista = zmm.substr(0,zmm.length-2);
		var stylelem=document.getElementById(lista).style; 
		var wysw = document.getElementById(lista+'id').style;
		if (stylelem.display=="none"){ 
		stylelem.display="block"; 
		wysw.listStyleImage='url(images/folder_page.gif)';
		 }
		else{ 
		stylelem.display="none"; 
		wysw.listStyleImage='url(images/folder.gif)';
		 } 
	} 
	 var wszystkie_li = document.getElementsByTagName('li');
	 for(var i=0;i<wszystkie_li.length;i++)
	 {
		if(wszystkie_li[i].getAttribute('id'))
		{
			 if(wszystkie_li[i].getAttribute('id').substring(wszystkie_li[i].getAttribute('id').length-2)=='id')
			 {
				var zm = wszystkie_li[i].getAttribute('id');
				dp_none = wszystkie_li[i].getAttribute('id').substring(0,wszystkie_li[i].getAttribute('id').length-2);
				document.getElementById(dp_none).style.display="none";
				document.getElementById(zm).onclick=toggle;
			 }
		}
	 }
}
window.onload=init;