Newsletter

Grupa MagazynyInternetowe

Online: 955

Wyszukiwarka

CSS, HTML/XHTML

Rozwijane menu w CSS

Rozwijane menu w CSS Menu to jeden z ważniejszych elementów każdej strony internetowej. Występuje w różnych odmianach, ale jego przejrzysta budowa jest jednym z istotniejszych czynników wpływających na łatwość nawigacji w serwisie. Wielu webmasterów decyduje się na menu rozwijane, wykorzystując do tego skomplikowany JavaScript. Czy nie jest to jednak strzelanie z armaty do muchy? Sprawdźmy, czy rozwijane menu można stworzyć wyłącznie za pomocą CSS.

Bartłomiej Dymecki

Dlaczego warto tworzyć rozwijane menu za pomocą CSS? Można wymienić kilka przyczyn. Pierwsza to oszczędność czasu poświęcanego na pisanie skomplikowanego kodu JavaScript. Druga to mniejsza objętość kodu, Należy też pamiętać o osobach, które mogą później pracować ze stworzonym przez ciebie kodem.

Powinien więc być on prosty, przejrzysty, intuicyjny. Trzecia przyczyna to ułatwienie modyfikacji strony przez ciebie samego – np. po kilku latach niezaglądania do jej kodu. Dodać do tego należy jeszcze, że menu w CSS pozwala uniezależnić się od włączonej obsługi JavaScriptu w przeglądarce internetowej osoby odwiedzającej stronę.

Menu krok po kroku

Realizację rozwijanego menu należy zacząć od edycji kodu HTML. Powinien on zawierać listę nieuporządkowaną z nadanym identyfikatorem i kilkoma zagnieżdżonymi listami:

[-]
 
 
Pobierz
Listing zwinięty - 49 linii

Pisanie kodu CSS warto zacząć od wyzerowania wszystkich marginesów i paddingów oraz dodania pliku csshover2.htc:

[+]
 
 
Pobierz
1. * {
2. padding: 0;
3. margin: 0
4. }
5. body {
6. behavior:url("csshover2.htc")
7. }

Plik csshover2.htc jest przeznaczony dla Internet Explorera. Dzięki niemu możesz stosować pseudoklasę :hover dla elementów innych niż hiperłącza, czego IE domyślnie nie obsługuje. Plik znajdziesz do pobrania na stronie http://www.xs4all.nl/~peterned/csshover.html.

Główna lista zawierająca menu musi być pozycjonowana absolutnie, ponieważ kolejne zagnieżdżone listy będą pozycjonowane absolutnie właśnie w odniesieniu do niej. Niestety właściwość position:relative nie działa poprawnie w Internet Explorerze. Spójrz więc na kod uzupełniony o elementy usuwające wypunktowania we wszystkich użytych listach nieuporządkowanych:

[+]
 
 
Pobierz
1. #menu {
2. position: absolute;
3. list-style-type: none;
4. }
5. #menu ul {
6. list-style-type: none;
7. }

Następnie należy sprawić, aby elementy głównej listy układały się jeden za drugim, przywracając zarazem normalne zachowanie elementów list zagnieżdżonych:

[+]
 
 
Pobierz
1. #menu li {
2. float: left
3. }
4. #menu li li {
5. float: none
6. }

Ważnym elementem menu są odnośniki. Zamień je w elementy blokowe tak, aby wypełniły całą zawartość elementów list. Do poniższego kodu dołączone zostały także odpowiednie style reprezentacyjne:

[+]
 
 
Pobierz
 1. #menu li a {
 2. display: block;
 3. width: 150px;
 4. text-align: center;
 5. background: #E6E7E8;
 6. color: #656E75;
 7. padding: 3px 0;
 8. text-decoration: underline
 9. }
10.  
11. #menu li a:hover {
12. background: #CDCECF;
13. color: #383D41;
14. text-decoration: none
15. }

Za główną sztuczkę z rozwijaniem menu odpowiedzialny jest poniższy kod:

[+]
 
 
Pobierz
1. #menu li ul {
2. position: absolute;
3. height: 1px;
4. overflow:hidden
5. }
6.  
7. #menu li:hover ul {
8. height:200px
9. }

Zagnieżdżone listy o wysokości jednego piksela z zastosowaną właściwością overflow są praktycznie niewidoczne. Zostają rozszerzone, gdy kursor myszy znajdzie się nad nadrzędnym dla nich głównym elementem listy (odpowiada za to druga reguła). Sposób ten nie zadziałałby poprawnie w Internet Explorerze, gdyby nie dołączony wcześniej plik csshover2.htc. Ważną funkcję spełnia tutaj pozycjonowanie absolutne. Dzięki niemu rozwinięte listy układają się ponad znajdującą się pod nimi treścią, nie rozpychając jej.

