Risposta breve
In base alle specifiche attuali, sì, gli styleelementi devono essere sempre presenti in head. Non ci sono eccezioni (tranne un styleelemento all'interno di un templateelemento , 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 styleelementi 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
stylegli 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' scopedattributo (da quando rimosso) per gli styleelementi. Questo attributo, quando presente, intendeva consentire a un styleelemento 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 styleelementi 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 styleelementi 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 styleelemento 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 styleelementi nel bodynon 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' styleelemento
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' headelemento.
L' indice non normativo di elementi che ho citato in precedenza conferma anche che gli unici genitori ammessi per un styleelemento sono un heado un noscriptelemento.