Kliknij foldery menu myszą:
Wymagana wiedza:
Aby uzyskać menu drzewiaste, utwórz plik tree.css w tym samym katalogu co strona i zapisz w nim:
ul.tree { display: block; margin-left: 0; padding-left: 0; } ul.tree ul { display: block; margin-left: 0; padding-left: 0; margin-top: 0; margin-bottom: 0; } ul.tree li { display: block; list-style-type: none; padding-left: 20px; background-image: url("document.gif"); background-position: left top; background-repeat: no-repeat; } ul.tree li.closed { background-image: url("closed.gif"); background-position: left top; background-repeat: no-repeat; } ul.tree li.opened { background-image: url("opened.gif"); background-position: left top; background-repeat: no-repeat; } ul.tree li a { font-size: 13px; text-decoration: none; cursor: pointer; } ul.tree li a.folder { cursor: pointer; } ul.tree li a.active { font-weight: bold; } ul.tree li a:hover { text-decoration: underline; }
Dodatkowo w tym samym katalogu utwórz plik tree.js i zapisz w nim:
/** * @author Sławomir Kokłowski {@link http://www.kurshtml.boo.pl} * @copyright NIE usuwaj tego komentarza! (Do NOT remove this comment!) */ function Tree(id) { this.id = id; this.click = function () { for (var i = 0, el_node; i < this.parentNode.childNodes.length; i++) { el_node = this.parentNode.childNodes.item(i) if (el_node.nodeName.toLowerCase() == 'ul') { el_node.style.display = el_node.style.display == 'none' ? 'block' : 'none'; this.parentNode.className = this.parentNode.className.replace(/(^| +)(opened|closed)( +|$)/g, ' ') + ' ' + (el_node.style.display == 'none' ? 'closed' : 'opened'); return; } } } this.start = function (el) { for (var i = 0, el_node; i < el.childNodes.length; i++) { el_node = el.childNodes.item(i); if (el_node.nodeName.toLowerCase() == 'a') { el_node.onclick = this.click; for (var j = 0; j < el_node.parentNode.childNodes.length; j++) { if (el_node.parentNode.childNodes.item(j).nodeName.toLowerCase() == 'ul') { el_node.parentNode.className += ' closed'; el_node.className = (el_node.className ? el_node.className + ' ' : '') + 'folder'; break; } if (el_node.parentNode.childNodes.item(j).nodeName.toLowerCase() == 'li') break; } if (el_node.href && unescape(el_node.href) == unescape(window.location.href)) { el_node.className = 'active'; var el_parentNode = el_node; do { el_parentNode = el_parentNode.parentNode; if (el_parentNode.nodeName.toLowerCase() == 'ul') { el_parentNode.style.display = 'block'; if (document.getElementById(this.id) != el_parentNode) el_parentNode.parentNode.className = el_parentNode.parentNode.className.replace(/(^| +)(opened|closed)( +|$)/g, ' ') + ' opened'; } } while (document.getElementById(this.id) != el_parentNode) } } else if (el_node.nodeName.toLowerCase() == 'ul') el_node.style.display = 'none'; this.start(el_node); } } if (document.getElementById && document.childNodes) this.start(document.getElementById(this.id)); }
Następnie wklej w treści nagłówkowej strony <head>...</head> następujący kod:
<link rel="Stylesheet" type="text/css" href="tree.css" /> <script type="text/javascript" src="tree.js"></script>
Na koniec w wybranym miejscu strony - tam, gdzie ma się wyświetlać menu drzewiaste - wstaw kod oparty na technice zagnieżdżania wykazów (tylko wypunktowanie, czyli lista nieuporządkowana <ul>...</ul>). Sposób zagnieżdżania kolejnych punktów listy będzie automatycznie odzwierciedlał strukturę drzewa menu. Oto przykładowy kod:
<ul id="tree0" class="tree"> <li><a href="...">Dokument 1</a></li> <li><a>Folder 2</a> <ul> <li><a href="...">Dokument 2.1</a></li> <li><a href="...">Dokument 2.2</a></li> </ul> </li> <li><a>Folder 3</a> <ul> <li><a href="...">Dokument 3.1</a></li> <li><a>Folder 3.2</a> <ul> <li><a href="...">Dokument 3.2.1</a></li> <li><a href="...">Dokument 3.2.2</a></li> <li><a href="...">Dokument 3.2.3</a></li> </ul> </li> <li><a href="...">Dokument 3.3</a></li> </ul> </li> <li><a href="...">Dokument 4</a></li> </ul> <script type="text/javascript"> // <![CDATA[ new Tree("tree0"); // ]]> </script>
Rzeczy, które trzeba tutaj podkreślić:
<ul>...</ul>
powinien mieć przypisaną klasę CSS: class="tree"
. Dzięki temu punkty menu przyjmą odpowiedni wygląd.<ul>...</ul>
musi posiadać atrybut: id="tree0"
<script type="text/javascript">...</script>
. Zauważ, że wyróżniony w nim identyfikator tree0 musi być identyczny z tym, co wpisano jako wartość atrybutu id="..."
na początku menu!UWAGA!
Wewnątrz wszystkich znaczników <li>...</li>
muszą znajdować się znaczniki odsyłaczy, czyli: <a>...</a>
.
Odsyłacze znajdujące się w węzłach menu (czyli tworzące otwierane i zamykane foldery) nie powinny posiadać atrybutu href="..."
. Alternatywnie można wpisać tam href="javascript:void(0)"
- wtedy również w Internet Explorerze 6 foldery drzewa będą wyglądały i zachowywały się jak odnośniki, a nie jak zwykły tekst.
W jednym dokumencie nie może być dwóch elementów z takim samym atrybutem id="..."
. Dlatego jeżeli chcemy wstawić drugie menu na tej samej stronie, trzeba dla niego użyć już zmodyfikowanego kodu, np.:
<ul id="tree1" class="tree"> ... </ul> <script type="text/javascript"> // <![CDATA[ new Tree("tree1"); // ]]> </script>
Aby menu prezentowało się w pełni funkcjonalnie, trzeba jeszcze przygotować trzy grafiki ikon i zapisać je w tym samym katalogu, co skrypt menu. Na przykład:
Jeżeli chcemy w jakiś sposób wyróżnić niektóre dokumenty na liście, można w tym celu przypisać im oddzielną ikonę, która wyraźnie odróżnia się od innych:
<ul id="tree0" class="tree"> <li><a>Folder 1</a> <ul> <li><a href="...">Dokument 1.1</a></li> <li><a href="...">Dokument 1.2</a></li> </ul> </li> <li><a href="...">Dokument 2</a></li> <li style="background-image: url(document1.gif)"><a href="...">Dokument 3</a></li> <li style="background-image: url(document2.gif)"><a href="...">Dokument 4</a></li> </ul>
Na koniec warto dodać, że opisywany tutaj skrypt posiada system automatycznego wykrywania aktualnie załadowanej strony. Dzięki niemu po wczytaniu dokumentu wybranego na liście, gałąź w drzewie menu w której znajduje się odpowiadający link jest na starcie rozwinięta, a sam link zostaje wyróżniony przy użyciu klasy CSS pod nazwą active, co natychmiast wskazuje użytkownikowi, na której podstronie teraz się znajduje, a także ułatwia nawigację.