Согласно последним спецификациям WhatWG и W3C, да, style
элементы должны всегда находиться в head
. Какое-то время спецификации включали атрибут scoped
для элементов style
, который, когда он присутствовал, позволял им размещаться внутри элемента в теле для стилизации только потомков этого элемента ... но эта функция никогда не была доступна реальный браузер (по крайней мере, без необходимости включения через флаг разработчика) и был удален из обеих спецификаций "из-за отсутствия интереса со стороны разработчика" . Следовательно, элементы style
теперь разрешены только в тех контекстах, которые допускают содержание метаданных, которым является только заголовок.
(Хорошо, это не вполне правда - вы можете легально поместить содержимое метаданных, включая элементы style
, внутри элемента template
внутри body
, но оно выиграло на самом деле не вступит в силу, если вы используете браузер, который поддерживает шаблоны. Это просто глупость.)
В спецификации WhatWG есть следующее:
4.2.6. Элемент style
Содержание метаданных .
Где ожидается содержание метаданных .
В элементе <noscript>
, который является дочерним элементом элемента <head>
.
CTRL-Fing в одностраничной спецификации показывает, что единственным элементом, модель содержимого которого включает в себя содержимое метаданных, является элемент head
.
Между тем, последний проект спецификации W3C содержит абсолютно идентичные формулировки, за исключением того, что они также перечисляют содержимое метаданных в модели содержимого элементов template
. (WhatWG по-разному интерпретирует template
и отображает модель контента как nothing
.)
Ненормативный индекс элементов в спецификации WhatWG подтверждает, что единственными допустимыми родителями для элемента style
являются элементы head
или noscript
. (Версия того же индекса W3 неверно утверждает, что содержимое потока может содержать <style>
элементов, но это ошибка, введенная W3C во время удаления атрибута scoped
. У меня запрос на извлечение откройте, чтобы исправить это.)