<STYLE> deve trovarsi nel <HEAD> di un documento HTML?


136

A rigor di termini, i styletag devono essere all'interno headdi un documento HTML? Lo standard 4.01 implica che, ma non è esplicitamente dichiarato:

L'elemento STYLE consente agli autori di inserire le regole del foglio di stile nella testa del documento. HTML consente qualsiasi numero di elementi STYLE nella sezione HEAD di un documento.

Dico "in senso stretto" perché ho un'app che mette elementi di stile all'interno del corpo e tutti i browser con cui ho provato sembrano usare gli elementi di stile. Mi sto solo chiedendo se sia effettivamente legale.


1
In caso di dubbi, il validatore del markup W3C aiuta sempre :) http://validator.w3.org/
Lazlo

Un'eccezione alla regola 'put <style> in <head>' è l'email html, poiché molti servizi di webmail elimineranno semplicemente tutti gli elementi head, il che significa che i tuoi stili sono spariti.
user132837

1
Le specifiche richiedono il supporto dei browser stylein body, quindi è abbastanza buono per me, indipendentemente da ciò che è implicato nelle sezioni delle linee guida dell'autore.
WraithKenny,

Risposte:


104

styledovrebbe essere incluso solo nel headdocumento.

Oltre al punto di convalida, un avvertimento che potrebbe interessarti quando si utilizza styleil bodyè il lampo di contenuto non stilato . Il browser otterrebbe elementi che sarebbero stati disegnati dopo essere stati visualizzati, facendoli cambiare dimensione / forma / carattere e / o sfarfallio. È generalmente un segno di cattiva arte. In genere puoi cavartela styledove vuoi, ma cerca di evitarlo ogni volta che è possibile.

HTML 5 ha introdotto un scopedattributo che ha permesso styledi includere tag ovunque nel corpo, ma poi lo hanno rimosso di nuovo.


6
Alla data sembra che solo Firefox supporti l' scopedattributo, vedi caniuse.com/#feat=style-scoped .
Jaime Hablutzel,

2
L'articolo collegato è scomparso nel link marcio, quindi ecco l'ultima versione archiviata disponibile: web.archive.org/web/20150525042412/http://bluerobot.com/web/css/…
Zachary Murray il

@ZacharyMurray grazie per l'heads up! Ho aggiornato il collegamento nel corpo con quello dell'archivio web.
Esteban Küber,

1
Le specifiche richiedono browser conformi per supportare i styletag body, quindi, nonostante la parte dell'autore delle specifiche, ritengo che gli stili del corpo siano validi. github.com/whatwg/html/issues/1605#issuecomment-235961103
WraithKenny

19

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

Categorie :

Contenuto di metadati .

Contesti in cui questo elemento può essere utilizzato :

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.


18

Mentre le altre risposte sono corrette, sono sorpreso che nessuno abbia spiegato dove gli standard vietano gli stili al di fuori head.

In realtà è nella sezione su The headElement (e nel DTD ):

<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
<!ENTITY % head.content "TITLE & BASE?">

<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->

Si, lo so. I DTD sono difficili da leggere.

Questo è l'unico posto dove si trova l' STYLEelemento, quindi implicitamente non è valido altrove.


6
Sono così confuso.
davi

1
Dovrebbe usare HTML5 ora, che IIRC non ha DTD. Quello che dice solo la specifica HTML5 è ciò che è o non è.
Jan Kyu Peblik,

14

Non dovrebbero andare fuori di testa, ma funzionano comunque; anche se potresti notare un rapido sfarfallio. Il sito non dovrebbe convalidare con il tag di stile al di fuori della testa, ma importa davvero? Inoltre, i tag di collegamento funzionano anche al di fuori della testa, anche se non dovrebbero.


5
Dire "funzionano" è un po 'complicato. Nella migliore delle ipotesi, puoi dire che la maggior parte dei browser attuali eseguirà comunque il rendering degli stili, ma non c'è nulla di questo errore che intrinsecamente "funziona". Non potrebbe funzionare in nessuna versione futura di alcun browser e non farebbero nulla di male.
Chuck,

6
imo, styles rendering = funziona; niente di complicato. quest'ultima frase deve essere riscritta; non ha senso. ho detto che non era "giusto" quando ho detto che non sarebbe stato valido, quindi non ho capito cosa intendevi con quella frase.
geowa4,

Il problema è che anche se sono in stile, avrai un po 'di sfarfallio sul contenuto quando style
entrano

2
a meno che il tag di stile non sia il primo nel corpo
geowa4

Non provarlo a casa.
TechNyquist,

3

Come hanno affermato le altre risposte, in realtà non è necessario che ci sia. Tuttavia, non verrà convalidato. Questo può o meno avere importanza in questo caso, ma tieni presente che il rendering di html dipende interamente dai browser. Da quello che so, tutti i browser usati di oggi supporteranno di metterlo fuori dalla testa, ma non puoi garantirlo per i browser futuri e le versioni future del browser.

Rispetta lo standard e sei più sicuro. Quanto è più sicuro il dibattito.


3

La raccomandazione HTML5 W3C del 14 dicembre 2017 (non la precedente bozza di cui sopra) ora dice che puoi includere <style>.

"Nel corpo, dove è previsto il contenuto di flusso." (sezione 4.2.6)


Anche se ora, W3C ufficialmente lo stato che i WHATWG spec obsoletes tutte le specifiche precedenti, e il WHATWG specifiche non consente stylein body, quindi siamo di nuovo a questo essere inequivocabilmente proibito. Vedi la mia risposta se sei interessato al percorso tortuoso con cui siamo arrivati ​​qui.
Mark Amery,

2

Un tag di stile ovunque ma all'interno <head>non verrà convalidato con le regole del W3C.




-1

Puoi usare il tag di stile all'interno della sezione head o body oppure anche al di fuori del tag html (non è raccomandato il codice HTML esterno). Nei progetti in tempo reale molte volte puoi vedere che usano il tag di stile sul lato del tag html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.