Risposta breve
In base alle specifiche attuali, sì, gli style
elementi devono essere sempre presenti in head
. Non ci sono eccezioni (tranne un style
elemento all'interno di un template
elemento , se si desidera contarlo).
Questo non è sempre stato il caso storico. Se ti interessano i dettagli della specifica e la sua storia, continua a leggere.
Non importa quale sia la specifica dice, utilizzando style
elementi del body
fa più o meno lavoro in tutti i principali browser. Tuttavia, è considerata una cattiva pratica sia perché viola le specifiche sia perché può causare conseguenze indesiderate come peggiori prestazioni di rendering o un "lampo di contenuto non elaborato".
Cronologia delle specifiche
style
gli elementi non esistevano in HTML 2 . Sono stati introdotti in HTML 3.0, dove sono stati inclusi nell'elenco di elementi che potrebbero essere inclusi in The Head Element , ma non inclusi nell'elenco di elementi che potrebbero essere presenti in The Body Element . Pertanto, al momento in cui l'elemento è stato ipotizzato per la prima volta, poteva essere incluso solo nel file head
.
Questo è rimasto il caso (anche se espresso usando una diversa formulazione) fino a HTML 5, che ha introdotto l' scoped
attributo (da quando rimosso) per gli style
elementi. Questo attributo, quando presente, intendeva consentire a un style
elemento di essere posizionato all'interno di un elemento nel corpo per modellare solo i discendenti di quell'elemento. Tuttavia, quella funzione non è mai arrivata a nessun browser reale (almeno non senza la necessità di essere abilitata tramite un flag di sviluppo) ed è stata rimossa dalle specifiche W3C e WhatWG "a causa della mancanza di interesse per gli implementatori" . Successivamente, gli style
elementi sono stati consentiti solo in contesti che consentono il contenuto di metadati, che è solo la testa. Quindi siamo tornati alle stesse regole di prima di HTML 5.
Tuttavia, a causa di un errore commesso da entrambe le organizzazioni di specifiche, un indice non normativo di elementi inclusi come appendice in entrambe le specifiche non è stato aggiornato correttamente per riflettere la rimozione di scoped
, rendendolo incompatibile con le specifiche normative. L'ho fatto notare sia al WhatWG che al W3C e, nel farlo, ha involontariamente messo in moto eventi che hanno fatto divergere le due specifiche.
La soluzione di WhatWG all'incongruenza tra la specifica normativa e l'indice non normativo era quella di accettare la mia patch per correggere l'indice non normativo.
Il W3C, d'altra parte, ha rifiutato la mia patch equivalente a favore invece di aggiornare le specifiche normative per consentire l'uso di style
elementi nel body
, avvertendo questo con una nota che può causare problemi e dovrebbe essere fatto "con cura". Il ragionamento alla base di questa modifica è stato quello di allineare le specifiche al comportamento del browser nella vita reale.
Pertanto, a partire da marzo 2017, la risposta ufficiale a questa domanda dipendeva dall'organizzazione di standard che hai scelto di ascoltare. Se hai elencato le specifiche WhatWG (generalmente più rispettate), un style
elemento non è stato consentito in body
. Se hai elencato le specifiche W3C, è stato consentito, ma non raccomandato.
Questo sciocco stato di cose si è concluso (forse come molte altre incoerenze del genere) con il trattato di pace di aprile 2019 tra W3C e WhatWG , che ha convenuto che le specifiche di WhatWG sarebbero diventate l'unico vero standard HTML vivente, con W3C che semplicemente rilasciava le istantanee da esso numerate Specifiche HTML invece di sviluppare una specifica concorrente in parallelo. Pertanto, la modifica dal 2017 al fork W3C che ha consentito gli style
elementi nel body
non fa più parte delle specifiche attuali; è semplicemente una curiosità della storia.
Quindi, oggi, dobbiamo solo guardare alle specifiche WhatWG per determinare cosa è ufficialmente consentito. Ha questo da dire:
4.2.6. L' style
elemento
Contenuto di metadati .
Dove è previsto il contenuto di metadati .
In un <noscript>
elemento che è figlio di un <head>
elemento.
CTRL-Fing attraverso le specifiche a pagina singola rivela che l'unico elemento il cui modello di contenuto include contenuto di metadati è l' head
elemento.
L' indice non normativo di elementi che ho citato in precedenza conferma anche che gli unici genitori ammessi per un style
elemento sono un head
o un noscript
elemento.