Tree List w CSS3
14 sierpnia 2005
Potrzebowałem ostatnio sposobu na stworzenie drzewka za pomocą semantycznego XHTML i opisania jego wyglądu za pomocą CSS. Pod pojęciem semantycznego, mam na myśli brak classitis. Przez to, że należy korzystać z pseudoklasy CSS3 :last-child, podany przykład nie działa na Operze. No, a że na IE nie to chyba oczywiste.
Zaczynamy oczywiście od stworzenia wielokrotnie zagnieżdzonego drzewka z wykorzystaniem <ul/> i <li/>.
Jedyne co musimy dodatkowo wprowadzić do przykładu, to objąć wszystkie <li/> w element <span/>. Lecz jeśli wiemy, że w elemencie <li/> będą linki <a/> to możemy sobie je podarować. Będą potrzebne do ustawienia poziomego kropkowanego tła.
Żeby jakoś się zabrać za określanie wyglądu, warto zacząć od nadania marginesu elementowi <ul/> i zmianie czcionki (początkowy look & feel powinien być choć troszkę podobny).
Do mojego przykładu przygotowałem trzy pliki graficzne (expand.png, hor.png, vert.png), używane do wyświetlenia połączeń w drzewku. Można je dołączyć jako Data: URL teraz właśnie jeśli ktoś chce poeksperymentować. :)
Tak więc dla elementu <li/> ustawmy tło kropkowania pionowego. Dla <span/> poziomego.
ul.treelist li{ background: url(vert.png) -4px -1px repeat-y; list-style-type: none; }ul.treelist li span{ background: url(hor.png) -5px 2px no-repeat; }
Ustawiłem od razu pozycję tego tła, żeby ładnie się komponowało z dopełnieniami i marginesami. Dodam jeszcze, że przesunięcia elementów dobrałem empirycznie, a do tego na pikselach. W tym przykładzie nie będę tłumaczył krok po kroku wszystkich operacji w CSS, tylko koncept.
Reszta stylowania:
ul.treelist {width: 25%;font-family: Tahoma, sans-serif;font-size: 11px;margin: 15px;}ul.treelist li {margin-left: -21px;padding-top: 4px;padding-bottom: 0;margin-top: -2px;}ul.treelist li span {padding: 1px 0 0 15px;}
Ustawienia tła kropkowanego w pionie poszło całkiem nieźle, ale przecież drzewko nie wygląda tak, że kropkowanie spada w dół po każdym jego elemencie. Należy więc zatrzymać powtarzanie tła.
ul.treelist li:last-child{ background-repeat: no-repeat; }
No tak, tutaj Opera zawiedzie. Tworząc drzewko dla wszystkich przeglądarek, bez większego wsparcia dla CSS3, trzeba będzie wykorzystać dodatkowe klasy.
Następnie możemy zająć się krzyżykiem, pojawiającym się w drzewku w miejscu rozgałęzienia elementów. Zaopiekuje się tym pseudoklasa ::before.
ul.treelist li span::before{ content: url(expand.png) " "; }
Dodatkowo należy znowu usunąć krzyżyk z elementów nie wchodzących w skład rozgałęzienia. Można także ustawić inny obrazek, na przykład pojedynczego dokumentu, w przypadku gdy wykorzystujemy drzewko jako strukturę katalogów.
ul.treelist li span:last-child::before{ content: ""; }