Современные браузерные парсеры (то есть те, которые используют алгоритм синтаксического анализа HTML5) работают следующим образом. Если они ожидают следующий текст или новый тег и увидят <!
, то они проверяют следующие несколько символов, чтобы определить, являются ли они --
или DOCTYPE
или, если они обрабатывают встроенный SVG или MathML, [CDATA[
, (См. http://dev.w3.org/html5/spec/tokenization.html#markup-declaration-open-state)
Если, как и в случае <!- foo
, ни одно из этих совпадений не соответствует, то синтаксический анализатор переходит в состояние фиктивного комментария , где все символы, следующие до следующего >
, читаются и и преобразуется в комментарий для помещения в DOM.
Отсюда и поведение, которое вы видите, когда <!-
работает как начало комментария. Обратите внимание, что такое поведение является поведением «исправления» для сломанной разметки, и не стоит полагаться на него.
Вы можете увидеть, как такая разметка формирует DOM здесь: Live DOM Viewer
Также обратите внимание, что это отличается от того, что говорит @Amber. Он не рассматривается как тег в каком-либо значимом смысле и, конечно, не игнорируется.