Table of contents
Spoiler: należy używać wersji Strict
Większość webmasterów, o ile w ogóle stosuje DOCTYPE
, bezkrytycznie kopiuje (albo akceptuje wklejoną przez narzędzia pokroju FrontPage) jego wersję Transitional (często przekręcaną na “Transistional”, “Translational”). To kiepski pomysł.
Co to ten Transitional?
HTML 4 i XHTML 1.0 mają trzy odmiany:
- Frameset (zestaw ramek) — wersja opisująca dokument bez
<body>
, ale za to z ramkami w<frameset>
. Dziś nie powinna w ogóle nikogo interesować, szczególnie że nie jest potrzebna do<iframe>
. - Strict (ścisły) — główna, rozwojowa wersja HTML/XHTML. Nie zawiera większości prezentacyjnych elementów i atrybutów (
<font>
,<table bgcolor>
, itp.), które potrafi zastąpić CSS. - Transitional (przejściowy) — ponieważ w 1996 roku, kiedy opublikowano HTML 4, obsługa CSS w przeglądarkach była nieistniejąca/żałosna, a obsługa HTML była chaosem powstałym z boju IE/Netscape, W3C stworzyło wersję kompatybilną wstecz, zachowującą wszystkie “grzechy” HTML 3 i rozluźniającą wymogi zalecanej wersji HTML.
W3C nie rozpisuje się o wersji Transitional. Jest tylko notka w samym pliku DTD:
To jest DTD HTML 4.01 Transitional, który zawiera prezentacyjne atrybuty i elementy, które W3C zamierza wycofać, gdy wsparcie dla CSS dojrzeje. Autorzy powinni używać Strict DTD, gdy to tylko możliwe, ale mogą użyć Transitional DTD, jeżeli potrzebne jest wsparcie dla prezentacyjnych atrybutów i elementów.
HTML | XHTML | |
---|---|---|
Transitional | <FONT> | <font/> |
Strict | <STYLE> | <style/> |
Zatem koncepcja, że XHTML jest od divów, a HTML od tabelek, jest bujdą na resorach. To właśnie Transitional (obydwu odmian (X)HTML) jest od śmiecenia w kodzie przez <font>
i spółkę, a wersja Strict (obu odmian (X)HTML) jest zalecaną, nowocześniejszą wersją do użytku wraz z CSS. Ponieważ XHTML 1.0 miał być jak najdokładniejszą kopią HTML, powielił również jego niezalecane wersje.
Strict vs Transitional
W Strict nie ma elementów i atrybutów prezentacyjnych. Nie dawały one wiele możliwości, więc nawet niekompletny CSS1 w IE6 z powodzeniem je zastępuje. Nie ma za czym tęsknić.
W Strict usunięto atrybut target
. Autorzy HTML doszli do słusznego wniosku, że ramki to zło tak samo jak nachalne otwieranie nowych okien.
Strict kładzie większy nacisk na rozdzielenie elementów blokowych i liniowych. W szczególności <blockquote>
i <form>
nie mogą zawierać samego tekstu “ot tak”, tylko muszą mieć go otoczonego elementami blokowymi jak <p>
lub <div>
(prawdopodobnie motywacją było zwrócenie autorom uwagi, że <p>
to nie są dwa <br>
y, tylko element otaczający tekst). CSS pozwala kontrolować marginesy tworzone przez <p>
, więc nic strasznego się nie dzieje (poza zbędnym upychaniem gdzieś <input type=hidden>
).
Jednak Transitional ma kilka rzeczy, których lepiej było nie wyrzucać z HTML Strict (i które powróciły w HTML5):
<ol start>
. Numery elementów mogą mieć znaczenie dla treści, a CSS2 nie potrafi pogodzićlist-style
i własnych liczników.<menu>
. Element miał być prezentacyjny, ale nie doczekał się porządnej implementacji w przeglądarkach. Skończyło się na tym, że był synonimem dla<ul>
, więc go usunięto, żeby nie dublować funkcjonalności. Jednak z punktu widzenia semantyki przydatne byłoby odróżnienie bylejakiej listy od menu nawigacyjnego.
Jeśli potrzebujesz <ol start>
albo preferujesz <menu>
, to użycie Transitional zostanie ci wybaczone ;)
Po co jest DOCTYPE?
DOCTYPE jest pozostałością po języku SGML, z którego HTML (i w konsekwencji XML) został zgapiony. Wskazuje ścieżkę do pliku DTD, który z grubsza opisuje strukturę dokumentu (dozwolone i wymagane tagi, atrybuty oraz encje).
Teoretycznie DTD jest potrzebny przeglądarkom, aby wiedziały jak traktować tagi (np. że nie zamyka się <br>
i <img>
) oraz mogły rozpoznać nazwane encje w dokumencie (np. że
to to samo co  
), ale w praktyce wszystkie przeglądarki mają na stałe zakodowane reguły wczytywania HTML, które nawet nie są zupełnie zgodne z DTD (choć niektóre można zmusić do pełnej interpretacji DTD, jeśli ktoś chce mieć wolniej ładującą się stronę i dodatkowy kłopot ;)
Plik DTD jest często używany przez walidatory (w szczególności ten z W3C) do sprawdzenia poprawności dokumentu, ale w tej roli wypada kiepsko — DTD nie jest w stanie wyrazić pełnej specyfikacji HTML. Jest sporo konstrukcji, które się walidują, ale są niepoprawnym HTML/XHTML, np. <a><b><a></a></b></a>
jest nielegalne wg. specyfikacji, a dopuszczane przez DTD). Powstały dużo lepsze schematy opisu dokumentów (Schema, RelaxNG) i bazujące na nich lepsze walidatory.
Praktycznie jest tylko do włączenia trybu zgodności ze standardami. DOCTYPE Strict powoduje, że przeglądarki działają w trybie zgodności ze standardami. DOCTYPE Transitional też, ale tylko wtedy, gdy ma URL do DTD. Szczegóły. Dokumenty HTML bez DOCTYPE interpretowane są w trybie emulacji IE5 i dostają mizerną obsługę CSS.
Zalecany DOCTYPE
HTML 4: 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…).
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
XHTML 1: Strict lub brak
Poprawne użycie XHTML wymaga przede wszystkim dwóch rzeczy:
- Ustawienia
Content-Type
naapplication/xhtml+xml
- Użycia przestrzeni nazw
http://www.w3.org/1999/xhtml
dla wszystkich elementów XHTML
Natomiast deklaracja XML jest zbędna, a DOCTYPE ma tylko marginalne znaczenie — w przeciwieństwie do HTML nie określa, które tagi są opcjonalnie zamykane. Jego rolą pozostaje tylko określenie encji nazwanych, ale je można zastąpić encjami numerycznymi albo znakami UTF-8.
W trybie XHTML, nawet gdy brak DOCTYPE, przeglądarki zawsze używają trybu zgodności ze standardami.
To się nie tyczy IE z tego prostego powodu, że żadna z wersji IE (do 8 włącznie) nie obsługuje XHTML w ogóle.
Mimo wszystko, dla 100% zgodności ze specyfikacją XHTML, potrzeba wstawić odpowiedni DOCTYPE (i lepiej nie pomijać deklaracji przestrzeni nazw):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1—strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
XHTML 5: brak, HTML 5: prawie brak
Dla (X)HTML5 nie powstało i nie powstanie żadne oficjalne DTD. W trybie XML nie należy wstawiać żadnego DOCTYPE. W trybie HTML wystarczy wrzucić króciutki:
<!DOCTYPE html>
aby wymusić w przeglądarkach tryb zgodności ze standardami.