Przejdź do treści

Menu w CSS

Poziome menu

Przypominam, że naszym celem będzie stworzenie estetycznego i funkcjonalnego menu nawigacyjnego na bazie kodu XHTML przedstawionego na wstępie w formie listy nieuporządkowanej - tylko poprzez dołączenie deklaracji CSS. Tym razem, na przekór domyślnej prezentacji pozycji listy, ułożymy odnośniki nawigacyjne poziomo - w formie zakładek. Takie ustawienie możemy uzyskać na dwa sposoby:

  1. Ustawiając sposób wyświetlania pozycji listy na wartość inline, czyli w linii. Oprócz tego, tak jak poprzednio, usuniemy zbędne domyślne formatowanie, które w tym przypadku tylko by przeszkadzało:
    ul, ul li {
    	display: block;
    	list-style: none;
    	margin: 0;
    	padding: 0;
    }
    
    ul li {
    	display: inline;
    	white-space: nowrap;
    }

    Efekt:

    Dodatkowo blokujemy zawijanie tekstu (white-space: nowrap), aby w przypadku gdy linki nie zmieszczą się w jednej linii, przełamanie wiersza nastąpiło pomiędzy nimi, a nie wewnątrz nich.

    Zalety:
    • Prawidłowa interpretacja w większości przeglądarek
    • Możliwość łatwego wyrównania odnośników do lewej lub prawej strony, a także wyśrodkowania
    • Nie wpływa na elementy znajdujące się poniżej
    Wady:
    • Brak możliwości ustalenia jednakowej szerokości pozycji listy
    • Odstępy między odnośnikami zależą od rodzaju i rozmiaru czcionki, a przy tym nie mogą być mniejsze niż szerokość jednej spacji
  2. Ustawiając wyświetlanie w bloku (block) oraz oblewanie (float) dla pozycji listy:
    ul, ul li {
    	display: block;
    	list-style: none;
    	margin: 0;
    	padding: 0;
    }
    
    ul li {
    	float: left;
    }

    Efekt:


    W tym przypadku blokada zawijania tekstu nie jest konieczna, ponieważ nastąpi to zawsze pomiędzy oblewanymi blokami. Wykorzystuje się wtedy właściwość, że kilka elementów z podanym oblewaniem ustawia się obok siebie, nawet jeśli są to elementy blokowe. Jeśli nie określimy szerokości takich bloków, przyjmie ona wartość wynikającą z rozmiaru zawartości [zobacz: Szerokość i marginesy automatyczne - "Elementy z oblewaniem (float) nie-zastępowane" - punkt nr 5].

    Zalety:
    • Możliwość ustalenia jednakowej szerokości pozycji
    • Dokładne ustalenie marginesu pomiędzy pozycjami listy
    Wady:
    • Trudności przy ustawieniu odnośników centralnie
    • Konieczność przypisania własności clear następnemu elementowi na stronie
    • Możliwe błędy i różnice w wyświetlaniu elementów oblewanych w niektórych przeglądarkach (zwłaszcza w Internet Explorerze)



