短い答え
現在の仕様によると、はい、style
要素は常に内になければなりませんhead
。例外はありません(style
要素内のtemplate
要素を除きます)。
これは常に歴史的にそうであったわけではありません。仕様の詳細とその履歴に関心がある場合は、読み続けてください。
スペックが言うに関係なく、使用style
中の要素はbody
ありませんすべての主要なブラウザでは、多かれ少なかれ仕事を。ただし、仕様に違反しているため、レンダリングパフォーマンスの低下や「スタイルのないコンテンツのフラッシュ」などの望ましくない結果を引き起こす可能性があるため、これは悪い習慣と見なされています。
仕様履歴
style
要素はHTML 2には存在しませんでした。それらはHTML 3.0で導入され、ヘッドエレメントに含めることができる要素のリストには含まれていましたが、ボディエレメントに含めることができる要素のリストには含まれていませんでした。したがって、要素が最初に指定された時点では、にのみ含めることができました。head
これは、(別の表現を使用して表現されていても)要素に(削除されたscoped
ため)属性を導入したHTML 5まで続きましたstyle
。この属性は、存在する場合、style
要素を本文の要素内に配置して、その要素の子孫のみをスタイル設定できるようにするためのものでした。ただし、この機能は実際のブラウザには到達せず(少なくとも開発者フラグを介して有効にする必要がない限り)、「実装者の関心がないため」 W3C仕様とWhatWG仕様の両方から削除されました。その後、style
要素はメタデータコンテンツを許可するコンテキスト(ヘッドのみ)でのみ許可されました。したがって、HTML 5の前と同じルールに戻りました。
ただし、両方の仕様組織によるエラーのため、両方の仕様に付録として含まれている要素の非規範的なインデックスは、の削除を反映するように適切に更新されておらずscoped
、規範的な仕様と矛盾しています。WhatWGとW3Cの両方にこれを指摘しましたすることで、2つの仕様の相違を引き起こしたモーションイベントに設定されました。
規範的な仕様と非規範的なインデックスの間の不整合に対するWhatWGの解決策は、私のパッチを受け入れることでした修正する。
一方、W3Cは同等のパッチを拒否し、代わりに規範的な仕様を更新style
して、body
、問題を引き起こす可能性があり、「注意して」実行する必要があるという注記を付けました。この変更の背後にある理由は、仕様を実際のブラウザーの動作に合わせるためです。
したがって、2017年3月以降、この質問に対する公式の回答は、あなたがどの標準化機構に耳を傾けるかを選択することに依存するということになります。(一般的にはより尊重される)WhatWG仕様にリストされている場合、ではstyle
要素は許可されていませんbody
。W3C仕様にリストした場合、それは許可されましたが、推奨されませんでした。
このばかげた状況は、W3CとWhatWGの間の2019年4月の平和条約によって(おそらく他の多くのそのような矛盾と同様に)終了しました。競合する仕様を並行して開発する代わりに、HTML仕様。したがって、2017からW3Cフォークへの変更によりstyle
、body
現在の仕様の一部ではなくなりました。それは単に歴史の好奇心です。
したがって、今日、WhatWG仕様を調べて、公式に許可されているものを判別するだけで済みます。これは言うべきことを持っています:
メタデータコンテンツ。
メタデータコンテンツが期待される場所。
中<noscript>
の子である要素<head>
要素。
単一ページの仕様をCTRL-Fingすると、コンテンツモデルにメタデータコンテンツが含まれる要素は要素だけであることがわかりhead
ます。
前に修正した要素の非規範的インデックスは、要素に許可されている親style
がhead
or noscript
要素のみであることも確認しています。