Musisz pamiętać, że wszystkie elementy menu mają nadaną właściwość float, więc nie ma ono określonej wysokości. Z tej przyczyny należy sztucznie uzupełnić brakującą wysokość strony. Możesz pod kodem zawierającym menu umieścić pudełko z odpowiednią klasą:

 
 
 
Pobierz
<div class="przerwa"></div>

i nadaną jej wysokością:

[+]
 
 
Pobierz
1. .przerwa {
2. height: 30px;
3. }

Wszystkie zagnieżdżone listy otrzymały identyfikatory, dzięki którym można im nadać dodatkowe style. W ten sposób łatwo przeniesiesz rozwijane menu do swojego serwisu. Cały kod przykładu opisanego w tym artykule znajdziesz w załącznikach do tego artykułu.

18 lipca 2008

Powiązane publikacje

Ewolucja w nawigacji

Ewolucja w nawigacji

Idealna nawigacja

Idealna nawigacja

Pozycjonowanie elementów w CSS

Pozycjonowanie elementów w CSS

HTML i CSS - Tekst pod kontrolą

HTML i CSS - Tekst pod kontrolą

 
HTML i CSS - w przeglądarce Opera

HTML i CSS - w przeglądarce Opera

HTML i CSS - Zaawansowane możliwości CSS

HTML i CSS - Zaawansowane możliwości CSS

HTML i CSS - świat tabel

HTML i CSS - świat tabel

 
Skomentuj
ten artykuł

Komentarzy: 9

Kod obrazkowy
(Kliknij, aby zmienić)
 
Przejdż do tego postu na forum Monday, 22.03.2010 18:31bakos

po co ten div?
elementy floatowane dziłaja badzo dobrze z overflow bez sztucznych pojemników.
"float zawsze trzeba używać w połączeniu z elementami mającymi clear albo overflow, inaczej efekty jego działania będą trudne do przewidzenia."

Przejdż do tego postu na forum Monday, 28.12.2009 13:07Rado

mnie działa calkiem spoko. Pod IE 6 nie sprawdzałem bo korzysta z tego już tylko 7 % użytkowników (ranking.pl) Jednak mam problem z operą 10. Jak kilka razy rozwinę menu to potem zostaje w pamięci jakby i na obrazku pod menu zostaje ślad po linkach z pod menu. Ktoś wie jak to rozwiązać ?

Przejdż do tego postu na forum Monday, 7.12.2009 09:35Komando

Gupie to jakieś

Przejdż do tego postu na forum Thursday, 3.12.2009 20:07newOne

Hej dlaczego przy ustawieniu padding-left: 0px; dla #menu menu przestaje się rozwijać? Jak to ominąć?

Przejdż do tego postu na forum Tuesday, 2.06.2009 13:27morwo

CYTAT(jasiek @ 2.06.2009)
nie działa pod ie6 - nie polecam


ie6 - nie polecam

@topic
Nie działa, bo IE6 nie rozumie tego, że pseudoklasa :hover nie musi odnosić się tylko do elementów <a> (o czym wspomniano w artykule), a może też do <li>, co jest zgodne ze standardami W3C. Lecz to nie problem (i wcale nie polecam plików .htc, skoro można to załatwić zwykłym CSSem -- dla mnie bez sensu:"rezygnujemy z JS na rzecz CSS, ale .htc wrzucamy"), jeśli się znasz na CSS i HTML. Możesz napisać oddzielne style dla ie6, a załączając pliki .css dodać warunek:
CODE
<!--[if lte IE 6]>
<link rel="stylesheet" type="text/css" href="style-dla-ie.css" />
<![endif]-->

Przejdż do tego postu na forum Tuesday, 2.06.2009 09:48jasiek

nie działa pod ie6 - nie polecam

Przejdż do tego postu na forum Friday, 29.05.2009 08:27Romek

Super artykuł, jestem w szoku =D.
W życiu bym nie pomyślał, że to możliwe za pomocą CSS!

Przejdż do tego postu na forum Monday, 8.12.2008 09:01Marcin

Nie działa pod IE v 6 sad.gif

Przejdż do tego postu na forum Thursday, 18.09.2008 21:05Sławek

Dlaczego, kiedy zmieniam nazwę pliku z przykładowym menu, program przestaje działać? W jaki zatem sposób przenieść kod do własnego pliku?

Zobacz wszystkie komentarze »

Autor

Bartłomiej Dymecki

Bartłomiej Dymecki od kilku lat publikuje artykuły w Magazynie INTERNET i Internet Makerze. Prowadzi także poświęcony użyteczności blog www.dymecki.pl i firmę realizującą audyty serwisów internetowych.

Artykuły tego autora:

Załączniki

Newsletter

Jesli chcesz być na bieżąco z tym co się dzieje na stronie magazynu INTERNET Maker zapisz się do naszego newslettera.