ul, ul li {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

ul li {
	float: left;
}

ul a:link, ul a:visited {
	text-decoration: none;
	display: block;
	width: 80px;
	text-align: center;
	background-color: #ccc;
	color: #000;
	border: 2px outset #ccc;
	padding: 5px;
}

ul a:hover {
	border-style: inset;
	padding: 7px 3px 3px 7px;
}

Odnośniki zostały wyświetlone blokowo, aby można było ustalić jednakową szerokość wszystkich przycisków.






ul, ul li {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

ul {
	position: absolute;
}

ul li {
	float: left;
	border-width: 0 1px 1px 1px;
	border-style: solid;
	border-color: transparent #25b #25b #9ce;
}

ul a:link, ul a:visited {
	text-decoration: none;
	display: block;
	width: 95px;
	text-align: center;
	padding: 5px 0;
	font-weight: bold;
	background-color: #27c;
	color: #def;
	border-top: 10px solid #25b;
}

ul a:hover {
	background-color: #28e;
	color: #fff;
	border-top: 20px solid #26d;
}

Efekt wysuwania po wskazaniu myszką został uzyskany poprzez zwiększenie wysokości górnego obramowania linków. Określenie pozycji absolutnej eliminuje przesuwanie się elementów, które znajdują się poniżej menu, gdy podświetlamy linki. Jest to potrzebne tylko z uwagi na błąd Internet Explorera.




ul, ul li {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

ul {
	float: left;
	background-color: #fff;
	padding: 1px 0 1px 1px;
	border: 1px solid #000;
}

ul li {
	float: left;
}

ul a:link, ul a:visited {
	text-decoration: none;
	display: block;
	font-weight: bold;
	background: #000 url("tlo.gif") repeat-x center;
	color: #fff;
	padding: 10px 20px;
	border-right: 1px solid #fff;
	border-right: 1px solid #fff;
}

ul a:hover {
	background-color: #800;
	background-image: url("tlo2.gif");
}

Chociaż w tym przykładzie rozmiary odnośników nie zostały ustalone, musieliśmy wyświetlić je blokowo z uwagi na błąd Internet Explorera. Ponadto konieczne było przypisanie oblewania (float: left) również znacznikowi obejmującemu pozycje listy (<ul>...</ul>), ponieważ bez tego menu wyglądałoby następująco:



Elementy z ustalonym oblewaniem są usuwane z normalnego biegu treści w dokumencie, dlatego znacznik obejmujący w tym przypadku okazuje się pusty, czyli jego wysokość wynosi zero (pozostaje tylko 2*1px = 2px pionowego marginesu wewnętrznego - padding). Ustalenie oblewania dodatkowo dla elementu obejmującego sprawia, że oblewane pozycje listy pozostają w jego obrębie, a więc zachowuje on odpowiednią wysokość oraz szerokość (normalnie wynosiłaby ona 100%, co w tym przypadku jest niepożądane).

Wymagane grafiki (tlo.gif i tlo2.gif) w powiększeniu:

Tło odnośnikaTło odnośnika podświetlonego
ul, ul li {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

ul {
	text-align: center;
	border-bottom: 1px solid #888;
	padding-bottom: 5px;
}

ul li {
	display: inline;
	white-space: nowrap;
	margin-right: 5px;
}

ul a:link, ul a:visited {
	text-decoration: none;
	background-color: #ccc;
	color: #000;
	border: 1px solid #888;
	padding: 5px;
}

ul a:hover {
	background-color: #fff;
	border-bottom-color: #fff;
}

Poszczególne odnośniki menu są otoczone obramowaniem, takim samym jak dolne obramowanie całej listy, dlatego wyglądają jak zakładki. Dla stanu podświetlenia musimy tylko zmienić kolor tła oraz ustawić taki sam kolor dolnego obramowania odnośnika, dzięki czemu uzyskamy efekt wysunięcia wskazanej zakładki do przodu - przed inne.

Podobny efekt z zastosowaniem drugiego sposobu:



ul, ul li {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

ul {
	border-bottom: 1px solid #888;
	float: left;
	width: 100%;
	padding-left: 20px;
}

ul li {
	float: left;
	margin-right: 10px;
}

ul a:link, ul a:visited {
	text-decoration: none;
	display: block;
	background-color: #ccc;
	color: #000;
	padding: 5px 10px;
	border: 1px solid #888;
	position: relative;
	top: 1px;
}

ul a:hover {
	background-color: #fff;
	border-bottom-color: #fff;
}

Dla uzyskania takiego efektu, konieczne było przypisanie oblewania (float: left) również znacznikowi obejmującemu pozycje listy (<ul>...</ul>), ponieważ bez tego menu wyglądałoby następująco (nie dotyczy przeglądarki Internet Explorer, która z powodu błędu paradoksalnie bez żadnych zmian wyświetla menu właściwie):


Elementy z ustalonym oblewaniem są usuwane z normalnego biegu treści w dokumencie, dlatego znacznik obejmujący w tym przypadku okazuje się pusty, czyli jego wysokość wynosi zero. Ustalenie oblewania dodatkowo dla elementu obejmującego sprawia, że oblewane pozycje listy pozostają w jego obrębie, a więc zachowuje on odpowiednią wysokość i jego obramowanie pasuje do dolnej krawędzi zakładek. Szerokość 100% została przypisana, aby wypełnić całą poziomą powierzchnię ekranu (normalnie elementy oblewane przyjmują szerokość nie większą niż ich zawartość).

Odnośniki zostały poddane pozycjonowaniu relatywnemu, w celu przesunięcia ich w dół o 1px, ponieważ inaczej w miejscu przylegania zakładek do dolnej krawędzi listy pojawiłoby się podwójne obramowanie:


Takie wyświetlanie obramowania wynika ze sposobu renderowania elementów blokowych - obramowania zagnieżdżonych bloków wyświetlają się obok siebie, a nie na sobie (jak w poprzednim przykładzie dla elementów "inline").




ul, ul li {
	display: block;
	list-style: none;
	margin: 0;
	padding: 0;
}

ul {
	float: left;
	width: 100%;
	border-bottom: 1px solid #365;
	padding-left: 20px;
}

ul li {
	float: left;
	background: url("zakladka.gif") no-repeat left top;
	margin-right: 5px;
}

ul a:link, ul a:visited {
	text-decoration: none;
	display: block;
	font-weight: bold;
	background: url("zakladka2.gif") no-repeat right top;
	color: #365;
	padding: 5px 15px 5px 5px;
	margin-left: 10px;
}

ul a:hover {
	color: #032;
}

Wymagane grafiki (zakladka.gif i zakladka2.gif):

Lewy narożnikŚrodek i prawy narożnik

Dla tak przygotowanych grafik, szerokość zakładki nie może przekroczyć 200px. Jeśli spodziewasz się, że może się tutaj znaleźć dłuższy tekst, musisz utworzyć szerszą grafikę zakladka2.gif.

Lewy narożnik obrazka zakładki został wstawiony w tle pozycji listy (bez powielania), natomiast grafika ze środkiem i prawym narożnikiem znalazła się w tle odnośników. Odnośniki muszą być wyświetlone w bloku, ponieważ inaczej grafiki zakładek nie pokrywałyby się (alternatywnie można przypisać pozycjom listy taki sam pionowy margines wewnętrzny jak odnośnikom):


Lewy margines wewnętrzny odnośników odpowiada za odstęp tekstu od miejsca, gdzie lewy-górny narożnik zakładki nie jest już zaokrąglony. Prawy margines wewnętrzny ma tę samą wartość, powiększoną jednak o szerokość prawego zaokrąglenia, ponieważ jest ono zawarte w grafice zakladka2.gif, która została wstawiona w tle odnośników, podczas gdy lewy narożnik (zakladka.gif) znajduje się w tle pozycji listy. Bez tego dodatkowego marginesu wewnętrznego tekst na zakładkach byłby ustawiony niesymetrycznie:


Aby przygotować wolne miejsce do wyświetlenia tła lewego brzegu zakładki, odnośniki mają przypisany lewy margines. Inaczej grafika ta znalazłaby się pod tłem odnośnika:


Prawy margines pozycji listy ustala odstępy pomiędzy sąsiednimi zakładkami.

Zobacz także

poziome (12), menu (9), zakładki (2), lista (12), wykaz (9)

Komentarze

Zobacz więcej komentarzy

Dotacje

Pomogła Ci ta strona? Chcesz, aby dalej się rozwijała?
Dotpay - Bezpieczne transakcje internetowePayPalWpłać dobrowolną dotację...

HTML:
A ABBR ACRONYM ADDRESS APPLET AREA ARTICLE ASIDE AUDIO B BASE BASEFONT BDI BDO BIG BLOCKQUOTE BODY BR BUTTON CANVAS CAPTION CENTER CITE CODE COL COLGROUP COMMAND DATALIST DD DEL DETAILS DFN DIALOG DIR DIV DL DT EM EMBED FIELDSET FIGURE FIGCAPTION FONT FOOTER FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HEADER HGROUP HR HTML I IFRAME IMG INPUT INS ISINDEX KBD KEYGEN LABEL LEGEND LI LINK MAP MARK MATH MENU META METER NAV NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION OUTPUT P PARAM PRE PROGRESS Q RP RT RUBY S SAMP SCRIPT SECTION SELECT SMALL SOURCE SPAN STRIKE STRONG STYLE SUB SUMMARY SUP SVG TABLE TBODY TD TEXTAREA TFOOT TH THEAD TIME TITLE TR TRACK TT U UL VAR VIDEO WBR
CSS:
align-content align-items align-self azimuth background background-attachment background-clip background-color background-image background-origin background-position background-repeat background-size border border-bottom border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-left border-radius border-bottom-right-radius border-bottom-left-radius border-top-right-radius border-top-left-radius border-right border-top border-bottom-color border-left-color border-right-color border-top-color border-bottom-style border-left-style border-right-style border-top-style border-bottom-width border-left-width border-right-width border-top-width border-collapse border-color border-spacing border-style border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip color column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width columns content counter-increment counter-reset cue cue-after cue-before cursor direction display elevation empty-cells flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-size font-size-adjust font-stretch font-style font-variant font-weight height justify-content left letter-spacing line-height list-style list-style-image list-style-position list-style-type margin margin-bottom margin-left margin-right margin-top marker-offset marks max-height max-width min-height min-width opacity order orphans outline outline-color outline-offset outline-style outline-width overflow padding padding-bottom padding-left padding-right padding-top page page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position quotes resize richness right size speak speak-header speak-numeral speak-punctuation speech-rate stress table-layout text-align text-decoration text-indent text-shadow text-transform top unicode-bidi vertical-align visibility voice-family volume white-space widows width word-spacing z-index