Apakah <STYLE> harus ada di <HEAD> dokumen HTML?

141

Sebenarnya, apakah styletag harus berada di dalam headdokumen HTML? Standar 4.01 menyiratkan itu, tetapi tidak secara eksplisit dinyatakan:

Elemen STYLE memungkinkan penulis untuk meletakkan aturan style sheet di bagian kepala dokumen. HTML mengizinkan sejumlah elemen STYLE di bagian HEAD dokumen.

Saya mengatakan "secara tegas" karena saya memiliki aplikasi yang menempatkan elemen gaya di dalam tubuh, dan semua browser yang telah saya uji tampaknya menggunakan elemen gaya. Saya hanya ingin tahu apakah itu benar-benar legal.

eaolson
sumber
1
Jika Anda ragu, validator markup W3C selalu membantu :) http://validator.w3.org/
Lazlo
Satu pengecualian untuk aturan 'put <style> in <head>' adalah email html, karena banyak layanan email web akan menghapus semua elemen head yang berarti gaya Anda hilang.
pengguna132837
1
Spesifikasi memerlukan browser untuk dukungan styledalam body, jadi itu cukup baik bagi saya, terlepas dari apa yang tersirat oleh bagian penulis pedoman.
WraithKenny

Jawaban:

107

styleseharusnya dimasukkan hanya pada headdokumen.

Selain titik validasi, satu peringatan yang mungkin menarik bagi Anda saat menggunakan styledi bodyadalah kilatan konten unstyled . Browser akan mendapatkan elemen yang akan diberi gaya setelah ditampilkan, membuatnya bergeser pada ukuran / bentuk / font dan / atau flicker. Ini umumnya merupakan tanda pengerjaan yang buruk. Umumnya Anda bisa lolos dengan meletakkan di stylemana saja Anda inginkan, tetapi cobalah untuk menghindarinya kapan pun memungkinkan.

HTML 5 memperkenalkan scopedatribut yang memungkinkan styletag disertakan di mana pun di badan, tetapi kemudian mereka menghapusnya lagi.

Esteban Küber
sumber
6
Sampai saat ini, tampaknya hanya Firefox yang mendukung scopedatribut tersebut, lihat caniuse.com/#feat=style-scoped .
Jaime Hablutzel
2
Artikel tertaut telah menghilang ke dalam pembusukan tautan, jadi inilah versi arsip terbaru yang tersedia: web.archive.org/web/20150525042412/http://bluerobot.com/web/css/…
Zachary Murray
@ZacharyMurray terima kasih atas perhatiannya! Saya memperbarui tautan di badan ke arsip web.
Esteban Küber
1
Spesifikasi membutuhkan browser yang sesuai untuk mendukung styletag bodysehingga, terlepas dari spesifikasi pembuatnya, saya menganggap gaya tubuh valid. github.com/whatwg/html/issues/1605#issuecomment-235961103
WraithKenny
20

Jawaban singkat

  • Menurut spesifikasi saat ini, ya, styleelemen harus selalu ada di head. Tidak ada pengecualian (kecuali styleelemen di dalam templateelemen , 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 styleelemen 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

styleelemen 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 scopedatribut (sejak dihapus) untuk styleelemen. Atribut ini, jika ada, dimaksudkan untuk memungkinkan sebuah styleelemen 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, styleelemen 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 styleelemen 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 styleelemen 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 styleelemen di bodytidak 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 styleelemen

Kategori :

Konten metadata .

Konteks di mana elemen ini dapat digunakan :

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 headelemen tersebut.

Indeks non-normatif dari elemen yang saya sebutkan sebelumnya juga menegaskan bahwa satu-satunya orang tua yang diizinkan untuk suatu styleelemen adalah a headatau noscriptelemen.

Mark Amery
sumber
18

Sementara jawaban lain benar, saya terkejut tidak ada yang menjelaskan di mana standar melarang gaya di luar head.

Ini sebenarnya ada di bagian The headElement (dan di 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 -->

Ya saya tahu. DTD sulit dibaca.

Ini adalah satu-satunya tempat STYLEelemen muncul, jadi secara implisit tidak valid di tempat lain.

pengguna123444555621
sumber
6
Aku sangat bingung.
dav_i
1
Seharusnya sekarang menggunakan HTML5, yang IIRC tidak memiliki DTD. Apa yang dikatakan spesifikasi HTML5 adalah apa yang dimaksud atau tidak.
Jan Kyu Peblik
14

Mereka tidak seharusnya keluar dari pikiran, tetapi mereka tetap bekerja; meskipun Anda mungkin melihat kedipan cepat. Situs tidak boleh memvalidasi dengan tag gaya di luar kepala, tetapi apakah itu penting? Selain itu, tag tautan juga berfungsi di luar kepala, meskipun seharusnya tidak demikian.

geowa4
sumber
5
Mengatakan "mereka berhasil" sedikit rumit. Paling banter, Anda dapat mengatakan bahwa sebagian besar browser saat ini masih akan merender gaya, tetapi tidak ada kesalahan ini yang secara inheren "berfungsi". Itu tidak dapat berfungsi di versi mendatang dari browser apa pun dan mereka tidak akan melakukan kesalahan apa pun.
Chuck
6
imo, gaya yang dirender = berfungsi; tidak ada yang rumit. kalimat terakhir itu perlu ditulis ulang; Itu tidak masuk akal. saya menyebutkan bagaimana itu tidak "benar" ketika saya mengatakan itu tidak akan valid, jadi saya tidak boleh mengerti apa yang Anda maksud dengan kalimat itu.
geowa4
Masalahnya adalah bahwa bahkan jika mereka sedang ditata, Anda akan memiliki beberapa flicker pada konten ketika mereka styles menendang.
Esteban Kuber
2
kecuali jika tag gaya adalah yang pertama dalam tubuh
geowa4
Jangan coba ini di rumah.
TechNyquist
3

Seperti yang telah dinyatakan oleh balasan lain, sebenarnya tidak perlu ada di sana. Namun, itu tidak akan divalidasi. Ini mungkin atau mungkin tidak masalah dalam hal ini, tapi harap diingat bahwa rendering html sepenuhnya tergantung pada browser. Dari apa yang saya tahu semua browser yang digunakan saat ini akan mendukung meletakkannya di luar kepala, tetapi Anda tidak dapat menjaminnya untuk browser masa depan dan rilis browser di masa mendatang.

Tetaplah pada standar dan Anda lebih aman. Seberapa aman untuk banyak perdebatan.

Louis
sumber
3

The HTML5.2 W3C Rekomendasi, 14 Desember 2017 (tidak draft sebelumnya disebut di atas) sekarang mengatakan Anda dapat menyertakan <style>.

"Di dalam tubuh, di mana konten mengalir diharapkan." (bagian 4.2.6)

Anahata
sumber
Meski kini, W3C resmi negara bahwa WHATWG spesifikasi Obsoletes semua spesifikasi sebelumnya, dan WHATWG spesifikasi tidak memungkinkan styledalam body, jadi kita kembali ke ini sedang jelas dilarang. Lihat jawaban saya jika Anda tertarik dengan jalan berkelok-kelok yang kami lalui di sini.
Mark Amery
2

Tag gaya di mana saja kecuali di dalam <head>tidak akan divalidasi dengan aturan W3C.

womp
sumber
-1

Anda dapat menggunakan tag gaya di dalam bagian kepala atau bagian tubuh atau juga di luar tag html (html sisi luar tidak disarankan). Dalam proyek waktu nyata banyak waktu Anda dapat melihat mereka menggunakan tag gaya di luar tag html

Adarsh ​​Joshi
sumber