Szkielet dokumentu#
Postać ogólna#
Podstawowy szablon dokumentu HTML5 został bardzo uproszczony. Może wyglądać następująco:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Podstawa HTML5</title>
</head>
<body>
<!-- Dowolna treść -->
</body>
</html>
I to by było na tyle. Prosty DOCTYPE, prosta deklaracja kodowania, można zapamiętać bez problemu w porównaniu z wygibasami HTML4 i pozostałymi odmianami XHTML 1.x.
Jest to bezpieczny szablon o czytelnej strukturze, przeznaczony wprost do stron WWW. Istnieją jednak przypadki, kiedy będzie go można jeszcze bardziej uprościć, a dokumenty HTML5 wciąż pozostaną poprawne składniowo. Przeanalizujmy oddzielnie pewne szczegóły tego szablonu.
Uproszczona wersja#
Prawdę mówiąc najprostsza wersja poprawnego dokumentu HTML5 musi spełniać następujące wymagania w takiej kolejności:
- Opcjonalny pojedynczy znak BOM (U+FEFF)
- Dowolna liczba komentarzy lub znaków spacji
- DOCTYPE
- Dowolna liczba komentarzy lub znaków spacji
- Element główny (korzeń), w postaci tagu
html
- Dowolna liczba komentarzy lub znaków spacji
Znaki spacji przed korzeniem html
a także znaki spacji na początku elementu html
i przed elementem head
są usuwane podczas parsowania dokumentu (nie pojawią się jako węzły tekstowe w drzewie DOM). Znaki spacji za korzeniem html
będą przetwarzane tak, jakby były umieszczone na końcu elementu body
. Czyli można powiedzieć, że znaki spacji wokół głównego elementu nie są traktowane identycznie. Już o tym wspominałem nieco wcześniej, proszę dokładnie zwrócić uwagę na grafikę obrazującą drzewo DOM.
Termin "znaki spacji" został ściśle określony w specyfikacji HTML5.
Sugeruje się żeby wstawiać nową linię po deklaracji DOCTYPE, po każdym komentarzu umieszczonym przed głównym elementem, po znaczniku otwierającym <html>
(jeśli nie został pominięty), i po wszelkich komentarzach umieszczonych wewnątrz elementu html
, ale przed elementem head
.
Czyli możemy napisać tak:
<!-- Początek dokumentu HTML5 -->
<!DOCTYPE html>
<!-- Nasza właściwa struktura -->
<html>
</html>
<!-- Koniec naszego dokumentu HTML5 -->
Takie są wytyczne samej specyfikacji HTML5. W niektórych wypadkach można nawet pominąć element html
.
Walidacja uproszczonego zapisu ogólnodostępnymi narzędziami (np. tego z W3C, który dla HTML5 wprowadził eksperymentalny parser Validator.nu) prawdopodobnie zwróci nam wiele błędów. Trzeba pamiętać, że narzędzia takie tworzone są przez osoby trzecie i nie muszą w 100% zgadzać się z każdym punktem specyfikacji. Walidatory mogą niektóre złożenia traktować jako błędy, np. umieszczenie czegokolwiek przed DOCTYPE włącza tryb Quirks w przeglądarce IE - program w tym miejscu odradza taką składnię i zalicza ją do błędów.
DOCTYPE#
Deklaracja DOCTYPE jest obowiązkowa w przypadku składni HTML5. Jest ona wymagana tylko ze względów historycznych. Kiedy zostanie pominięta, przeglądarki stosują inny tryb renderowania strony, który jest niezgodny z obecnymi standardami. Mechanizm wyboru starszego trybu renderowania zostawiono w celu zapewnienia kompatybilności z bardzo starymi stronami.
Przypominam tylko, że DOCTYPE nie wymusza na przeglądarce sposobu parsowania dokumentu (traktowania go jak HTML5 lub XHTML5). Pisałem już o tym wielokrotnie (link1, link2 , link3, link4).
Wersja skrócona#
DOCTYPE musi składać się z elementów w następującej kolejności:
- Ciąg znaków ASCII (wielkość bez znaczenia) pasującego do łańcucha
"<!DOCTYPE"
- Jeden lub więcej znaków spacji
- Ciąg znaków ASCII (wielkość bez znaczenia) pasującego do łańcucha
"html"
- Opcjonalnie stosować DOCTYPE legacy string lub obsolete permitted DOCTYPE string
- Zero lub więcej znaków spacji
- Znak U+003E GREATER-THAN SIGN (
>
)
Innymi słowy wszystko co pasuje do ciągu <!DOCTYPE html>
(niezależnie od wielkości znaków) będzie prawidłowe dla HTML5. Przykładowo wyszukiwarka firmy Google stosuje taki zapis <!doctype html>
. Czyli mamy dużą dowolność co do wielkości znaków umieszczanych w deklaracji DOCTYPE.
Skrócona wersja została tak dobrana, że nawet najstarsze przeglądarki (pokroju IE6) nie mają żadnych problemów z prawidłową interpretacją - czyli wymuszeniem renderowania zgodnego ze standardami.
DOCTYPE legacy string#
Dla narzędzi generujących kod HTML, które nie mogą wyprowadzić skróconej wersji DOCTYPE udostępniono tzw. DOCTYPE legacy string. Jest to ciąg znaków, który należy ewentualnie wstawić w 4 punkcie algorytmu deklaracji DOCTYPE (wersja skrócona). Składnia takiego łańcucha musi spełniać następujące warunki:
- Jeden lub więcej znaków spacji
- Ciąg znaków ASCII (wielkość bez znaczenia) pasującego do łańcucha
"SYSTEM"
- Jeden lub więcej znaków spacji
- Znak U+0022 QUOTATION MARK lub U+0027 APOSTROPHE (cudzysłów lub apostrof)
- Łańcuch
about:legacy-compat
(z zachowaniem wielkości znaków) - Odpowiadający znak zamykający U+0022 QUOTATION MARK lub U+0027 APOSTROPHE (tzn. ten sam znak, jak w kroku 4)
Innymi słowy następujące zapisy będą prawidłowe (wielkość znaków w łańcuchach bez znaczenia z wyjątkiem tekstu umieszczonego w apostrofach lub cudzysłowach):
<!DOCTYPE html SYSTEM "about:legacy-compat">
<!doctype html system 'about:legacy-compat'>
Oczywiście DOCTYPE legacy string nie powinien być generowany w systemach, które są w stanie wyprowadzić wersję skróconą.
Obsolete permitted DOCTYPE string#
Aby ułatwić autorom migrację z HTML4 i XHTML1, można umieszczać tzw. obsolete permitted DOCTYPE. Jest to przestarzały (ale dozwolony) ciąg znaków, który należy ewentualnie wstawić w 4 punkcie algorytmu deklaracji DOCTYPE (wersja skrócona). Składnia takiego łańcucha musi spełniać następujące warunki:
- Jeden lub więcej znaków spacji
- Ciąg znaków ASCII (wielkość bez znaczenia) pasującego do łańcucha
"PUBLIC"
- Jeden lub więcej znaków spacji
- Znak U+0022 QUOTATION MARK lub U+0027 APOSTROPHE (pierwszy cudzysłów lub apostrof)
- Łańcuch znaków z pierwszej komórki poniższej tabeli.
- Odpowiadający znak zamykający U+0022 QUOTATION MARK lub U+0027 APOSTROPHE (tzn. ten sam znak, jak w kroku 4)
- Jeśli komórka w drugiej kolumnie wybranej opcji (krok 5) nie jest pusta, jeden lub więcej znaków spacji
- Jeśli komórka w drugiej kolumnie wybranej opcji (krok 5) nie jest pusta, znak U+0022 QUOTATION MARK lub U+0027 APOSTROPHE (trzeci cudzysłów lub apostrof)
- Jeśli komórka w drugiej kolumnie wybranej opcji (krok 5) nie jest pusta, wartość tej komórki
- Jeśli komórka w drugiej kolumnie wybranej opcji (krok 5) nie jest pusta, odpowiadający znak zamykający U+0022 QUOTATION MARK lub U+0027 APOSTROPHE (tzn. ten sam znak, jak w kroku 8)
Poniższa tabela zawiera dozwolone wartości dla publicznych i systemowych identyfikatorów w przestarzałej deklaracji DOCTYPE:
Public identifier | System identifier |
---|---|
-//W3C//DTD HTML 4.0//EN | |
-//W3C//DTD HTML 4.0//EN | http://www.w3.org/TR/REC-html40/strict.dtd |
-//W3C//DTD HTML 4.01//EN | |
-//W3C//DTD HTML 4.01//EN | http://www.w3.org/TR/html4/strict.dtd |
-//W3C//DTD XHTML 1.0 Strict//EN | http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd |
-//W3C//DTD XHTML 1.1//EN | http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd |
Jak widzimy HTML5 udostępnia tylko część identyfikatorów z poprzednich specyfikacji. Całkowicie pominięto odmiany typu Transitional i Frameset, pozostawiając tylko wersje Strict. Autorzy powinni jak najszybciej przejść na wersję skróconą.