Jawaban singkat
Menurut spesifikasi saat ini, ya, style
elemen harus selalu ada di head
. Tidak ada pengecualian (kecuali style
elemen di dalam template
elemen , jika Anda ingin menghitungnya).
Ini tidak selalu terjadi secara historis. Jika Anda peduli dengan detail spesifikasi dan riwayatnya, teruslah membaca.
Apa pun spesifikasi yang disebutkan, menggunakan style
elemen di dalam body
melakukan lebih banyak atau lebih sedikit pekerjaan di semua browser utama. Namun, ini dianggap sebagai praktik yang buruk karena melanggar spesifikasi dan karena dapat menyebabkan konsekuensi yang tidak diinginkan seperti performa rendering yang lebih buruk atau "kilatan konten tanpa gaya".
Sejarah spesifikasi
style
elemen tidak ada di HTML 2 . Mereka diperkenalkan di HTML 3.0, di mana mereka dimasukkan dalam daftar elemen yang dapat dimasukkan dalam Elemen Kepala , tetapi tidak termasuk dalam daftar elemen yang mungkin ada di Elemen Tubuh . Jadi, pada saat elemen pertama kali dispesifikasi, itu hanya dapat dimasukkan dalam head
.
Ini tetap terjadi (meskipun diekspresikan menggunakan kata-kata yang berbeda) sampai HTML 5, yang memperkenalkan scoped
atribut (sejak dihapus) untuk style
elemen. Atribut ini, jika ada, dimaksudkan untuk memungkinkan sebuah style
elemen ditempatkan di dalam sebuah elemen dalam body untuk hanya mendesain turunan elemen tersebut. Akan tetapi, fitur itu tidak pernah sampai ke browser asli mana pun (setidaknya tidak perlu diaktifkan melalui bendera pengembang) dan telah dihapus dari spesifikasi W3C dan WhatWG "karena kurangnya minat pelaksana" . Setelah itu, style
elemen hanya diizinkan dalam konteks yang mengizinkan konten metadata, yaitu hanya kepala. Jadi kami kembali ke aturan yang sama seperti sebelumnya HTML 5.
Namun, karena kesalahan yang dibuat oleh kedua organisasi spesifikasi, indeks elemen non-normatif yang disertakan sebagai lampiran di kedua spesifikasi tidak diperbarui dengan benar untuk mencerminkan penghapusan scoped
, menjadikannya tidak konsisten dengan spesifikasi normatif. Saya menunjukkan ini baik ke WhatWG dan ke W3C , dan dengan melakukan itu tanpa disadari mengatur peristiwa yang menyebabkan dua spesifikasi berbeda.
Solusi WhatWG untuk ketidakkonsistenan antara spesifikasi normatif dan indeks non-normatif adalah menerima tambalan saya yang mengoreksi indeks non-normatif.
W3C, di sisi lain, menolak tambalan setara saya alih-alih memperbarui spesifikasi normatif untuk memungkinkan penggunaan style
elemen dalam body
, sementara peringatan ini dengan catatan bahwa itu dapat menyebabkan masalah dan harus dilakukan "dengan hati-hati". Alasan di balik perubahan ini adalah untuk membuat spesifikasi selaras dengan perilaku browser di kehidupan nyata.
Jadi, mulai Maret 2017, jawaban resmi untuk pertanyaan ini bergantung pada organisasi standar mana yang Anda pilih untuk didengarkan. Jika Anda mendaftar ke spesifikasi WhatWG (umumnya lebih dihormati), maka style
elemen tidak diizinkan di body
. Jika Anda mendaftar ke spesifikasi W3C, maka itu diizinkan, tetapi tidak disarankan.
Keadaan konyol ini diakhiri (mungkin seperti banyak inkonsistensi lainnya) dengan perjanjian damai April 2019 antara W3C dan WhatWG , yang setuju bahwa spesifikasi WhatWG akan menjadi satu-satunya standar HTML yang hidup, dengan W3C hanya merilis snapshot dari itu sebagai bernomor Spesifikasi HTML alih-alih mengembangkan spesifikasi pesaing secara paralel. Dengan demikian, perubahan dari 2017 ke fork W3C yang mengizinkan style
elemen di body
tidak lagi menjadi bagian dari spesifikasi saat ini; itu hanyalah keingintahuan akan sejarah.
Jadi, hari ini, kita hanya perlu melihat spesifikasi WhatWG untuk menentukan apa yang diizinkan secara resmi. Ini mengatakan:
4.2.6. The style
elemen
Konten metadata .
Dimana konten metadata diharapkan.
Dalam <noscript>
elemen yang merupakan anak dari <head>
elemen.
CTRL-Fing melalui spesifikasi halaman tunggal mengungkapkan bahwa satu-satunya elemen yang model kontennya menyertakan konten metadata adalah head
elemen tersebut.
Indeks non-normatif dari elemen yang saya sebutkan sebelumnya juga menegaskan bahwa satu-satunya orang tua yang diizinkan untuk suatu style
elemen adalah a head
atau noscript
elemen.