|
HTML i CSS pod lupą
Stron WWW stale przybywa. Coraz więcej ludzi
ma dostęp do Internetu, a wielu z nich nie chce być tylko odbiorcami - chce się
pokazać. WWW to najpopularniejsza z usług Internetu. Nic dziwnego, że tak wiele
osób robi swoje strony. Zdaniem niektórych to niedobrze, że Sieć staje się coraz
gorszym śmietnikiem pełnym kiepskich stron - zarówno pod względem formy, jak i
treści. Ja uważam jednak, że potęga Internetu leży właśnie w takiej rozproszonej
pajęczynie różnorodnych zasobów i wspaniałe jest to, że każdy może w niej
zaistnieć - na miarę własnych umiejętności.
Ten artykuł to zbiór porad na temat tworzenia
stron WWW z użyciem HTML i CSS. Staram się pokazać w nim szereg szczegółów,
niuansów, mało znanych chociaż użytecznych elementów, atrybutów i właściwości
tych języków. Opisuję w nim to, na co zwróciłem szczególną uwagę czytając
ostatnio po raz drugi ich specyfikacje. Chciałbym podkreślić, że to nie jest
kurs HTML ani CSS. Żeby zrozumieć ten artykuł, musisz już znać conajmniej
podstawy tych języków. To nieuniknione, że dobór tematów jest subiektywny.
Niektóre z przedstawionych tu rozwiązań zapewne już znasz, inne wydadzą ci się
mało interesujące. Mimo tego mam nadzieję, że ten artykuł choć trochę pomoże ci
pisać lepsze strony WWW.
W standardach internetowych bardziej niż
gdziekolwiek indziej daje się we znaki ogromna rozbieżność pomiędzy standardami,
jakie ustala
W3C, a ich
realizacją w różnych przeglądarkach WWW. Wystarczy spojrzeć na tabelę na stronie CSS contents and browser compatibility. Można się zastanawiać, czy teoria
to tylko nieudolna próba usystematyzowania praktyki, czy też może praktyka to
tylko nieudolna próba zastosowania teorii. Jakkolwiek jest naprawdę, stworzenie
strony, która jest jednocześnie zgodna ze standardem i wygląda dobrze w różnych
przeglądarkach to prawdziwe wyzwanie.
Jednak warto do tego dążyć. Dzięki temu
powstaje strona bardziej *dostępna*. Gorąco polecam w tym miejscu książkę "W głąb dostępności". Jest na
licencji GNU FDL i chociaż skupia się na dosyć wąskiej dziedzinie - dostosowaniu
internetowego bloga do potrzeb internautów niepełnosprawnych - zawiera bardzo
wiele praktycznych porad na temat języków HTML i CSS. Dla mnie dostępność
oznacza coś więcej. Rozumiem przez to spełnienie wymagań takich jak:
-
Strona działa dobrze w różnych przeglądarkach
WWW. Już tylko ok. 80% internautów używa Microsoft Internet Explorer. To nadal
największa grupa, ale rośnie popularność programów alternatywnych, a pośród nich
na wymienienie zasługuje przede wszystkim
Mozilla i oparty na tym samym silniku
FireFox. Tak czy owak, IE i Mozilla są obecnie i zapewne długo jeszcze pozostaną
dwiema najważniejszymi przeglądarkami i na nich należy sie skupić.
-
Strona działa dobrze w różnych systemach
operacyjnych. W każdym z nich stosuje się inne przeglądarki i dostępne są inne
czcionki.
-
Strona działa dobrze również w przeglądarkach
takich, jak tekstowy
Lynx czy programy dla niewidomych
odczytujące treść strony na głos. HTML został tak zaprojektowany, aby strony
mogły być interpretowane na różne sposoby. Trzeba go tylko odpowiednio użyć.
-
Strona zostanie dobrze skatalogowana przez
wyszukiwarki internetowe, takie jak (najpopularniejszy obecnie)
Google, a tym samym więcej osób ją odnajdzie i odwiedzi.
Aby dobrze poznać HTML i CSS, nie wystarczy
przeczytać kilka kursów. Trzeba nauczyć się korzystać z oryginalnej specyfikacji
tych standardów. Znajdziesz je tutaj:
Kiedy już zrobisz swoją stronę, powinieneś
sprawdzić jej poprawność za pomocą usług walidacyjnych W3C:
Chociaż nie jest pokazywany w treści
dokumentu, każdy program do odczytywania WWW (od przeglądarki po wyszukiwarkę
katalogującą twoją stronę) przywiązuje dużą uwagę do tekstu, jaki zawierasz w
sekcji <head> na swojej stronie:
<title>Tytuł mojej strony<title>
Na podstawie swoich doświadczeń chciałbym
udzielić ci kilku wskazówek na temat tego tytułu. Po pierwsze - tytuł powinien
dobrze opisywać treść danego dokumentu. Nie wpisuj do niego listy słów
kluczowych, jak robią to niektórzy:
<title>Strona o programowaniu - programowanie,programować,kodować,
kodzić,kodowanie,C++,delphi,basic,pascal<title> <!-- ŹLE !!! -->
Po drugie - nigdy nie nazywaj strony głównej
Strona główna. To nic nie mówi. Wyobraź sobie internaute przeglądającego
jednocześnie wiele stron, który na pasku zadań ma okno tak właśnie zatytułowane.
<title>Strona główna<title> <!-- ŹLE !!! -->
Tytuł powinien być możliwie krótki i opisywać
sedno sprawy. Strona główna powinna nosić tytuł całego twojego serwisu:
<title>Strona o programowaniu<title>
Natomiast podstrony mogą mieć tytuł złożony z
kilku członów:
<title>Strona o programowaniu :: Zobacz artykuł ::
Jak napisać trojana?<title>
Lub jeszcze lepiej - sam tytuł danego
artykułu:
<title>Jak napisać trojana?<title>
Wysuwam nawet hipotezę, że taki krótki tytuł
trafiający w samo sedno to magiczny klucz do wysokiej pozycji strony w wynikach
wyszukiwania Google. Nie jest bowiem tajemnicą, że wyszukiwarki bardzo małą wagę
przykładają do słów kluczowych keywords - wielu twórców stron
wpisuje tam byle jakie, niezwiązane z tematem, a często wyszukiwane słowa, jak
sex,porno,mp3. Długi tytuł <title> też może być
interpretowany jako próba "oszukania" mechanizmu katalogującego wyszukiwarki.
Jako przykład zobacz moją stronę domową. W dziale
Ludzie znajdują się konta
zarejestrowanych osób. Wyszukaj pseudonim któregoś z nich (albo mój)
w Google w stronach polskich, a najprawdopodobniej konto tej osoby na mojej
stronie zobaczysz na pierwszym miejscu - przed jego własną stroną domową i
innymi śladami jego działalności w Sieci, a nawet przed stronami poważnych firm
o tej samej nazwie (np.
Spax). Moja strona wcale nie notuje ogromnej popularności. Wydaje mi się, że
cała tajemnica tkwi właśnie w tytule strony danego konta - jak możesz się
przekonać, jest nim tylko sama ksywa danej osoby.
Każdy plik czy pakiet sieciowy musi mieć
nagłówek. Dzięki niemu może zostać prawidłowo rozpoznany i obsłużony. Nie
inaczej jest ze stronami HTML. Każda taka strona powinna rozpocząć się od
jednego z trzech możliwych nagłówków:
-
Jeśli będziesz ściśle przestrzegał
specyfikacji HTML i nie będziesz używał żadnych wycofanych elementów ani
atrybutów:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
-
Jeśli chcesz pozwolić sobie na używanie
wycofanych elementów i atrybutów:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
-
Jeśli używasz ramek, czyli zamiast
<body> chcesz użyć w danym dokumencie <frameset> (ten
nagłówek również dopuszcza składniki wycofane):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
Element albo atrybut jest przez standard
uznany za wycofany (ang. "deprecated"), kiedy nie zaleca się jego używania, bo
istnieje lepsze wyjście. wycofany są głównie składniki określające formatowanie,
jak element
<font> czy atrybut background. Zamiast nich należy
używać arkusza stylów CSS i za jego pomocą określać wygląd strony, a w pliku
HTML zawierać tylko jej treść i odniesienia do tego arkusza.
Warto jednak pozostawić sobie furtkę, żeby
czasem można było użyć jednego z tych wycofanych składników. W końcu nie są one
wycofane ze standardu (chociaż mogą zostać wycofane w kolejnych wersjach), a CSS
nie jest doskonały i nie zawsze pozwala na łatwe zrobienie tego, co chce się
otrzymać.
Dlatego osobiście polecam w miarę możliwości
nie używać tych wycofanych części języka HTML, ale stosować nagłówek drugi.
Szablon pustego dokumentu HTML może wtedy wyglądać tak:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="pl">
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=Windows-1250">
<title>Tytuł</title>
<meta name="Description" content="Opis">
<meta name="Keywords" content="słowo,słowo,słowo">
<meta name="robots" content="all">
<link rel="stylesheet" type="text/css" href="mójstyl.css"
charset="Windows-1250">
</head>
<body>
</body>
</html>
Istnieje wiele standardów kodowania znaków. Do
zapisu polskich liter można używać:
- Windows-1250
-
Standard używany domyślnie w Windows.
Obsługiwany przez wszystkie programy w tym systemie, jak choćby systemowy
Notatnik.
- ISO-8859-2
-
Standard używany w Linux i bardziej zalecany
do używania w Sieci. W Windows obsługiwany tylko przez nieliczne programy, jak
Pajączek.
Strony po angielsku zapisuje się natomiast w:
- ISO-8859-1
-
Standardowy zestaw znaków. Jeśli napiszesz
plik tekstowy bez polskich liter, będzie zgodny z tym standardem.
Są też standardy uniwersalne, pozwalające na
kodowania znaków wielu różnych języków (w tym także polskiego) w jednym
dokumencie (tzw. Unikod):
- UTF-8
-
Znaki standardowe zapisuje tak jak ISO-8859-1,
ale do zapisania polskiej litery wykorzystuje dwa bajty.
- UTF-16
-
Do zapisania każdego znaku wykorzystuje dwa
bajty.
Musisz poinformować przeglądarkę o tym, w
jakim standardzie zakodowane są polskie znaki na twojej stronie. W przeciwnym
razie użytkownik w ich miejscu zobaczy krzaki i ciężko będzie ją przeczytać.
Służy do tego jeden z elementów
<meta>. Umieszczaj go zaraz na początku wewnątrz sekcji
<head>:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
Oczywiście w miejsce ISO-8859-2
wstaw nazwę użytego kodowania.
http-equiv to taki rodzaj
elementu <meta>, który uzupełnia informacje z nagłówka HTTP. Jeśli
znasz trochę specyfikację protokołu
HTTP
lub używasz funkcji header() w PHP, wiesz o czym mówię. Kodowanie
możesz też zdefiniować za pomocą prawdziwego nagłówka HTTP. Odpowiedni kod w
języku PHP wygląda tak:
header('Content-Type: text/html; charset=ISO-8859-2');
Chodzi o zastępowanie niektórych specjalnych
znaków ich odpowiednikami w postaci takiej jak
<. Istnieje wiele znaków, które można w ten sposób zastępować,
ale w przypadku kilku z nich obowiązkowo trzeba to robić:
-
& (od ang. "amperstand")
zastępuje "&"
- zawsze, bo sam ten znak oznacza właśnie rozpoczęcie referencji do encji
znakowej.
-
< (od ang. "less than" -
mniejszy niż) zastępuje
"<" - przynajmniej w tekście pomiędzy znacznikami, bo sam ten znak
oznacza rozpoczęcie znacznika (np. <br>).
-
> (od ang. "greater than" -
większy niż) zastępuje
">" - przynajmniej w wartości atrybutu, bo sam ten znak może zostać
odebrany jako zakończenie znacznika.
-
" (od ang. "quotation-marks"
- cudzysłów) zastępuje
" - przynajmniej w wartości atrybutu, bo sam ten znak oznacza
zakończenie tej wartości (np. class="naglowek").
Przeglądarki czasami tolerują nieużywanie tych
konstrukcji, tylko pisanie odpowiadających im znaków bezpośrednio, ale nie radzę
na tym polegać. Takie błędy są bardzo poważne i zawsze wyłapywane przez
validator. Szczególnie częstym błędem jest zapominanie o odpowiednim zapisaniu
znaku
&, który ma zwyczaj pojawiać się w adresach. Trzeba zawsze pisać w
ten sposób:
<a href="index.php?page=users&action=view&id=14"> <!-- ŹLE !!! -->
<a href="index.php?page=users&action=view&id=14"> <!-- Dobrze -->
Za pomocą referencji do encji znakowych można
też zapisać wiele dodatkowych, użytecznych znaków. Oto niektóre z nich:
-
« - « - podwójna
strzałeczka w lewo
-
» - » - podwójna
strzałeczka w prawo
-
© - © - symbol "copyright"
-
§ - § - znak paragrafu
Wszystkie odstępy (białe znaki) w kodzie HTML
takie, jak spacje, tabulacje, końce wiersza itp. - są zamieniane na pojedyncze
spacje. Dzięki temu możesz pisać tekst dzieląc go swobodnie na linie, a mimo
tego przeglądarka potraktuje go jako tekst w jednej linii. Do wymuszenia
przejścia do nowej linii w wynikowej stronie WWW służy element <br>.
Uważaj jednak na początku i na końcu każdego
elementu - wokół znaczników. Postawienie lub niepostawienie w tych miejscach
spacji czy znaku końca wiersza ma znaczenie. Dlatego dwa poniższej linki
wyglądają i działają trochę inaczej. Lepszy wydaje się wariant pierwszy.
a <a href="xxx">b</a> c
a<a href="xxx"> b </a>c
Wyjątkiem jest element <pre>, w
którym znaki końca wiersza są interpretowane dosłownie. Dzięki temu możesz
pokazywać fragmenty kodów źródłowych z wcięciami itp. Nie zaleca się jednak
używania w nich tabulacji - lepiej zawsze robić wcięcia za pomocą dwóch spacji,
tak jak tutaj:
for (x = Rect.left; x < Rect.right; x++) {
if ((x^235334435)%3 != 0) {
TextIndex = (x^435435)%TEXT_COUNT;
TextY = static_cast<int>(Time*static_cast<int>
((sinf(static_cast<float>(x)*10.0f)+2.0f)*4.0f));
B = 128+static_cast<BYTE>(( (x*324324)^3244325 )%127);
for (y = 0; y < static_cast<int>
(TEXTS[TextIndex].length()); y++) {
main::screen::Draw(x, Rect.top+(TextY+y)%Rect.height(),
main::screen::Char(TEXTS[TextIndex][y], false,
RGB(B/2, B, B/2), 0));
}
}
}
Oprócz tytułu strony, sekcja <head>
może zawierać zbiór znaczników <meta> przechowujących pary
łańcuchów w postaci nazwa => wartość. Zbiór dopuszczalnych nazw i ich znaczenie
nie są ściśle zdefiniowane, jednak istnieje bardzo dużo ogólnie przyjętych i
często stosowanych. Najważniejsze z nich to:
-
Słowa kluczowe keywords - należy
wymienić po przecinku słowa związane z tematyką strony. Wyszukiwarki biorą je
pod uwagę podczas katalogowania twojej strony.
-
Opis strony description - krótki
opis zawartości danej strony, który może być pokazywany pod jej tytułem w
wynikach wyszukiwania.
-
Polecenie dla programów katalogujących strony
robots - np. wartość "all" oznacza, że cała strona powinna
zostać skatalogowana, a "noidenx" - że nie powinna.
Oto przykład użycia tych znaczników:
<head>
<title>Strona o programowaniu</title>
<meta name="keywords" content="programowanie,programować,kodować,
kodzić,kodowanie,C++,delphi,basic,pascal">
<meta name="description" content="Serwis poświęcony programowaniu
pecetów w różnych językach programowania.">
<meta name="robots" content="all">
</head>
Jest też wiele innych możliwości. Niektóre z
nich to:
-
author - definiuje nazwę autora
strony, np.
"Jan Kowalski".
-
copyright - przechowuje notatkę o
prawach autorskich, np.
"© 2004 Kowalski S.A.".
-
date - przechowuje datę
utworzenia strony, np.
"1994-11-06T08:49:37+00:00".
-
generator - przechowuje nazwę
programu użytego do stworzenia strony, np. "Pajączek NxG 5.0.2".
Znacznik <meta> pozwala też na
uzupełnianie informacji z nagłówka HTTP. Przykład poznaliśmy już wcześniej przy
okazji określania kodowania:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
Niektóre inne możliwości to:
-
Definiuje, kiedy strona wygasa:
<meta http-equiv="Expires" content="Tue, 20 Aug 1996 14:25:27 GMT">
-
Określa datę utworzenia dokumentu:
<meta http-equiv="Creation-date" content="2004-09-12T17:06:15Z">
-
Nakazuje odświeżanie treści strony po podanej
liczbie sekund:
<meta http-equiv="Refresh" content="10">
W ten sposób można też zrobić przekierowanie
na inną stronę po podanym czasie, ale Konsorcjum nie zaleca tego sposobu (lepiej
to robić za pomocą prawdziwego nagłówka HTTP)
<meta http-equiv="Refresh" content="10; URL=http://www.onet.pl/">
-
Określa adres kontaktowy adres e-mail:
<meta http-equiv="Reply-to" content="mój@adres.e-mail.pl">
-
Określa język strony
<meta http-equiv="Content-Language" content="pl">
-
Informuje przeglądarki i serwery proxy, że
strona jest generowana dynamicznie, często się zmienia i dlatego nie należy jej
buforować, tylko za każdym razem pobierać z serwera. Te dwa nagłówki muszą być
razem, ponieważ wzajemnie uzupełniają się do dwóch różnych wersji HTTP:
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control"
content="no-store, no-cache, must-revalidate">
-
Działające tylko w przeglądarce Microsoftu
efekty przejścia podczas wchodzenia i wychodzenia na daną stronę:
<meta http-equiv="Page-Enter"
content="RevealTrans(Duration=3,Transition=0)">
<meta http-equiv="Page-Exit"
content="RevealTrans(Duration=3,Transition=0)">
Element <link>, występujący w
sekcji
<head>, wykorzystywany jest zwykle do dołączania zewnętrznego
arkusza stylów w taki sposób:
<link rel="stylesheet" type="text/css" href="moj_styl.css">
Posiada też jednak inne, bardzo ważne
zastosowanie. Za jego pomocą można zdefiniować powiązania z innymi stronami
serwisu - ze stroną główną, nadrzędną, następną, poprzednią itp. Nie zawsze ma
to sens, ale warto wykorzystywać tą możliwość jak najczęściej - szczególnie w
zbiorach dokumentów o zorganizowanej strukturze, jak fora dyskusyjne czy
wieloczęściowe kursy.
Te powiązania nie są wyświetlane w treści
strony, a Internet Explorer nie potrafi zrobić z nich żadnego użytku. Jednak dla
użytkowników innych przeglądarek, jak Mozilla czy tekstowy Lynx, bywają one
nieocenioną pomocą podczas poruszania się po stronach danego serwisu.
Przykładowo Mozilla pokazuje na stronach, które używają tego mechanizmu,
dodatkowy pasek z przyciskami do nawigacji.
Przykładowe powiązanie ze stroną poprzednią
wygląda tak:
<link rel="prev" title="Rozdział 4 - Zmienne" href="chapter4.html">
Niektóre dopuszczalne wartości atrybutu
rel to:
-
alternate - odpowiednik tego
dokumentu dla innego języka lub medium
-
stylesheet - arkusz stylów
-
start - pierwszy dokument
-
next - następny dokument
-
prev - poprzedni dokument
-
contents - spis treści
-
index - indeks
-
glossary - słownik terminów
-
copyright - notatka o prawach
autorskich
-
chapter - rozdział
-
section - sekcja
-
subsection - podsekcja
-
appendix - dodatek, załącznik
-
help - pomoc
-
bookmark - zakładka
Jeszcze jednym przykładem jest połączenie do
innej wersji językowej ten samej strony:
<link rel="alternate" title="The manual in Portuguese" type="text/html"
hreflang="pt" href="http://someplace.com/manual/portuguese.html">
Zobacz
Przykład 1.
Microsoft wprowadził możliwość skojarzenia ze
stroną ikony - takiej, jak mają programy i inne pliki w Windows. Coraz więcej
przeglądarek obsługuje ten mechanizm. Taka ikonka jest wyświetlana m.in. na
pasku przeglądarki obok adresu, w "Ulubionych" itp.
Aby zrobić ikonkę do swojej strony, najpierw
musisz ją narysować. Zapisać ją należy w formacie ICO - są do tego
specjalne programy. Plik taki powinien zawierać przynajmniej wersję o wymiarach
16x16, a najlepiej także 32x32. Nazwij go "favicon.ico" i umieść w
katalogu głównym twojej strony - wiele przeglądarek domyślnie tam go szuka.
Wreszcie, dodaj do swojej strony w sekcji
<head>
taką linijkę:
<link rel="SHORTCUT ICON" href="favicon.ico">
Bardzo wiele elementów w języku HTML posiada
atrybut title. Warto go używać, żeby opisywać tytuł danego zasobu.
Przeglądarki graficzne często pokazują go w formie dymka po najechaniu kursorem
myszy nad dany element, nawet jeśli to jest zwykły akapit.
Ten atrybut najlepiej nadaje się chyba do
linków. Daje dodatkowe możliwości do różnych form, w jakich linki mogą być
zbudowane. Oto kilka przykładów:
Kliknij <a href="http://www.regedit.risp.pl/">tutaj</a> <!-- ŹLE !!! -->
Kliknij <a href="http://www.regedit.risp.pl/"
title="Regedit - Strona Domowa">tutaj</a> <!-- Już lepiej -->
<a href="http://www.regedit.risp.pl/">Regedit - Strona Domowa</a>
Więcej informacji znajdziesz na <a href="http://www.regedit.risp.pl/"
title="Regedit - Strona Domowa">mojej stronie domowej</a>
Warto też zaznaczać skróty za pomocą elementu
<acronym>. Pisząc informacje techniczne używasz wielu skrótów i z
pewnością nie wszystkie są znane czytającemu. Dlatego stosuj taką konstrukcję:
<acronym title="World Wide Web Consortium">W3C</acronym>
Niektórzy chcieliby stosować także element
<abbr>
(ang. "abbreviation" - skrót) podkreślając, że skrót to nie to samo co akronim.
Niestety atrybut title w przypadku tego elementu nie pokazuje dymka
w Internet Explorerze, dlatego najlepiej zawsze stosować (do skrótów i do
akronimów) element <acronym>.
Zobacz
Przykład 2.
Do nagłówków w swoim dokumencie używaj
elementów od <h1>
do <h6>, a nie akapitów ze specjalnymi klasami stylów. Dzięki temu
będą nie tylko wyglądały jak nagłówki, ale również będą prawdziwymi nagłówkami,
a to może być istotne dla niektórych programów odczytujących twój dokument.
Konsorcjum zaleca nie pomijać poszczególnych
poziomów nagłówków, tylko używać kolejno: <h1>, w nim <h2>,
dopiero pod nim
<h3> itd. Chodzi o to, żeby nie wykorzystywać wybiórczo
poszczególnych poziomów nagłówków tylko z powodu takiego czy innego ich wyglądu.
Przykładowy kod może wyglądać tak:
<h1>Rozdział 1</h1>
<!-- Wstęp do rozdziału 1... ->
<h2>Podrozdział 1</h2>
<!-- Treść podrozdziału 1... -->
<h2>Podrozdział 2</h2>
<!-- Treść podrozdziału 2... -->
<h1>Rozdział 2</h1>
<!-- itd... -->
Ciekawym problemem jest forma, w jakiej
powinno się zapisywać nagłówek główny - ten pierwszy i jedyny, który znajduje
się na górze treści strony i jest taki sam, jak jej tytuł. Możliwych rozwiązań
jest kilka:
-
Stosować do niego <h1>, a jako
nagłówki w treści dokumentu używać te od <h2>.
-
Stosować do niego akapit ze specjalną klasą, a
dopiero w treści dokumentu używać wszystkich nagłówków od <h1>.
-
Stosować do niego nagłówek <h1>
ze specjalną klasą, a w treści dokumentu używać normalnych nagłówków od
<h1>. Obecnie skłaniam się właśnie do tego rozwiązania.
Bardzo efektownym pomysłem jest zdefiniowanie
w arkuszu stylów ramki (ang. "border") po niektórych stronach nagłówka.
Przykładowy styl może wyglądać tak:
h1 {
font-weight: bold;
color: darkblue;
font-size: 16pt;
border-left: #475691 4px solid;
border-bottom: #475691 1px dashed;
padding-left: 4px;
}
h2 {
font-weight: bold;
color: darkblue; font-size: 13pt;
border-left: navy 4px dotted;
padding-left: 3px;
}
h3,h4,h5,h6 {
font-weight: bold;
color: darkblue;
font-size: 9pt;
}
h1#title {
text-align: center;
border-style: none;
}
Zobacz
Przykład 3.
Większość twórców stron WWW używa tylko
niektórych elementów HTML - najczęściej nagłówków <h1> - <h6>
i akapitów <p>. Tymczasem język ten zawiera wiele interesujących
możliwości, które jednocześnie definiują znaczenie danego fragmentu i pozwalają
(z pomocą arkusza stylów) na jego wizualne formatowanie.
Warto ich używać, ponieważ dużo wygodniej jest
zdefiniować sobie wygląd (np, czcionkę, kolor) do znacznika pisanego tak:
Zmienna nosi nazwę <code>MyObject</code>
niż tak:
Zmienna nosi nazwę <span class="KlasaDoKodu">MyObject</span>
Niektóre z tych elementów są "block-level" -
zastępują akapit:
Inne natomiast są typu "inline" - mogą
występować wewnątrz tekstu:
-
<em>, <strong> -
nacisk i silniejszy nacisk. Stosuj zamiast <b>.
-
<cite> - cytat lub odniesienie do
innego źródła (np. nazwa jakiegoś standardu).
-
<dfn> - definicja.
-
<code> - fragment kodu
komputerowego w tekście, np. nazwa zmiennej czy funkcji.
-
<samp> - wydruk wyjścia programu.
-
<kbd> - tekst do wprowadzenia
przez użytkownika.
-
<var> - zmienna lub argument
programu.
-
<abbr>, <acronym> -
skrót i akronim.
-
<q> - cytat.
Zobacz
Przykład 4.
Akapit jaki jest, każdy widzi - ot element
<p> - żadna filozofia. Jednak jego też trzeba umieć poprawnie używać. Np.
W3C nakazuje nie pisać (tak często stosowanych przez niektórych do robienia
odstępu) akapitów pustych.
<p></p> <!-- ŹLE !!! -->
<p> </p> <!-- Już lepiej -->
Najlepiej rozwiązać to tak:
<p style="margin-top:2em;">
No i mamy akapit, nad którym jest przerwa o wysokości 2 linijek tekstu.
Akapit może zawierać w swoim wnętrzu wyłącznie
tekst i elementy typu "inline", jak np. <strong>. Nie może
natomiast zawierać elementów typu "block-level", jak nagłówki <h1>.
Teoretycznie akapitów, podobnie jak niektórych
innych elementów, nie trzeba zamykać. Początek następnego akapitu, nagłówka albo
innego elementu typu "block-level" powinien oznaczać koniec danego akapitu.
Niestety panowie z MS pomyśleli widocznie inaczej i niezamknięcie akapitu grozi
potraktowaniem w Internet Explorerze następującej po nim np. tabeli jako
zawartej w tym akapicie. Konsekwencją tego będzie brak odstępu pomiędzy nimi, a
także odziedziczenie z niego formatowania. Dlatego lepiej zawsze akapity zamykać
</p>.
Zobacz
Przykład 5.
Jeśli piszesz stronę po polsku, prawdopodobnie
będą na nią wchodzili wyłącznie Polacy. Ale globalizacja wciąż postępuje i może
na nią trafić ktoś z dowolnego zakątka świata. Każdy człowiek bez trudu rozpozna
użyty język (jeśli tylko nie piszesz iAkIMiŚ d21WNYM1 ltierakmi :) lub
przynajmniej stwierdzi, czy jest w stanie to przeczytać. Ale maszynom sprawia to
dużo większy problem. Dlatego powinieneś jawnie określić użyty język.
Służy do tego atrybut lang.
Występuje w wielu różnych elementach. Warto określić go globalnie dla całego
dokumentu HTML, a potem ewentualnie zmieniać w elementach podrzędnych.
<html lang="pl">
<head>
<!-- ... -->
</head>
<body>
<p>Linus Torvalds powiedział tak:
<q lang="en">Software is like sex: It's better when it's free.</q>
List często się używa, bo pozwalają
usystematyzować informacje. Najczęściej spotykane są listy nieuporządkowane
(wypunktowane)
<ul> (ang. "unordered list") i uporządkowane (numerowane)
<ol> (ang. "ordered list"). Element określający pozycję listy
<li> nie musi być zamykany. Każda lista musi posiadać conajmniej jedną
pozycję.
Bardzo przydatny, chociaż niedoceniany jest
trzeci rodzaj listy - lista definicyjna <dl>. Przeznaczona jest do
podawania listy definicji różnych pojęć i może zawierać dwa rodzaje pozycji:
Te dwa rodzaje pozycji nie muszą występować
naprzemiennie - może to być dowolna ich kombinacja. Ich także nie trzeba
zamykać.
Niektóre przeglądarki (zgadnij które ;) mają
problem w sytuacji, kiedy pozycja listy nie zaczyna się tekstem, tylko jakimś
blokiem (jak kolejna, zagnieżdżona lista) i pokazują ten blok dopiero w
następnej linii pod oznaczeniem pozycji listy. Mozilla pokazuje w tej samej -
tam, gdzie pokazałaby tekst danej pozycji.
Zobacz
Przykład 6.
Tabele to bardzo potężny, ale i niełatwy
mechanizm HTML. Często stosuje się je, wbrew zaleceniom Konsorcjum, do robienia
układu strony. Poza tym służą również do tego, do czego powinny - do
prezentowania tabelarycznych danych. Ciekawe, że atrybut width
tabeli nie jest wycofany. Jednak mimo tego zaleca się definiować szerokość
tabeli za pomocą stylów.
Oto przykład prostej tabeli:
<table summary="Podsumowanie">
<caption>Tytuł</caption>
<thead>
<tr>
<th colspan="2">Nagłówek
<tfoot>
<tr>
<td>Stopka 1<td>Stopka 2
<tbody>
<tr>
<td>Dane 11<td>Dane 12
<tr>
<td>Dane 21<td>Dane 22
</table>
Atrybut summary to krótkie
podsumowanie zawartości tabeli. Nie jest nigdzie pokazywane, ale może być
wykorzystane np. przez przeglądarki głosowe dla niewidomych albo przez roboty
katalogujące. Dlatego warto go ustawiać.
Warto też używać podelementu <caption>.
Często spotyka się osobny akapit nad lub pod tabelą, który zawiera jej podpis.
Tak nie należy robić. Ten podelement służy właśnie do tego, a za pomocą
odpowiednich właściwości arkusza stylów można sprawować pełną kontrolę nad jego
wyglądem, formatowaniem, ramką, a także pozycją (nad lub pod tabelą - to
niestety nie działa w MSIE, w którym zawsze jest nad).
Kolumny
Przeglądarka potrafi sama domyślić się ilości
kolumn tabeli. Mimo tego można i powinno się jawnie je definiować. Szczególnie,
że dzięki temu, przy okazji można podać ich styl. Bez tego trzebaby określony
styl nadawać każdej komórce leżącej w danej kolumnie.
Kolumnę definiuje znacznik <col>.
Do nadania kolumnie stylu służą atrybuty class i id.
Atrybut
width określa szerokość, natomiast atrybut span
mówi o tym, ile jednakowych kolumn na raz definiuje ten element.
Listę kolumn można podać jako listę elementów
<col>, ale można je też dodatkowo pogrupować za pomocą elementu
<colgroup>. Ten element także posiada atrybuty
class i id. Jego atrybut width
określa szerokość każdej kolumny danej grupy (chyba że definiuje one własną
szerokość), natomiast atrybut span pozwala zdefiniować liczbę
kolumn w danej grupie i w przypadku, jeśli grupa zawiera choć jedną kolumnę
zdefiniowaną jawnie za pomocą <col> - jest ignorowany.
Aby lepiej zilustrować to trudne zagadnienie,
omówię przykład:
<table>
<colgroup class="liczby" width="50" span="5">
</colgroup>
<colgroup width="75">
<col class="napisy" span="3">
<col id="nazwa" width="100">
</colgroup>
...
Pierwsza grupa definiuje 5 jednakowych kolumn
o szerokości 50 pikseli i klasie "liczby". Druga grupa definiuje
kolumny o domyślnej szerokości 75 pikseli. Pośród nich są 3 kolumny o klasie
"napisy" i jedna o identyfikatorze "nazwa", której
szerokość zostaje zmieniona względem domyślnej szerokości kolumn z tej grupy na
100 pikseli. W sumie tabela będzie więc miała 9 kolumn.
Wiersze i komórki
Wiersze definiuje się za pomocą elementu
<tr> (ang. "table row"). Można je zgrupować za pomocą elementów
<thead>,
<tfoot> i <tbody>. Żadnego z nich nie trzeba (ale
można) zamykać. W każdym wierszu musi być tyle samo kolumn.
Warto stosować to grupowanie, ponieważ dla
wielu różnego rodzaju przeglądarek może to mieć znaczenie. Przykładowo, długa
tabela może być drukowana z wierszami stopki (z sekcji <tfoot>) na
końcu każdej strony. Poza tym, dzięki temu możesz nadawać styl całej grupie
wierszy.
Choć wydaje się to nienaturalne, grupa wierszy
stopki
<tfoot> musi być powyżej właściwej treści tabeli
<tbody>. Jednak nie ma w tym nic złego - i tak zostanie przez
przeglądarkę pokazana na jej końcu. Sekcji <tbody>
może być kilka, a każda musi zawierać conajmniej jeden wiersz
<tr>.
Są dwa rodzaje komórek: <td>
(ang. "table data") oraz
<th> (ang. "table head"). Te drugie służą do opisywania nagłówka
tabeli. Dzięki temu, że są to pojedyncze komórki, nagłówkiem może być dowolny
zbiór komórek - np. te w pierwszym wierszu, w ostatniej kolumnie albo
jakiekolwiek inne.
Zobacz
Przykład 7.
Oprócz linków do innych dokumentów, możesz też
pisać linki do konkretnych miejsc w tym samym albo w innym dokumencie. Musisz
wtedy zastosować znak
#, a po nim nazwę, którą oznaczone jest to miejsce.
<a href="#top">Przejdź do góry</a>
Nazwa takiej kotwicy w ramach jednego
dokumentu nie może się powtarzać, nawet bez uwzględniania wielkości liter. Z
kolei podczas odnoszenia się do niej wielkość liter musi być zachowana. Może
zawierać tylko podstawowe znaki ASCII (a więc bez polskich liter). Kotwicę taką
można zdefiniować używając elementu <a>:
<h1><a name="top">Nagłówek pierwszy</a></h1>
Takie alternatywne użycie tego elementu
(wyłącznie z atrybutem
name) definiuje tylko kotwicę o podanej nazwie i nie tworzy linka
(ale niestety powoduje podkreślenie tekstu). Ten sam element <a>
może też być linkiem, jeśli dodatkowo wyposażysz go w atrybut href.
Czasami przydałaby się możliwość zdefiniowania
kotwicy w danym miejscu, bez obejmowania nią jakiejś treści - po prostu kotwicy
pustej. Teoretycznie jest to możliwe, ale podobno niektóre przeglądarki niezbyt
poprawnie na to reagują. Internet Explorer i Mozilla obsługują je dobrze, ale
mimo tego lepiej ich nie używać.
<a name="top"></a> <!-- Lepiej nie -->
Kotwicę definiuje też atrybut id,
który nadaje się często różnym elementom i który pełni też różne inne funkcje
(m.in. do stylów, do skryptów). On też musi być niepowtarzalny w skali
dokumentu. Co więcej, nazwy identyfikatorów i kotwic współdzielą jedną
przestrzeń nazw i nie mogą się powtarzać.
<h1 id="title">Tytuł główny</h1>
Zapewne nie jest ci obce wstawianie obrazków
do strony WWW. To bardzo popularny zabieg. Warto jednak zwrócić przy tej okazji
uwagę na kilka drobiazgów.
Przede wszystkim pamiętaj, że atrybut
alt jest _obowiązkowy_. Zawiera on alternatywny tekst, który ma opisywać
zawartość obrazka. Tekst ten zostanie wyświetlony w miejscu obrazka, jeśli ten
nie może być pokazany (np. w przeglądarce tekstowej, albo po prostu jeśli
obrazek nie załaduje się). Ponadto Internet Explorer pokazuje go jako dymek nad
obrazkiem. Mozilla tego nie robi. Oto kilka uwag na temat definiowania tego
alternatywnego tekstu obrazka:
-
Jeśli obrazek przedstawia napis, ustaw atrybut
alt na treść tego napisu.
-
Jeśli obrazek przedstawia coś konkretnego,
ustaw go na nazwę albo krótki opis zawartości.
-
Jeśli to jest tylko niewielki element
formatujący, pozostaw ten atrybut pusty (alt="").
Warto zawsze wpisywać atrybuty width
i height, które określają odpowiednio szerokość i wysokość obrazka.
Podanie niezgodnych z jego prawdziwymi wymiarami powoduje jego przeskalowanie,
ale warto je podawać zawsze - nawet, jeśli mają to być jego oryginalne wymiary.
Przeglądarka może wtedy narysować układ strony uwzględniając wielkość tego
obrazka jeszcze zanim zacznie go pobierać.
Ciekawostką jest, że wymiary można też podać w
procentach. Obrazek będzie wtedy skalowany proporcjonalnie do wielkości okna
przeglądarki. Co więcej, Internet Exporer i Mozilla przeskalowują obrazek
proporcjonalnie (tzn. tak, że zawsze zachowuje proporcję między szerokością a
wysokością), jeśli jako szerokość poda się width="100%", a
wysokości nie poda się wcale.
Istotna jest też ramka (ang. "border") wokół
obrazka. Przeglądarki mają nieprzyjemny zwyczaj rysowania jej wokół obrazków,
szczególnie jeśli są one linkami. Aby pozbyć się tej ramki, zwykle ustawia się
atrybut
border. Ten jednak jest wycofany i dlatego najlepiej zdefiniować
zerową ramkę wokół wszystkich obrazków za pomocą arkusza stylów.
<img src="screen01.gif" width="160" height="100"
alt="Pierwszy screen z mojego programu">
Mapa to możliwość zdefiniowania kilku linków w
różnych miejscach jednego obrazka. Może działać po stronie serwera. Wystarczy w
tym celu ustawić dla obrazka, który jest linkiem atrybut ismap.
<a href="mapa.php"><img src="obrazek.jpg" alt="Logo" ismap></a>
Po kliknięciu takiego linka serwer otrzyma
dodatkowe informacje o pozycji kliknęcia (X,Y), tzn. wywołany zostanie adres w
postaci:
http://www.jan.kowalski.com.pl/mapa.php?10,27
Po stronie serwera leży wtedy obowiązek
odpowiedniego zinterpretowania tej pozycji i pokazania lub przekierowania na
stosowną stronę. Ale ten sposób jest zły, ponieważ użytkownicy nie mogący
oglądać obrazków (przeglądarki tekstowe, głosowe, roboty katalogujące strony dla
wyszukiwarek) całkowicie pozbawieni zostają możliwości dostania się pod adresy
dostępne przez taką mapę. Poza tym ten sposób jest skomplikowany, bo wymaga
napisania skryptów na serwer.
Dużo prostszy, bardziej zalecany i ogólnie
lepszy sposób to mapy po stronie klienta. Obrazek używający takiej mapy
definiuje się tak:
<img src="obrazek.jpg" alt="Logo" usemap="#moja_mapa">
Ponadto trzeba też zdefiniować samą mapę:
<map name="moja_mapa">
<area href="adres1.html" shape="rect" coords="0,0,160,100" alt="Powrót">
<!-- ... -->
</map>
Mapa nosi jakąś nazwę i składa się ze zbioru
obszarów (ang. "area"). Każdy z nich musi posiadać:
-
Adres, pod który odsyła (atrybut href)
lub pusty atrybut
nohref, który oznacza obszar nie będący linkiem (za jego pomocą
można "wyciąć" część obszaru linka, ale w MSIE jakoś nie chce to działać).
-
Tekst alternatywny (atrybut alt).
-
Rodzaj kształtu
-
Parametry kształtu
Możliwe kształty i ich parametry to:
-
shape="default" - cały obrazek.
coords="" - brak parametrów.
-
shape="rect" - prostokąt.
coords="0,0,160,100" - kolejno pozycja lewej, górnej, prawej i dolnej
krawędzi.
-
shape="circle" - okrąg.
coords="50,50,20" - kolejno pozycja (X,Y) środka i promień.
-
shape="poly" - wielokąt.
coords="10,10,20,10,20,20" - kolejne punkty (X,Y) wielokąta. Jeśli
ostatni punkt nie jest taki sam jak pierwszy, wielokąt i tak zostanie domknięty.
Zobacz
Przykład 8.
Formularze są przydatne i często stosowane do
komunikacji zwrotnej (ang. "feedback") z internautą odwiedzającym stronę WWW.
Chciałbym pokazać ci kilka drobiazgów związanych z tym tematem.
Pola formularza tworzy się najczęściej zwykle
za pomocą elementu
<input>. Jego atrybut type określa rodzaj pola. Jeśli
nie podasz tego atrybutu, domyślnie przyjęta zostanie wartość
"text", co oznacza kontrolkę do edycji jednowierszowego tekstu.
Specyfikacja podaje, że spośród grupy pól typu
"radio"
zawsze jedno powinno być zaznaczone. Jeśli żadne nie jest, przeglądarka powinna
zaznaczyć pierwsze. Jednak ani Mozilla, ani Internet Explorer tego nie robią.
Dlatego żeby być zgodnym jednocześnie ze specyfikacją, różnymi przeglądarkami i
własnym sumieniem, warto zawsze zaznaczać jedno z nich za pomocą atrybutu
checked.
Ciekawym elementem jest <button>.
Pozwala on na stworzenie przycisku, który może mieć dowolną treść (kod HTML) w
swoim wnętrzu - np. wielolinijkowy tekst, czy nawet obrazki. Jednak w Internet
Explorerze jego obsługa jest bardzo nieładna i dlatego lepiej go nie używać.
<button type="reset" name="reset">
<!-- Tutaj tekst, obrazki i dowolny kod typu "inline" -->
</button>
Bardzo irytujące jest w formularzach na
stronach WWW, że podczas zaznaczania pół typu "checkbox" czy
"radio" trzeba wcelować w samo pole. W zwyczajnych programach wystarczy
kliknąć na tekst opisujący dane pole. Okazuje się, że na stronie też można, a
nawet powinno się robić coś takiego. Służy do tego element <label>:
<input type="checkbox" name="programuje" value="tak" id="czy_programuje">
<label for="czy_programuje">Czy programujesz?</input>
Takie objęcie pewnego kodu HTML w element
<label> nie powoduje na nim żadnych efektów wizualnych, natomiast kojarzy
go z danym polem formularza poprzez identyfikator tego pola i powoduje
przekazanie mu ogniska (ang. "focus") oraz zaznaczenie go, jeśli użytkownik
kliknie na ten tekst.
Kolejną ciekawostką jest element
<fieldset>, który służy do wizualnego grupowania pól formularza w
logiczne bloki o podanym tytule. Element ten tworzy bardzo ładnie wyglądającą
(szczególnie w Internet Explorer w Windows XP) okalającą ramkę, na której u góry
po lewej stronie napisany jest tytuł.
<fieldset>
<legend>Dane personalne</legend>
<!-- Tutaj są pola i inny kod formularza... -->
</fieldset>
Warto zawsze zdefiniować tytuł, jaki ma nosić
przycisk typu
"submit" do wysyłania danych formularza, bowiem niektóre
przeglądarki mają nieprzyjemny zwyczaj domyślnie tytułować go rozwlekłym i
niezbyt atrakcyjnie brzmiącym tekstem w rodzaju "Prześlij kwerendę".
<input type="submit" value="OK">
Na koniec warto napisać kilka słów o liście
rozwijalnej
<select>. Jej pozycje można grupować za pomocą elementu
<optgroup>.
<select name="wyszukiwarka">
<optgroup label="Google">
<option value="google_swiat">Na świecie
<option value="google_polska">W Polsce
<option value="google_obrazki">Obrazki
</optgroup>
<optgroup label="Inne">
<option value=yahoo">Yahoo
<option value="altavista">Altavista
<option value="onet">Onet.pl
</optgroup>
</select>
Do poszczególnych pozycji listy rozwijalnej -
<option> - można też próbować stosować style. Mozilla akceptuje m.in.
background-color (kolor tła), color (kolor tekstu) i
margin-left (odstęp po lewej). W Internet Explorer działają te dwa
pierwsze.
Zobacz
Przykład 9.
HTML został stworzony do opisywania prostych
stron składających się z kolejnych akapitów tekstu, obrazków itp. Wraz z
popularyzacją Internetu wśród zwykłych użytkowników zaistniała potrzeba
dostarczania w sposób funkcjonalny i atrakcyjny dużych ilości informacji.
Niestety, HTML niezbyt dobrze radzi sobie z opisywaniem wizualnego układu
strony.
Najczęściej stosowane do definiowania
wizualnego układu strony są tabele
<table>. Jednak posiadają one liczne wady i bywa z nimi wiele
kłopotu. Nie do tego celu zostały stworzone i nie nadają się do niego najlepiej.
Przykładowo, Internet Explorer nie pokazuje tabeli aż do całkowitego wczytania
jej treści, a więc strony zrobione na jednej dużej tabeli pokazują się dopiero
całe, już załadowane, a wcześniej nie widać nic.
Tabele nie są też zalecane do tworzenia układu
strony przez W3C. Organizacja ta zaleca stosowanie innych metod, szczególnie
sekcji <div>
z przypisanymi odpowiednimi stylami - właściwością position:absolute
lub float.
Tworząc stronę w ten sposób możesz pisać
poszczególne sekcje w dowolnej kolejności w pliku, ponieważ ich pozycja na
ekranie i tak jest ustalona przez arkusz stylów. Zaleca się wtedy, aby wcześniej
znalazła się właściwa treść strony, a dopiero potem menu, elementy nawigacyjne i
inne. Dzięki temu:
-
Użytkownicy przeglądarek tekstowych zobaczą u
góry treść strony, a nie będą musieli na każdej z nich przewijać najpierw
długiego menu z listą działów.
-
Użytkownicy przeglądarek dla niewidomych
usłyszą najpierw treść strony, a nie będą musieli na każdej wysłuchiwać menu.
-
Wyszukiwarki katalogujące twoją stronę zwrócą
większą uwagę na właściwe informacje, jeśli biorą pod uwagę miejsce ich
występowania w dokumencie.
-
Użytkownik zwykłej przeglądarki ściągając
twoją stronę przez powolne łącze lub z powolnego serwera zobaczy najpierw treść
strony i będzie mógł już zacząć ją czytać, a dopiero potem mniej istotne
elementy jej układu.
Niestety, ten sposób też nie jest pozbawiony
wad. Nawet, jeśli uda się otrzymać pożądany układ strony za ich pomocą, to
rozwiązanie wydaje się być nieco "naciągane", posiada liczne ograniczenia i nie
daje aż takiej swobody, jak tabele. Dlatego póki co, ja pozostaję przy tabelach.
Zobacz
Przykład 10.
HTML ma służyć do opisywania treści.
Oczywiście zawiera on liczne informacje dotyczące wyglądu strony, ale powinny
one mieć postać odniesienia do arkusza stylów CSS. Odniesienie takie robi się za
pomocą atrybutów class
oraz id.
class to atrybut stworzony
specjalnie do kojarzenia elementów z określoną klasą z arkusza stylów. Wyobraź
sobie, że chcesz, aby wszystkie nagłówki <h1> miały kolor czerwony,
ale niektóre z nich zielony. W tym celu możesz zdefiniować styl w taki sposób:
h1 { color: red }
h1.zielony { color: green }
Teraz każdy taki nagłówek będzie czerwony:
A każdy przypisany do klasy zielony
będzie zielony:
<h1 class="zielony">Rozdział specjalny !</h1>
Selektor h1.zielony wybiera tylko
nagłówki
<h1> z przypisaną klasą zielony. Można też napisać
selektor taki: .zielony albo taki:
*.zielony - obydwa oznaczają wszystkie, dowolne elementy z
przypisaną tą klasą.
Możnaby się zastanawiać, dlaczego do tego
drugiego nagłówka wybrany zostaje właśnie kolor tekstu zielony, skoro pasują do
niego obydwa selektory pokazanego stylu? Specyfikacja definiuje specjalny
algorytm doboru selektorów, ale mówiąc ogólnie wyższy priorytet ma ten bardziej
szczegółowy (czyli ten drugi).
Element może mieć przypisane na raz kilka
klas. Dzięki temu możesz definiować osobne klasy do pogrubiania, zmiany koloru
itp. Nazwy klas oddziela się spacją. Odpowiedni kod HTML wygląda w ten sposób:
<p class="pogrubiony powiekszony czerwony">
Uwaga!!! Bardzo ważny tekst...
</p>
Podobnie do class działa atrybut
id. Są jednak istotne różnice. Ten ostatni służy do nadawania
identyfikatorów elementom i jest wykorzystywany nie tylko do stylów.
Identyfikatory w ramach jednego dokumentu nie mogą się powtarzać, a element może
mieć tylko jeden identyfikator. Styl dla elementu o danym identyfikatorze
definiuje się w arkuszu za pomocą znaku "#".
p#uwaga {
color: red;
font-weight: bold;
font-size: 2em;
}
<p id="uwaga">
Uwaga!!! Bardzo ważny tekst...
</p>
HTML posiada dwa elementy wymyślone specjalnie
do stosowania stylów. Są to:
-
<div> - sekcja. To element typu
"block-level", który w swoim wnętrzu może zawierać akapity, kolejne sekcje
<div> itp.
-
<span> to element typu "inline".
Obejmuje tekst i inne elementy typu "inline" - może znajdować się wewnątrz
tekstu.
Zobacz
Przykład A.
Stylów CSS można używać na 3 sposoby. Pierwszy
i najbardziej zalecany to łączenie dokumentu HTML z zewnętrznym plikiem CSS,
który zawiera styl dla całego twojego serwisu.
<head>
<title>Tytuł mojej strony</title>
<meta ...
...
<link rel="stylesheet" type="text/css" href="my_style.css">
</head>
Styl można też wpisać bezpośrednio do pliku
HTML.
<head>
<title>Tytuł mojej strony</title>
<meta ...
...
<style type="text/css">
body { ... }
h1 { ... }
/* itd... */
</style>
</head>
Wreszcie, czasami może zajść nagła potrzeba
użycia w jednym miejscu jakiegoś nietypowego formatowania. Wtedy z pomocą
przychodzi obecny w bardzo wielu elementach atrybut style i ratuje
nas od używania wycofany elementów formatujących takich, jak <font>.
<!-- Wyjątkowo, ten jeden akapit ma być zielony -->
<p style="color:green">
...
</p>
Selektor to wyrażenie, które mówi, jakie
elementy dokumentu HTML mają mieć nadany określony styl. Oprócz najczęściej
używanych, prostych selektorów, jak sama nazwa elementu (np. h1),
dostępne są też dużo bardziej zaawansowane możliwości. Oto kilka przykładów:
-
.klasa - pasuje do wszystkich
elementów o klasie
klasa.
-
*.klasa - jak wyżej.
-
#identyfikator - pasuje do
elementu, który ma
id="identyfikator".
-
h1.klasa - pasuje tylko do
elementów <h1>
o klasie klasa.
-
div p - pasuje do akapitów
<p>, które leżą gdzieś (niekoniecznie bezpośrednio) wewnątrz elementu
<div>.
-
div > p - pasuje tylko do
akapitów <p>, które leżą bezpośrednio wewnątrz elementu <div>.
-
table + p - pasuje do akapitów
<p>, które leżą bezpośrednio po tabeli <table>.
-
p[id] - pasuje do akapitów
<p>, które posiadają atrybut id (niezależnie od jego
wartości).
-
a[href="index.html"] - pasuje do
akapitów
<p>, których podany atrybut ma dokładnie podaną wartość (<a
href="index.html" ...>.
Dostępne są też użyteczne pseudoklasy:
-
:first-child - elementy, które są
pierwszym elementem zagnieżdżonym w swoim elemencie nadrzędnym.
-
:lang(en) - elementy które mają
ustawiony (lub odziedziczony z elementów nadrzędnych) język określony jako
angielski (lang="en").
-
:link - link jeszcze nie
odwiedzony.
-
:visited - link już odwiedzony.
-
:hover - link, nad którym jest
kursor myszy.
-
:active - link "wciśnięty".
-
:focus - link, który ma ognisko
(ang. "focus").
Oraz pseudoelementy:
-
:first-line - pierwsza linia
tekstu.
-
:first-letter - pierwsza litera
tekstu.
-
:before, :after -
pozwalają na wstawianie dodatkowego tekstu na początku i na końcu elementów, ale
niestety nie działają w Internet Explorer.
Mozilla definiuje własne, ciekawe
rozszerzenia:
Pseudoelementy :not i :empty nie są wymysłem programistów Mozilli.
Są to elementy wprowadzonego standardu
CSS 3.
Nawiasem mówiąc Mozilla obsługuje już sporą część tego standardu.
Selektory można łączyć w bardziej
skomplikowane. Przykładowo, poniższy selektor ustawia czerwony kolor tekstu
wyłącznie dla elementów <span>, które należą do klasy
red i które leżą bezpośrednio wewnątrz akapitu
<p> w języku angielskim (lang="en"), ale tylko jeśli
akapit taki leży gdzieś wewnątrz sekcji <div>
o identyfikatorze content.
div#content p:lang(en) > span.red {
color: red;
}
Niestety te różne zaawansowane możliwości
selektorów CSS nie we wszystkich przeglądarkach działają poprawnie. Ostatecznie
jednak i tak rzadko bywają potrzebne.
Zobacz
Przykład B.
Arkusz stylów CSS może zawierać komentarze,
czyli twój własny tekst, który jest ignorowany podczas przetwarzania. Naprawdę
warto ich używać, choćby do opisywania klas - po co które wprowadziłeś i kiedy
należy je stosować. Komentarze piszę się tak:
/* Ta klasa definiuje tekst, który jest bardzo ważny i
ma przykuć uwagę czytelnika. Stosować do ostrzeżeń itp.
*/
.uwaga {
color: red;
font-weight: bold;
}
Bardzo wiele właściwości w CSS (ang.
"properties") wymaga podania długości, wysokości, szerokości, grubości czy innej
wielkości tego rodzaju. Trzeba *zawsze* wyrażać je w określonych jednostkach.
Istnieje wiele jednostek, podzielonych na względne i bezwzględne. Warto je znać.
Jednostkę można pominąć tylko, jeśli wartością liczbową jest 0. Jednostka musi
następować bezpośrednio po liczbie, bez jakiejkolwiek spacji.
.klasa1 { padding: 0 } /* dobrze */
.klasa2 { padding: 4 } /* ŹLE !!! */
.klasa3 { padding: 4 px } /* ŹLE !!! */
.klasa4 { padding: 4px } /* dobrze */
Jednostki względne są najbardziej użyteczne,
szczególnie do określania długości na ekranie:
-
px - piksele.
-
em - wysokość bieżącej czcionki.
Jeśli użyta do określania wielkości czcionki, odnosi się do wielkości czcionki
elementu nadrzędnego, np. powiększenie czcionki o 20% można wyrazić jako:
Z kolei margines nad akapitem wysoki na dwie
linie można zrobić tak:
<p style="margin-top:2em">...
-
ex (tzw. "x-height") - wysokość
małej litery "x"
bieżącej czcionki.
Jednostki bezwzględne mają sens jedynie wtedy,
kiedy znane są parametry urządzenia wyjściowego, np. w przypadku drukarki.
Długości można też wyrażać w procentach za
pomocą znaku "%".
Kolory można zapisywać na wiele różnych
sposobów. Pierwszym z nich są nazwy. Poniżej prezentuję pełną listę nazw, jakie
definiuje standard. Wszystkie inne, których obszerny spis jest często
prezentowany w różnych kursach w Sieci, nie należą do standardu i są
niepoprawne.
-
fuchsia
-
red
-
orange
-
yellow
-
lime
-
aqua
-
blue
-
purple
-
maroon
-
olive
-
green
-
teal
-
navy
Kolory niestandardowe trzeba zapisywać w
sposób liczbowy. Najbardziej popularna pośród tych sposobów jest chyba forma:
#RRGGBB, gdzie
RR, GG i BB to wartości szesnastkowe
odpowiednich składowych koloru - czerwonej, zielonej i niebieskiej. Na przykład
#000000 oznacza kolor czarny, #FFFFFF
biały, a #FF0000 czerwony.
Istnieje jednak skrócona notacja w formie:
#RGB. Tutaj każdą składową definiuje tylko jedna cyfra szesnastkowa.
Przykładowo kolor jasnoczerwony #fee jest rozwijany do
#ffeeee, a nie do #f0e0e0.
Kolor można też określić za pomocą liczb
dziesiętnych w formie takiej jak w tym przykładzie: RGB(255,0,0),
albo procentowo:
RGB(100%, 0%, 0%).
HTML wspólnie z CSS zaprojektowane zostały
tak, by dokumenty w nich napisane mogły być odczytywane przez różnorodne
programy, jak przeglądarki tekstowe, dźwiękowe (dla niewidomych) i inne. Wiadomo
jednak, że strona nie może w nich wszystkich wyglądać jednakowo. Dlatego
wprowadzono możliwość definiowania stylów osobno dla różnych rodzajów mediów.
Nazwy najważniejszych dla nas mediów, które definiuje specyfikacja to:
-
all - wszystkie
-
screen - ekran
-
print - drukarka
-
tty - urządzenie (program)
tekstowe piszące czcionką nieproporcjonalną, jak konsola czy terminal
-
tv - ekran o niskiej
rozdzielczości i ograniczonych możliwościach przewijania
-
projection - prezentacja
multimedialna
-
handheld - małe, czarno-białe
urządzenie przenośne
Dzięki zdefiniowaniu stylu (lub tylko pewnych
jego elementów) wyłącznie dla poszczególnych mediów możesz np. ukryć menu,
zmienić czcionkę, kolory, tło itp. dla wersji strony przeznaczonej do
drukowania. To naprawdę działa! Wszystko załatwi za ciebie przeglądarka, nie
musisz już przygotowywać w swoim serwisie osobnych skryptów generujących "wersję
do druku".
Jednym ze sposobów wykorzystania mediów jest
dołączenie w pliku HTML arkusza stylów tylko dla określonego medium:
<link rel="stylesheet" type="text/css" media="print"
href="MyStyle_ForPrint.css">
Inny sposób to zdefiniowanie sekcji dla
określonego medium już w samym arkuszu stylów:
/* Tu jest styl ogólnie dla wszystkich mediów */
...
@media print {
/* Tu jest styl do drukowania
Nadpisuje on ustawienia stylu ogólnego
*/
body {
font-family: "Times New Roman", serif;
/* itp... */
}
...
}
Zobacz
Przykład C.
Każdy element typu "block-level" definiuje
pewien prostokątny obszar. Przyjrzyjmy się jego krawędziom. Obszar taki składa
się z:
-
Treści
-
Wypełnienia padding
-
Krawędzi border
-
Marginesu margin
Wypełnienie to odstęp treści obszaru od jego
krawędzi. Jest rysowane z takim samym tłem, jak treść tego obszaru. Margines to
odstęp krawędzi obszaru od krawędzi obszarów sąsiednich. Jedyne, co można robić
z tymi dwoma wielkościami, to definiować ich szerokość - wszystkich czterech
jednocześnie:
Lub każdej z osobna:
maring-left: 16px;
maring-right: 0;
Podczas obliczania odstępu między sąsiednimi
blokami ich marginesy nie są sumowane. Następuje ich złączenie (ang. "collapse")
- wybierany jest większy spośród nich.
Dużo więcej można zrobić z krawędzią. Oprócz
jej szerokości można ustalić kolor oraz styl linii, jaką jest rysowana.
Zobacz
Przykład D.
Rodzaj wypunktowania lub numerowania listy
można zmienić w stylu za pomocą właściwości list-style-type. Jednak
nie definiuj jej globalnie dla wszystkich list w dokumencie. Zagnieżdżone na
różnych poziomach zagłębienia listy są automatycznie oznaczane w różny sposób, a
robiąc to pozbawiłbyś swoją stronę tego efektu.
Do numerowania kolejnych pozycji listy
odpowiednio małymi i dużymi literami służą dwie równoważne pary dopuszczalnych
wartości:
lower-alpha i upper-alpha oraz
lower-roman i upper-roman. Używaj zawsze tych
pierwszych, bo te drugie nie działają w Internet Explorerze.
Za pomocą właściwości
list-style-position można wybrać, czy oznaczenia kolejnych pozycji mają
się mieścić wewnątrz ich prostokąta (wartość "inside"), czy na
zewnątrz (wartość
"outside").
Zobacz
Przykład E.
Tekst to najważniejszy element stron WWW.
Język CSS daje ogromną kontrolę nad wyglądem tekstu i warto te możliwości jak
najlepiej wykorzystać. Za podstawową właściwość można uznać font-family,
która określa nazwę kroju czcionki. Można wymienić kilka nazw - kiedy
przeglądarka nie zna jednej, próbuje użyć następnej.
Pamiętaj, że strona powinna dobrze wyglądać w
różnych przeglądarkach, ale także w różnych systemach operacyjnych. Różne
systemy mają różne zestawy czcionek. Dlatego na końcu listy należy zawsze podać
jedną ze standardowych, ogólnych nazw:
-
serif - czcionka szeryfowa (jak
"Times New Roman") - dobra do drukowania
-
sans-serif - czcionka
bezszeryfowa (jak "Verdana" czy "Arial") - dobra do ekranu
-
monospace - czcionka
nieproporcjonalna (jak "Courier New" czy "Fixedsys" - każda litera ma taką samą
szerokość) - dobra do kodów źródłowych itp.
-
fantasy - czcionka ozdobna
-
cursive - kursywa
Przykładowy zbiór klas do różnych czcionek
może wyglądać tak:
body {
font-family: Verdana, Arial, sans-serif;
font-size: 9pt;
...
}
.kod {
font-family: "Courier New", Courier, monospace;
font-size: 9pt;
}
.naglowek_ozdobny {
font-family: palatino, georgia, "times new roman", serif;
}
.naglowek_komputerowy {
font-family: Courier;
font-size: 40px;
}
@media print {
body {
font-family: "Times New Roman", serif;
}
}
Do pochylania służy właściwość
font-style. Jej najważniejsze wartości to normal i
italic. Do pogrubiania z kolei służy właściwość font-weight
z wartościami
normal i bold. Ta ostatnia ma dużo innych możliwych
wartości i pozwala nawet określać "grubość" czcionki liczbowo, ale w praktyce
tylko te dwie wartości różnią się wyglądem.
Do podkreślania (i nie tylko) służy właściwość
text-decoration
o dopuszczalnych wartościach:
-
none - nic specjalnego
-
underline - podkreślenie (linia
pod tekstem)
-
overline - nadkreślenie (linia
nad tekstem)
-
line-through - przekreślenie
(Internet Explorer rysuje je trochę niżej, niż Mozilla i wygląda odrobinę
nieładnie :)
-
blink - miganie (tekst pojawia
się i znika, w Internet Explorer nie działa)
Do określania wielkości tekstu służy
właściwość font-size. Jej dopuszczalne wartości to:
-
xx-small, x-small,
small,
medium, large, x-large,
xx-large - w praktyce kolejne wielkości nie rosną liniowo.
Pierwsze dwie są praktycznie takie same, a dopiero począwszy od wartości
large rosną szybko. Poza tym do zwykłego tekstu
najodpowiedniejsza wydaje się wielkość small.
-
larger, smaller -
wielkość względna - powiększenie albo pomniejszenie czcionki względem czcionki
elementu nadrzędnego.
-
Wielkość wyrażona w dowolnych jednostkach, jak
procenty, pt,
px, em, ex itp.
Dosunięcie tekstu reguluje właściwość
text-align o wartościach ze zbioru:
Właściwość o prostej nazwie font
pozwala równie prosto ustawić całą czcionkę (wszystkie jej parametry) na raz,
według jednej z czcionek domyślnych przeglądarki:
-
caption - czcionka używana na
kontrolkach interfejsu użytkownika, jak przyciski, listy rozwijalne itp.
-
icon - czcionka używana do
podpisywania ikon
-
menu - czcionka używana w menu
-
message-box - czcionka używana w
oknach dialogowych
-
small-caption - czcionka używana
w etykietach małych kontrolek
-
status-bar - czcionka używana na
pasku stanu
Właściwość text-transform pozwala
zamienić wszystkie litery danego tekstu na duże (wartość uppercase),
na małe (wartość lowercase), pierwsze litery każdego wyrazu na duże
(wartość capitalize) lub pozostawić wielkość liter bez zmian (none).
Ciekawy efekt pozwala uzyskać właściwość
font-variant ustawiona na wartość small-caps (domyślnie ma
wartość normal). Cały tekst jest wtedy pisany kapitalikami (wygląda
wtedy jak pisany dużymi literami, ale litery oryginalnie duże są większe od
pozostałych w sensie wielkości).
Wreszcie - text-indent określa
szerokość wcięcia pierwszej linii tekstu letter-spacing wielkość
dodatkowego odstępu pomiędzy literami, a word-spacing odstępu
pomiędzy wyrazami. O zachowywaniu oryginalnego odstępów (jak znaki końca
wiersza) z kodu HTML mówi właściwość white-space, ale nie we
wszystkich przeglądarkach poprawnie działają wszystkie jej wartości.
Zobacz
Przykład F.
Microsoft wprowadził dla swojej przeglądarki
Internet Explorer szereg rozszerzeń. Używając ich możesz otrzymać na swojej
stronie ciekawe efekty, ale będą one działały tylko w tej przeglądarce (czyli u
80% użytkowników). Twoja strona nie jest wtedy w pełni zgodna ze standardem, ale
z drugiej strony standard przewiduje możliwość wprowadzania nietypowych
rozszerzeń.
Nie zapominaj jednak o pozostałych
użytkownikach. Jeśli postarasz się o poprawny kod, twoja strona może we
wszystkich przeglądarkach wyglądać bardzo dobrze, a w tej najpopularniejszej
jeszcze lepiej! :)
Jednym z tych rozszerzeń jest możliwość
kolorowania pasków przewijania strony. Poniżej znajduje się przykładowy styl.
Więcej informacji znajdziesz na stronie
Colouring the scrollbar in IE 5.5+.
body {
scrollbar-arrow-color: black;
scrollbar-face-color: lime;
scrollbar-highlight-color: white;
scrollbar-3dlight-color: silver;
scrollbar-shadow-color: gray;
scrollbar-darkshadow-color: black;
scrollbar-track-color: green;
}
Można stosować różne efekty tekstowe. To jakby
rozszerzenie tego, co CSS pozwala standardowo zrobić z czcionką. Za ich pomogą
można ciekawie ozdabiać nagłówki. Wystarczy dopisać do stylu filtr w postaci:
Filter:rodzaj-filtru(parametr,parametr,...), np.:
filter: Wave(Add=1, Freq=4, LightStrength=50,Phase=50,Strength=10);
Oto lista filtrów, których nazwy znam. Do
każdego trzeba jeszcze znać parametry.
-
Blur - wrażenie szybkiego
przesuwania elementu
-
Glow - rozproszony cień wokół
elementu
-
DropShadow - cień za elementem
-
FlipH - odbicie poziome
-
FlipV - odbicie pionowe
-
Shadow - dodatkowy cień za
elementem
-
Wave - zniekształcenie (fala)
-
Alpha - przezroczystość
-
Chroma - jeden kolor
przezroczysty
-
Grayscale - skala szarosci
-
Invert - negatyw
-
Light - podświetla fragmenty
-
Mask - tworzy z obiektu maskę
przezroczystości
-
Xray - zewnetrzne granice
Żeby filtry tego rodzaju działały, blok
zawierający tekst musi mieć też zdefiniowaną w stylu szerokość width
lub wysokość
height.
Jeszcze inne efekty (od prostego efektu
przejścia - gradientu - na tle, aż po dużo bardziej zakręcone :) można otrzymać
stosując do całych sekcji
<div> filtry w postaci takiej, jak np.:
FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,
startColorStr=#77AAFF,endColorStr=#FFAA77);
Te wszystkie rozszerzenia działają tylko
wtedy, gdy plik HTML nie posiada na początku określenia żadnej z wersji HTML w
rodzaju:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
Godne polecenia, chociaż może niezbyt pożądane
przez internautów ze względu na wprowadzane opóźnienie w ich nawigacji między
stronami, są efekty przejścia znane dotychczas z programów do prezentacji (jak
Microsoft PowerPoint). Można je stosować do całych stron definiując efekt na
wejście i efekt na wyjście za pomocą nagłówka HTTP lub jego odpowiednika w
postaci znacznika
<meta>, np.:
<meta http-equiv="Page-Enter"
content="RevealTrans(Duration=2.0,Transition=10)">
Można też stosować je do pojedynczych bloków
na stronie, ale ich wyzwalanie wymaga kodu JavaScript lub innego języka
skryptowego. Po szczegóły dotyczące filtrów i przejść odsyłam na stronę
Cascading Style Sheets.
Zobacz
Przykład G.
W artykule omówiłem wybrane szczegóły języków
HTML i CSS pod kątem zarówno zgodności ze specyfikacją, jak i realizacji
praktycznej w najpopularniejszych przeglądarkach. Mam nadzieję, że okażą się one
przydane tobie podczas tworzenia stron WWW nawet, jeśli nie jest to twoim
głównym zajęciem. Uważam bowiem, że warto dbać o poprawny i dobrze działający
kod - nawet, jeśli nie jest to kod języka programowania.
Na koniec chciałbym pozdrowić moich kolegów o
pseudonimach:
-
Xion - za recenzję, cenne uwagi i
ogólne wspieranie mnie w mojej działalności :)
-
g[R]eK - za przekonanie mnie, jak
ważna jest zgodność ze standardem i ogólnie za niestrudzone głoszenie swoich
kontrowersyjnych poglądów :)
Oto linki do wszystkich przykładów dołączonych
do artykułu zebrane w jednym miejscu.
Oto spis omówionych w artykule (lub choćby
wspomnianych) elementów języka HTML. Jak wiele z nich znałeś przed jego lekturą?
To oczywiście nie jest pełna lista elementów - język zawiera ich dużo więcej.
<a>,
<abbr>,
<acronym>,
<address>,
<area>,
<blockquote>,
<body>,
<button>,
<caption>,
<cite>,
<code>,
<col>,
<colgroup>,
<dd>,
<dfn>,
<div>,
<dl>,
<dt>,
<em>,
<fieldset>,
<h1>,
<head>,
<html>,
<img>,
<input>,
<kbd>,
<label>,
<legend>,
<li>,
<link>,
<map>,
<meta>,
<ol>,
<optgroup>,
<option>,
<p>,
<pre>,
<q>,
<samp>,
<select>,
<span>,
<strong>,
<style>,
<table>,
<tbody>,
<td>,
<tfoot>,
<th>,
<thead>,
<title>,
<tr>,
<ul>,
<var>
Oto spis omówionych w artykule atrybutów
języka HTML.
alt,
background,
class,
colspan,
content,
coords,
for,
height,
href,
hreflang,
http-equiv,
id,
ismap,
label,
lang,
media,
name,
rel,
shape,
span,
src,
summary,
title,
type,
usemap,
width,
value
Oto spis omówionych w artykule właściwości
(ang. "properties") języka CSS.
border-bottom,
border-left,
border-style,
border-width,
color,
filter,
float,
font,
font-family,
font-size,
font-style,
font-variant,
font-weight,
letter-spacing,
list-style-position,
list-style-type,
margin-left,
margin-right,
margin-top,
padding,
padding-left,
position,
scrollbar-3dlight-color,
scrollbar-arrow-color,
scrollbar-darkshadow-color,
scrollbar-face-color,
scrollbar-highlight-color,
scrollbar-shadow-color,
scrollbar-track-color,
text-align,
text-decoration,
text-indent,
text-transform,
white-space,
word-spacing
Adam Sawicki "Regedit"
www.programex.prv.pl
www.regedit.risp.pl
D.F.
|