Kurze Antwort
Nach der aktuellen Spezifikation müssen sich style
Elemente immer in der befinden . Es gibt keine Ausnahmen (außer einem Element innerhalb eines Elements , wenn Sie das zählen möchten).head
style
template
Dies war historisch nicht immer der Fall. Wenn Sie sich für die Details der Spezifikation und deren Verlauf interessieren, lesen Sie weiter.
Unabhängig davon, was in der Spezifikation angegeben ist, funktioniert die Verwendung von style
Elementen in mehr oder weniger in allen gängigen Browsern. Es wird jedoch als schlechte Vorgehensweise angesehen, da es sowohl gegen die Spezifikation verstößt als auch unerwünschte Folgen wie eine schlechtere Renderleistung oder einen "Blitz nicht gestylter Inhalte" haben kann.body
Spezifikationsverlauf
style
Elemente waren in HTML 2 nicht vorhanden . Sie wurden in HTML 3.0 eingeführt, wo sie in die Liste der Elemente aufgenommen wurden, die in The Head Element enthalten sein könnten , aber nicht in die Liste der Elemente, die in The Body Element vorhanden sein könnten . In dem Moment, in dem das Element zum ersten Mal spezifiziert wurde, konnte es daher nur in das Element aufgenommen werden head
.
Dies blieb bis HTML 5 der Fall (obwohl mit einem anderen Wortlaut ausgedrückt), der das (seitdem entfernte) scoped
Attribut für einführtestyle
Elemente eingeführt wurde. Dieses Attribut sollte, falls vorhanden, ermöglichen, dass ein style
Element innerhalb eines Elements im Körper platziert wird, um nur die Nachkommen dieses Elements zu formatieren. Diese Funktion hat es jedoch nie in einen echten Browser geschafft (zumindest nicht, ohne über ein Entwicklerflag aktiviert werden zu müssen) und wurde "aus Mangel an Implementiererinteresse" sowohl aus den W3C- als auch aus den WhatWG-Spezifikationen entfernt . Danach waren style
Elemente nur in Kontexten zulässig, die Metadateninhalte zulassen, bei denen es sich nur um den Kopf handelt. Somit waren wir wieder bei den gleichen Regeln wie vor HTML 5.
Aufgrund eines Fehlers beider Spezifikationsorganisationen wurde jedoch ein nicht normativer Index von Elementen, der in beiden Spezifikationen als Anhang enthalten ist, nicht ordnungsgemäß aktualisiert, um das Entfernen von Elementen widerzuspiegeln scoped
, was ihn mit der normativen Spezifikation inkonsistent macht. Ich wies sowohl die WhatWG als auch die W3C darauf hin und setzte dabei unabsichtlich Ereignisse in Gang, die dazu führten, dass die beiden Spezifikationen auseinander gingen.
Die Lösung von WhatWG für die Inkonsistenz zwischen der normativen Spezifikation und dem nicht normativen Index bestand darin , meinen Patch zu akzeptieren, der den nicht normativen Index korrigiert.
Das W3C lehnte andererseits meinen entsprechenden Patch ab, anstatt stattdessen die normative Spezifikation zu aktualisieren , um die Verwendung von style
Elementen in der zu ermöglichen body
, während dies mit dem Hinweis bedacht wurde, dass dies Probleme verursachen kann und "mit Vorsicht" erfolgen sollte. Der Grund für diese Änderung war, die Spezifikation an das reale Browserverhalten anzupassen.
Ab März 2017 hing die offizielle Antwort auf diese Frage davon ab, welche Normungsorganisation Sie sich angehört haben. Wenn Sie die (allgemein anerkanntere) WhatWG-Spezifikation aufgeführt haben, war ein style
Element in der nicht zulässig body
. Wenn Sie die W3C-Spezifikation aufgeführt haben, war dies zulässig, aber nicht empfohlen.
Dieser alberne Zustand wurde (vielleicht wie viele andere derartige Unstimmigkeiten) mit dem Friedensvertrag zwischen W3C und WhatWG vom April 2019 beendet , in dem vereinbart wurde, dass die WhatWG-Spezifikation der einzig wahre HTML-Standard wird, wobei W3C lediglich nummerierte Schnappschüsse veröffentlicht HTML-Spezifikationen, anstatt parallel eine konkurrierende Spezifikation zu entwickeln. Daher ist der Wechsel von 2017 zu der W3C-Gabel, die style
Elemente in der erlaubte, body
nicht mehr Teil einer aktuellen Spezifikation. es ist nur eine Kuriosität der Geschichte.
Daher müssen wir uns heute nur noch die WhatWG-Spezifikation ansehen, um festzustellen, was offiziell zulässig ist. Es hat folgendes zu sagen:
4.2.6. Das style
Element
Metadateninhalt .
Wo Metadateninhalt erwartet wird.
In einem <noscript>
Element, das ein untergeordnetes <head>
Element eines Elements ist.
STRG-Finger durch die Einzelseiten-Spezifikation zeigt, dass das einzige Element, dessen Inhaltsmodell Metadateninhalt enthält, das head
Element ist.
Der nicht normative Index der Elemente, die ich zuvor erwähnt habe, bestätigt auch, dass die einzigen zulässigen Eltern für ein style
Element ein head
oder ein Element sind noscript
.