"Upewniania się" nie zaczynaj od pytania się nas, jajcku. Zerknij najpierw do specyfikacji na w3.org . Ewentualnie stwórz dokument HTML5 i zwaliduj go na http://validator.w3.org/ . My Ci zawsze możemy podpowiedzieć źle. Pamiętaj, że profesjonalni, dobrze poinformowani webdeveloperzy są w zdecydowanej mniejszości -- w naszej profesji byle kto może zacząć "składać stronki" i wypowiadać się na forach. Zresztą, nawet osoba doświadczona może się pomylić.
Zacznijmy od specyfikacji HTML5, konkretnie od jej części poświęconej atrybutowi a
:
http://www.w3.org/TR/2010/WD-html5-20100304/text-level-semantics.html#the-a-element
Zobaczmy na to, jaką zawartość (ang. content) może mieć element a
:
Content model:
Transparent, but there must be no interactive content descendant.
Co to jest to transparent
? W specyfikacji to link. Przejdźmy za nim do odpowiedniej definicji w dokumencie ( http://www.w3.org/TR/2010/WD-html5-20100304/embedded-content-0.html#transparent
):
Some elements are described as transparent; they have "transparent" in the description of their content model.
When a content model includes a part that is "transparent", those parts must not contain content that would not be conformant if all transparent elements in the tree were replaced, in their parent element, by the children in the "transparent" part of their content model, retaining order.
W uproszczeniu chodzi o to, że element z modelem zawartości transparent
może zawierać dowolne elementy, ale tylko takie, które pasowałyby do elementu nadrzędnego, gdyby element z modelem transparent
został usunięty i zamiast niego wstawiona by była tylko jego zawartość. Chodzi o to, że cały kod musi pozostać poprawny nawet po tym, jak usuniemy element z modelem zawartości transparent
i zamiast niego wstawimy po prostu jego dzieci. Najłatwiej to zrozumiesz na przykładzie, który jest umieszczony w wyjaśnieniu.
Chodzi o to, że element a
może zawierać praktycznie cokolwiek, a więc i div
-a, ale tylko jeśli element nadrzędny elementu a
może zawierać to cokolwiek, czyli tego diva. Czyli takie coś będzie OK:
Kopiuj
<ul>
<li>
<a href=...>
<div>Coś tam</div>
</a>
</li>
</ul>
Bo gdyby usunąć element a
, kod div
trafiłby bezpośrednio do li
:
Kopiuj
<ul>
<li>
<div>Coś tam</div>
</li>
</ul>
Czy div
może być w li
? Na wszelki wypadek sprawdźmy.
Fragment specyfikacji dla li
:
http://www.w3.org/TR/2010/WD-html5-20100304/semantics.html#the-li-element
Model zawartości jest tam opisany jako flow content
. flow
jest linkiem, podążamy za nim:
http://www.w3.org/TR/2010/WD-html5-20100304/dom.html#flow-content
Tutaj podana jest lista elementów, które zaliczają się do flow content
. div
jest na liście. Więc div
może być w li
. Więc gdybyśmy usunęli z naszego kodu znaczniki <a ...>
oraz </a>
, kod pozostałby poprawny -- więc w tym wypadku możemy wstawić diva do a
.
Przykład z drugiej strony:
Kopiuj
<p>
Lorem ipsum <strong><a href=...><div>dolor sit amet</div></a></strong> adipiscing elit
</p>
Tutaj mamy paragraf. W nim mamy strong
, w nim nasz a
, a w środku div
. Od razu wygląda to podejrzanie. div
znajduje się tak naprawdę wewnątrz strong
, a to już jest głupie. O tym właśnie mówi zasada o zawartości transparent
elementu a
: kod nie może wyglądać głupio (tj. być niepoprawny) gdy usuniemy znaczniki a
.
Przeprowadźmy więc nasz sprawdzian i usuńmy na chwilę te znaczniki a
:
Kopiuj
<p>
Lorem ipsum <strong><div>dolor sit amet</div></strong> adipiscing elit
</p>
Doświadczonego developera to aż kłuje gdy widzi div-a wewnątrz strong
, ale sprawdźmy na wszelki wypadek specyfikację.
http://www.w3.org/TR/2010/WD-html5-20100304/text-level-semantics.html#the-strong-element
Model zawartości to phrasing content
, podążamy za linkiem:
http://www.w3.org/TR/2010/WD-html5-20100304/dom.html#phrasing-content
Na liście elementów pasujących do phrasing content
nie ma div-a. Więc div
-- jak się domyślaliśmy -- nie mógłby się znaleźć w strong
. Więc nie możemy oszukać, wstawiając do strong
element a
i dopiero w element a
wstawiając div-a.
Podsumowując: możesz wstawiać div-y do a
, ale tylko gdy nie "oszukujesz". Tj. div
musiałby pasować również wtedy, gdyby umieścić go w danym miejscu zamiast elementu a
.
nav
,header
itp. nie będą uwzględniane. Z włączonym JS oraz wspomnianą łatką będzie OK. W innych przeglądarkach zawsze będzie OK.