Od samego początku HTML zdobywał uznanie w relatywnie szybkim tempie. Niestety nie istniały wtedy żadne standardy stojące na straży czystości kodu. Pomimo tego, że autorzy HTML-a stworzyli go jako język semantyczny, praktyczne użycie wtłoczyło do niego wiele elementów i atrybutów prezentacyjnych, głównie z powodu producentów przeglądarek. Ostatnie standardy związane z HTML-em odzwierciedlają wysiłki zmierzające do uporządkowania z czasem chaotycznego rozwoju języka oraz utworzenia racjonalnych fundamentów pod budowę sensownych i dobrze prezentujących się dokumentów. Aby skierować rozwój coraz mniej semantycznego języka na właściwe tory, konsorcjum W3C ustanowiło standard kaskadowych arkuszy stylów CSS oraz rozszerzalny język arkuszy stylów XSL, przenosząc na nie ciężar warstwy prezentacji. Dzięki nim język HTML powoli zaczął wyzbywać się znaczników prezentacyjnych.
Aktualnie wyróżniamy dwie kategorie podziałów standardu HTML:
W celu odróżnienia od tradycyjnej wersji bazowanej na SGML-u, specyfikacja HTML-a oparta na XML-u nosi nazwę XHTML. Pomimo tego element główny wykorzystywany w składni języka nadal nazywa się 'html'. Organizacja W3C chciała, aby XHTML 1.0 był identyczny z HTML 4.01, poza pewnymi obejściami wynikającymi z ograniczeń wynikających ze specyfikacji samego XML-a w stosunku do bardziej złożonego SGML-a. Czasem w wyniku tak ścisłego pokrewieństwa, autorzy dokumentacji scalają obie nazwy jako (X)HTML lub X(HTML).
Podobnie jak HTML 4.01, XHTML 1.0 posiada trzy wersje: strict, transitional i frameset.
Poza deklaracją otwierającą różnice pomiędzy HTML-em 4.01 i XHTML-em 1.0 są w większości syntaktyczne. Składnia HTML-a pozwala na więcej swobody podczas pisania kodu niż XHTML. Są to elementy z opcjonalnymi znacznikami otwierającymi lub zamykającymi, a nawet elementy puste, które nie mają znacznika zamykającego. W przeciwieństwie do HTML-a XHTML wymaga, aby wszystkie elementy posiadały znaczniki otwierające i zamykające. W konsekwencji XHTML wprowadza znaczniki, które mogą być otwarte i zamknięte tylko w znaczniku otwierającym, wstawiając znak "/" (ukośnik) przed końcem znacznika otwierającego, np. <br/>
. Wdrożenie tego skrótu może stwarzać problemy dla starszego oprogramowania, któremu ta konwencja jest obca.
W celu zrozumienia subtelnych różnic pomiędzy HTML-em i XHTML-em przedstawione poniżej kroki prezentują transformację dokumentu XHTML 1.0 do dokumentu HTML 4.01:
lang
zamiast XHTML-owego xml:lang
.xmlns=URI
). HTML nie obsługuje przestrzeni nazw.<?xml version="1.0" encoding="utf-8"?>
).Content-Type
, przesyłanego przez serwer<br/>
na <br>
)Stosując się do wytycznych związanych z kompatybilnością (compatibility guidelines) organizacji W3C, przeglądarka powinna poprawnie zinterpretować typ dokumentu jako HTML lub XHTML. W3C zezwala na serwowanie dokumentów XHTML 1.0 jako HTML (MIME text/html) lub jako XHTML (MIME application/xhtml+xml lub application/xml). Jeśli dokument serwowany jest jako XHTML, przeglądarka używa parsera XML, stosującego się do specyfikacji XML.
Ostatnia specyfikacja HTML 4.01, a także wczesna specyfikacja XHTML posiadają trzy wersje: Strict, Transitional (nazwaną też Loose) i Frameset. Strict reprezentuje poprawną wersję standardu, podczas gdy warianty Transitional i Frameset zostały wprowadzone w celu płynnego przejścia ze starszych wersji HTML. Transitional i Frameset, w opozycji do Strict, pozwalają na używanie znaczników prezentacyjnych.
Zasadnicze różnice pomiędzy wersjami Transitional i Strict, pokazują, że Transitional jest bardziej tolerancyjny dla koderów. Obejmują one:
body
, blockquote
, form
, noscript
i noframes
.u
),s
i strike
),center
,font
,basefont
.background
i bgcolor
dla elementu body
,align
dla elementów div
, form
, paragraph
(p
) oraz nagłówków (h1
...h6
)align
, noshade
, size
oraz width
dla elementu hr
align
, border
, vspace
oraz hspace
dla elementów img
oraz object
align
dla elementu legend
oraz caption
align
oraz bgcolor
dla elementu table
nowrap
, bgcolor
, width
, height
dla elementów td
oraz th
bgcolor
dla elementu tr
clear
dla elementu br
compact
dla elementów dl
, dir
oraz menu
type
, compact
oraz start
dla elementów ol
i ul
type
oraz value
dla elementu li
width
dla elementu pre
menu
(brak substytutu, jednak zalecana jest lista nienumerowana; może powrócić w specyfikacji XHTML 2.0)dir
(brak substytutu, jednak zalecana jest lista nienumerowana)isindex
(element wymaga obsługi po stronie serwera)applet
(przestarzały na rzecz elementu object
)pre
nie zezwala na użycie elementów: applet
, font
i basefont
language
w elemencie script
frameset
(używany zamiast elementu body w wersji Frameset)frame
iframe
noframes
target
w elementach anchor
, client-side image-map (imagemap
), link
, form
i base
W odniesieniu do powyższych różnic, wersja Frameset posiada inny model treści (content model):
<html> <head> Wartości elementu head. </head> <frameset> <frame></frame> <noframes></noframes> </frameset> </html>