Причина в том, что элемент контента секционирования (nav
в вашем случае) стоит перед элементом контента заголовка (h2
в вашем случае):
<!-- A -->
<article>
<nav></nav>
<h2>Test</h2>
</article>
Если вы их переключите, валидаторне выдает предупреждение:
<!-- B -->
<article>
<h2>Test</h2>
<nav></nav>
</article>
См. часть схемы документа, которую генерируют эти фрагменты:
<!-- A -->
- article (no heading)
-- nav (no heading)
- "Test" (h2 of an implied section, on the same level as the article)
<!-- B -->
- "Test" (h2 of article)
-- nav (no heading)
Ссылка на спецификацию
Создание схемы описывает алгоритм.Я думаю, что уместным шагом является этот (но я не привык читать такие алгоритмы, поэтому лучше взять его с крошкой соли):
При входе в секцию content element
Выполните следующие шаги:
Если current outline owner
не равно NULL, запустите эти подшаги:
- Если
current section
не имеет заголовка, создайте подразумеваемый заголовок и пусть он будет заголовком для current section
.
Насколько я понимаю, это то, чтопроисходит с примером «A»:
- Алгоритм вводит элемент содержимого секционирования (
article
). - До он находит заголовок (
h2
), он находит другой элемент содержимого секционирования (nav
) и вводит его немедленно, поэтому применяется указанный в кавычках шаг. article
по-прежнему является current outline owner
и current section
, поэтому подэтапыприменить (потому что current outline owner
не является нулевым). - Поскольку у
current section
(→ article
) нет заголовка (он еще не нашел h2
), создается подразумеваемый заголовок.Таким образом, article
получил заголовок, но это не ваш h2
.
Я думаю, что спецификация идеально описала бы это также в тексте ( Я был удивлен этимТоже ).
Соответствующий пост в трекере проблем валидатора: Предупреждение выдается, когда заголовки вложены в статью