Kurze Antwort
Nach der aktuellen Spezifikation müssen sich styleElemente immer in der befinden . Es gibt keine Ausnahmen (außer einem Element innerhalb eines Elements , wenn Sie das zählen möchten).headstyletemplate
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 styleElementen 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
styleElemente 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) scopedAttribut für einführtestyle Elemente eingeführt wurde. Dieses Attribut sollte, falls vorhanden, ermöglichen, dass ein styleElement 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 styleElemente 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 styleElementen 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 styleElement 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 styleElemente in der erlaubte, bodynicht 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 styleElement
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 headElement 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 styleElement ein headoder ein Element sind noscript.