Szkielet dokumentu#
DOCTYPE#
W każdym dokumencie HTML, na samym początku, powinna się pojawić deklaracja typu dokumentu (Document Type Declaration), często nazywana po prostu Doctype lub prologiem.
Ostatnia specyfikacja HTML 4.01 przewiduje trzy wersje prologu. Niektórzy autorzy stron dodają jeszcze sieciowy adres wersji DTD (ma on służyć do ewentualnego pobrania definicji przez przeglądarkę), choć nie jest to bezwzględnie konieczne - nawet specyfikacja HTML nie podaje tego adresu (zajrzyj do źródła strony). Tym niemniej, ze względu na obsługę różnego trybu renderowania stron w zależności od postaci DTD, zaleca się pełne wersje prologów.
Mamy trzy podstawowe typy dokumentu:
Znacznik zamykający deklarację typu dokumentu jest zabroniony.
Strict - ścisła, surowa, wykluczająca wszelkie elementy prezentacyjne, które specyfikacja HTML 4.01 uznaje za schyłkowe (deprecated). Wersja jest więc okrojonym HTML 4.01 Transitional, przedkładającym strukturę nad prezentację.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
Transitional - wersja przejściowa, luźna, zawierająca wszelkie możliwe elementy i atrybuty HTML, łącznie z wycofanymi, jak i uznanymi za schyłkowe. Specyfikacja HTML sama posługuje się właśnie tym prologiem.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Frameset - szersza odmiana dla Transitional, uzupełniona o ramki. Opisuje dokument bez <body>
, ale za to z ramkami <frameset>
. Dzisiaj ta opcja nie powinna praktycznie nikogo interesować, jest uznawana za przestarzałą.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
W deklaracji nie należy zmieniać wielkości liter, ani dopisywać żadnych znaków. Lista rekomendowanych deklaracji typów dokumentów w poprawnej formie znajduje się na Recommended DTDs.
Oczywiście autorzy stron piszący w nowszym języku XHTML stosują nieco inne prologi, dostosowane właśnie do potrzeb tego języka. Deklaracja nadchodzącego HTML5 będzie bardzo minimalistyczna (<!DOCTYPE HTML>
).
Wyjaśnienie poszczególnych członów DTD#
- HTML
- Informuje przeglądarkę , że korzeniem (czyli pierwszym nadrzędnym elementem, ang. root) dokumentu jest element
html.
- PUBLIC
- Sugeruje rodzaj zastosowanej DTD. "PUBLIC" oznacza wersję publiczną, dostępną powszechnie w Internecie. "SYSTEM" natomiast, oznacza DTD prywatną, znajdującą się na komputerze użytkownika.
- "-//W3C//DTD HTML 4.01//EN"
- Formalny Identyfikator Publiczny (Formal Public Identifier). Jest on niezbędny tylko wówczas, gdy DTD jest publicznie dostępna. FPI identyfikuje teksty dostępne publicznie, w tym Definicje Typu Dokumentu (więcej). Znaczenie poszczególnych części:
- -
- Czy standard jest zaakceptowany przez ISO, czy nie. Minus oznacza nie.
- W3C
- Nazwa autora
- DTD HTML 4.01
- Nazwa języka
- EN
- Język użyty w opisie dokumentu. To nie jest język strony.
- "http://www.w3.org/TR/html4/strict.dtd"
- Ścieżka do pliku DTD
Na końcu Doctype może być jeszcze opcjonalnie blok dodatkowych elementów ujęty w nawiasy kwadratowe.
Deklaracja a definicja#
W celu uściślenia wypadałoby wyjaśnić różnicę między deklaracją typu dokumentu (Document Type Declaration) a definicją typu dokumentu (Document Type Definition).
Deklaracja to po prostu jedno z poleceń wstawiane jako pierwsze w kodzie (X)HTML. Definicja (DTD) to plik zawierający opis składni (X)HTML, jaką można zastosować w dokumentach bazujących na tym DTD. Mówiąc prościej, deklaracja typu dokumentu w kodzie strony informuje przeglądarkę, jakiej definicji typu dokumentu dla tej strony użyć.
W praktyce wszystkie pojęcia (Doctype, DTD, prolog, deklaracja/definicja typu dokumentu) stosuje się naprzemiennie. Nie powinno to jednak prowadzić do nieporozumień, gdyż z kontekstu wiadomo, o co chodzi.
Czym jest DOCTYPE i po co właściwie go stosujemy?#
Większość osób jest przekonana, że deklaracja typu dokumentu na samym początku strony w jakikolwiek sposób wymusza na przeglądarce interpretację kodu ze względu na język w niej podany (HTML lub XHTML). Prawda jest taka, że nie wymusza, niestety lwia część osób tworzących strony WWW dalej pozostaje w błędzie. Najwyższa pora "oświecić" co niektórych zatwardziałych webmasterów.
DOCTYPE jest pozostałością po języku SGML (Standard Generalized Markup Language), z którego HTML (i w konsekwencji XML) został zgapiony. Deklaracja wskazuje ścieżkę do pliku DTD, który z grubsza opisuje strukturę dokumentu (dozwolone i wymagane tagi, atrybuty oraz encje).
Teoretycznie DTD powinien dostarczyć przeglądarce istotnych informacji o składni języka użytego do utworzenia dokumentu. Innymi słowy DTD powinien określić zasady stosowania znaczników i encji, np. żeby przeglądarka wiedziała jak się zachować w chwili kiedy natrafi na znacznik <br>
, <img>
, jakie są reguły zamykania znaczników, zasady ich zagnieżdżania oraz żeby mogła rozpoznać nazwane encje w dokumencie (
to to samo co  
).
W praktyce wygląda to zgoła inaczej. Wszystkie przeglądarki mają na stałe zakodowane reguły wczytywania HTML, które w niektórych przypadkach nie są zupełnie zgodne z DTD (żadna deklaracja typu dokumentu na początku kodu nie jest w stanie tego zmienić). Niektóre przeglądarki możemy zmusić do pełnej interpretacji reguł zawartych w DTD, lecz może to owocować wysypem dodatkowych problemów np. wolniej ładującą się stroną.
W celu potwierdzenia powyższego zachowania zamieszczam stronę testową #, która zbudowana została na ramkach. Strona startowa oraz wszystkie podstrony mają zadeklarowany DTD Strict. Jak widać, przeglądarki dalej wyświetlają stronę, mimo stosowania elementów niezgodnych z zadeklarowanym DTD. W celu zachowania kompatybilności wstecznej, przeglądarki starają się obsługiwać jak największą liczbę elementów i atrybutów - nie wprowadzają podziału na różne wersje (Strict, Transitional, Frameset).
Prawdę mówiąc DOCTYPE wykorzystujemy do dwóch celów. Pierwszym jest sprawdzenie poprawności syntaktycznej dokumentu za pomocą walidatorów. Plik DTD jest często używany przez tego typu oprogramowanie (w szczególności ten z W3C), chociaż w tej roli wypada kiepsko. DTD nie jest w stanie wyrazić pełnej specyfikacji HTML. Jest sporo konstrukcji, które się walidują (czyli są poprawne względem reguł zawartych w DTD), ale są niepoprawnym HTML/XHTML (według specyfikacji W3C). Powstały dużo lepsze schematy opisu dokumentów (XML Schema, RelaxNG) i bazujące na nich lepsze walidatory. Więcej przeczytasz w rozdziale "Poprawność dokumentu".
DOCTYPE służy także do włączenia trybu zgodności ze standardami. W zależności od deklaracji (brak deklaracji, pełna deklaracja, deklaracja bez adresu sieciowego) przeglądarki renderują strony zgodnie z najnowszymi standardami lub korzystają z przestarzałych rozwiązań (interpretacja w tzw. trybie emulacji MSIE5 z mizerną obsługą CSS). Jest to bardzo ważne, w czasach wojny między przeglądarkami, kiedy (X)HTML się kształtował o spójnych standardach mogliśmy tylko pomarzyć. W celu zachowania kompatybilności wstecz (poprawienie wszystkich stron WWW nie jest możliwe) przeglądarki posiadają stary tryb wczytywania stron, który można włączyć w ściśle określony sposób. Dokładniejszy opis od strony technicznej znajdziesz w artykule "Activating Browser Modes with Doctype".
Jeśli ktoś jest ciekawy, jak wygląda opis języka HTML w DTD, może pobrać (i otworzyć w dowolnym edytorze tekstowym) plik definicji bezpośrednio z adresu sieciowego:
- strict.dtd - wersja online
- loose.dtd - wersja online
- frameset.dtd - wersja online
Poniżej zamieszczam także odsyłacze do plików, w których opisane są encje:
Dokładne omówienie budowy pliku DTD zamieściłem w osobnym dziale "Dodatki - Specyfikacja - DTD".
Którą wersję wybrać?#
Najbezpieczniejszym rozwiązaniem, kiedy kluczowe znaczenie ma kompatybilność wstecz a nie mamy czasu na poprawianie kodu jest użycie wersji Transitional.
W pozostałych przypadkach w grę wchodzi tylko i wyłącznie wersja Strict. Ze względu na niewielkie zalety i trudność poprawnego użycia XHTML, polecam rozważyć HTML, zamiast najnowszej/najmodniejszej wersji XHTML. Pamiętaj, że składnia HTML też pozwala na pełne wykorzystanie CSS i pisanie eleganckiego kodu (nawet małymi literami). Dla osób zaczynających swoją przygodę z językami znacznikowymi zdecydowanie polecam język HTML w wersji Strict.