<html>
<body>
<style type="text/css">
p.first {color:blue}
p.second {color:green}
</style>
<p class="first">Hello World</p>
<p class="second">Hello World</p>
<style type="text/css">
p.first {color:green}
p.second {color:blue}
</style>
<p class="first">Hello World</p>
<p class="second">Hello World</p>
</body>
</html>
Bagaimana cara browser merender css yang tidak berdekatan? Apakah seharusnya menghasilkan beberapa struktur data menggunakan semua gaya css pada halaman dan menggunakannya untuk rendering?
Atau apakah itu dibuat menggunakan informasi gaya dalam urutan yang dilihatnya?
CSS
danHTML
.<head>
tag<body>
daripada di<head>
.Jawaban:
Seperti yang telah disebutkan orang lain, HTML 4 mengharuskan
<style>
tag untuk ditempatkan di<head>
bagian (meskipun sebagian besar browser mengizinkan<style>
tag di dalambody
).Namun, HTML 5 menyertakan
scoped
atribut (lihat pembaruan di bawah), yang memungkinkan Anda membuat lembar gaya yang dicakup dalam elemen induk dari<style>
tag. Ini juga memungkinkan Anda untuk menempatkan<style>
tag di dalam<body>
elemen:Jika Anda merender kode di atas dalam browser yang mendukung HTML-5
scoped
, Anda akan melihat lingkup terbatas dari style sheet.Hanya ada satu peringatan utama ...
Pada saat saya sedang menulis jawaban ini (Mei, 2013) hampir tidak ada browser arus utama yang mendukung
scoped
atribut ini. (Meskipun tampaknya pengembang membangun Chromium mendukungnya.)NAMUN, ada implikasi menarik dari
scoped
atribut yang berkaitan dengan pertanyaan ini. Ini berarti bahwa peramban masa depan dimandatkan melalui standar untuk memungkinkan<style>
elemen dalam<body>
(selama<style>
elemen dicakup.)Jadi, mengingat bahwa:
scoped
atributnya<style>
tag di dalamnya<body>
<style>
tag dalam<body>
... maka secara harfiah tidak ada salahnya * menempatkan
<style>
tag di dalam tubuh, selama Anda membuktikannya di masa mendatang denganscoped
atribut. Satu-satunya masalah adalah bahwa browser saat ini tidak akan benar-benar membatasi ruang lingkup stylesheet - mereka akan menerapkannya ke seluruh dokumen. Tetapi intinya adalah bahwa, untuk semua tujuan praktis, Anda dapat memasukkan<style>
tag di dalam<body>
ketentuan bahwa Anda:scoped
atribut<body>
tidak akan benar-benar dicakup (karena belum ada dukungan browser utama)* kecuali tentu saja, untuk mengecewakan validator HTML ...
Akhirnya, mengenai klaim umum (tetapi subyektif) bahwa menanamkan CSS ke dalam HTML adalah praktik yang buruk, harus dicatat bahwa seluruh poin dari
scoped
atribut ini adalah untuk mengakomodasi kerangka kerja pembangunan modern khas yang memungkinkan pengembang untuk mengimpor potongan HTML sebagai modul atau konten sindikasi . Sangat mudah untuk menyematkan CSS yang hanya berlaku untuk sebagian HTML tertentu, untuk mengembangkan komponen modular yang dienkapsulasi dengan stylings tertentu.Pembaruan pada Februari 2019, menurut dokumentasi Mozilla ,
scoped
atributnya sudah usang. Chrome berhenti mendukungnya di versi 36 (2014) dan Firefox di versi 62 (2018). Dalam kedua kasus, fitur tersebut harus diaktifkan secara eksplisit oleh pengguna di pengaturan browser. Tidak ada browser utama lain yang pernah mendukungnya.sumber
head
. Jika ini adalah satu-satunya css Anda, dan jika halamannya besar dan jika koneksi jaringannya tidak terlalu cepat, maka mungkin Anda akan melihat sekilas konten yang tidak distyle, tetapi itu akan mengejutkan saya dalam sebagian besar situasi praktis.@scoped
, atauscoped
nampaknya sedang sekarat: di sini dan di siniscoped
atribut telah dihapus dari spesifikasi HTML5 saat ini.BREAKING BAD NEWS untuk "gaya dalam tubuh" pecinta: W3C baru-baru ini kalah perang HTML melawan WHATWG, yang versionless HTML "Hidup Standard" kini telah menjadi satu resmi, yang, sayangnya, tidak tidak memungkinkan
STYLE
dalamBODY
. Hari-hari bahagia yang berumur pendek berakhir. ;) Validator W3C juga bekerja dengan spesifikasi WHATWG sekarang. (Terima kasih @ FrankConijn untuk informasi lebih lanjut!)(Catatan: ini adalah kasus "pada hari ini", tetapi karena tidak ada versi, tautan dapat menjadi tidak valid setiap saat tanpa pemberitahuan atau kontrol. Kecuali jika Anda bersedia untuk menautkan ke masing-masing sumber yang dilakukan di GitHub, pada dasarnya Anda tidak dapat lagi buat referensi stabil ke standar HTML resmi baru , AFAIK. Harap perbaiki saya jika ada cara kanonik untuk melakukan ini dengan benar.)
BERITA TERKAIT:
Yay,
STYLE
akhirnya valid dalamBODY
, pada HTML5.2! (Danscoped
sudah pergi juga.)Dari spesifikasi W3C ( nikmati baris terakhir! ):
META SIDE-NOTE:
Fakta bahwa meskipun ada kerusakan "perang browser" kami masih harus terus berkembang melawan dua standar "resmi" HTML "yang bersaing " (kutipan untuk
1 standard + 1 standard < 1 standard
) berarti bahwa pendekatan "masuk akal ke dalam parit akal sehat" pendekatan untuk pengembangan web tidak pernah benar-benar berhenti berlaku.Ini akhirnya dapat berubah sekarang, tetapi mengutip kebijaksanaan konvensional: pembuat / pengembang web dan dengan demikian, browser pada akhirnya harus memutuskan apa yang harus (dan tidak seharusnya) dalam spesifikasi, ketika tidak ada alasan yang baik terhadap apa yang telah dilakukan di realitas. Dan kebanyakan browser telah lama mendukung
STYLE
diBODY
(dalam satu atau lain cara, lihat misalnyascoped
. Attr) (yang, meskipun kinerja yang melekat (dan mungkin lainnya) hukuman kita . Harus memutuskan untuk membayar atau tidak, tidak spesifikasi). Jadi, untuk satu, saya akan terus bertaruh pada mereka, dan tidak akan menyerah. ;) Jika WHATWG memiliki rasa hormat yang sama terhadap kenyataan / penulis seperti yang mereka klaim, mereka mungkin hanya melakukan di sini apa yang W3C lakukan.sumber
style
blok dibody
yang memvalidasi?STYLE
sebagai konten metadata & aliran, tetapi spesifikasi "hidup" WHATWG terbaru menceritakan kisah "metadata" lama yang membosankan dan membosankan (hanya mengizinkannya di HEAD). Dan, untuk menambah penghinaan pada cedera, validator W3C tampaknya mengikuti rasa WHATWG. Saya belum memutuskan apakah akan tertawa atau menangis, tetapi tentu saja memutuskan, secara pribadi, untuk "berbuat salah" dengan kasus "browser + W3C - validator", dan memungkinkan GAYA di BODY. (BTW, jangan lupa: kita harus menjadi sumber utama standar , sebenarnya.)Ketika saya melihat bahwa Sistem Manajemen Konten situs-besar secara rutin menempatkan beberapa elemen <style> (beberapa, tidak semua) dekat dengan konten yang bergantung pada kelas-kelas itu, saya menyimpulkan bahwa kuda itu keluar dari gudang.
Lihatlah sumber halaman dari cnn.com, nytimes.com, huffingtonpost.com, koran kota besar terdekat, dll. Semuanya melakukannya.
Jika ada alasan bagus untuk menempatkan bagian <style> tambahan di suatu tempat di badan - misalnya jika Anda menyertakan () elemen halaman yang beragam dan independen secara waktu nyata dan masing-masing memiliki <style> yang disematkan sendiri, dan organisasi akan menjadi lebih bersih, lebih modular, lebih mudah dimengerti, dan lebih dapat dipelihara - saya katakan cukup gigit saja. Tentu akan lebih baik jika kita dapat memiliki gaya "lokal" dengan cakupan terbatas, seperti variabel lokal, tetapi Anda bekerja dengan HTML yang Anda miliki, bukan HTML yang Anda inginkan atau ingin miliki di lain waktu.
Tentu saja ada kelemahan potensial dan alasan yang baik (jika tidak selalu memaksa) untuk mengikuti ortodoksi, seperti yang telah dijelaskan orang lain. Tetapi bagi saya itu terlihat lebih dan lebih seperti penggunaan <style> secara bijaksana dalam <body> telah menjadi arus utama.
sumber
Tidak HTML yang valid, lagi pula hampir semua browser tampaknya hanya mempertimbangkan contoh kedua.
Diuji di bawah FF dan Google Chrome versi terakhir di bawah Fedora, dan FF, Opera, IE, dan Chrome di bawah XP.
sumber
Saya kira ini akan bervariasi dari peramban ke peramban: Aturan tampilan global mungkin akan diperbarui saat peramban menelusuri kode.
Anda dapat melihat perubahan seperti itu dalam aturan tampilan global kadang-kadang ketika lembar gaya eksternal dimuat dengan penundaan. Sesuatu yang serupa mungkin terjadi di sini tetapi dalam suksesi singkat sehingga tidak benar-benar diterjemahkan.
Lagipula itu bukan HTML yang valid, jadi saya akan mengatakan itu adalah hal yang sia-sia untuk dipikirkan.
<style>
tag termasuk dihead
bagian halaman.sumber
Seperti yang dikatakan orang lain, ini bukan html yang valid karena tag gaya ada di kepala.
Namun, sebagian besar browser tidak benar-benar menerapkan validasi itu. Sebagai gantinya, setelah dokumen dimuat maka gaya digabungkan dan diterapkan. Dalam hal ini set gaya kedua akan selalu menimpa yang pertama karena mereka adalah definisi terakhir yang ditemui.
sumber
The
<style>
tag termasuk dalam<head>
bagian, terpisah dari semua konten.Referensi: Spesifikasi W3C dan W3Schools
sumber
Dalam contoh Anda, browser tidak "seharusnya" melakukan apa pun. HTML tidak valid. Pemulihan kesalahan dipicu, atau pengurai membuatnya seperti itu akan terjadi.
Dalam contoh yang valid, beberapa stylesheet diperlakukan hanya muncul satu demi satu, kaskade dihitung sebagai normal.
sumber
Saya kira ini mungkin masalah tentang konteks terbatas, mis. Editor WYIWYG pada sistem web yang digunakan oleh pengguna yang bukan pemrogram , yang membatasi kemungkinan mengikuti standar. Terkadang (seperti TinyMCE), itu adalah lib yang menempatkan konten / kode Anda di dalam
textarea
tag, yang diberikan oleh editor sebagaidiv
tag besar . Dan kadang-kadang, itu mungkin versi lama dari editor ini.Saya kira itu:
stylesheets
. Sebenarnya, itu tidak praktis untuk admin (atau webdevs), mengingat jumlah permintaan yang mereka inginkan.Dalam beberapa kasus, tanpa
style
aturan penggunaan , ini mungkin merupakan pengalaman desain yang sangat buruk. Jadi, ya, pengguna ini perlu penyesuaian. Oke, tapi apa solusinya, dalam skenario ini? Mempertimbangkan berbagai cara untuk menyisipkan CSS dalam sebuahhtml
halaman, saya kira solusi ini:Opsi 1: tanyakan sysadm Anda
Mintalah kepada admin sistem Anda untuk memasukkan beberapa aturan CSS di sistem
stylesheets
. Ini akan menjadi solusi CSS eksternal atau internal . Seperti yang sudah dikatakan, itu tidak mungkin.Opsi 2:
<link>
aktif<body>
Gunakan style sheet eksternal pada
body
tag, yaitu penggunaanlink
tag di dalam area yang Anda akses (yaitu di situs, di dalambody
tag, dan bukan dihead
tag). Beberapa sumber mengatakan ini baik-baik saja, tetapi "bukan praktik yang baik", seperti MDN :Beberapa yang lain, membatasi ke
<head>
bagian, seperti w3sekolah :Pengujian
Saya mengujinya di sini (lingkungan desktop, pada browser) dan itu berfungsi untuk saya. Buat file
foo.html
:Dan kemudian file CSS, pada direktori yang sama, disebut
bar.css
:Nah, ini hanya akan terlihat mungkin jika Anda memiliki cara mengunggah file CSS di suatu tempat di sistem institusi. Mungkin ini masalahnya.
Pilihan 3:
<style>
aktif<body>
Gunakan lembar gaya internet pada
body
tag, yaitu, penggunaanstyle
tag di dalam area yang Anda akses (yaitu, di situs, di dalambody
tag, dan bukan dihead
tag). Inilah yang menjadi jawaban Charles Salvia dan Sz di sini. Memilih opsi ini, pertimbangkan kekhawatiran mereka.Opsi 4, 5 dan 6: Cara JS
Peringatan Ini terkait dengan memodifikasi
<head>
elemen halaman. Mungkin ini tidak akan terjadi akan diizinkan oleh administrator sistem institusi. Jadi, disarankan untuk meminta izin terlebih dahulu kepada mereka.Oke, seandainya izin diberikan, strateginya adalah mengakses
<head>
. Bagaimana? Metode JavaScript.Opsi ke-4:
<link>
aktif baru<head>
Ini adalah versi lain dari opsi ke-2. Gunakan style sheet eksternal pada
<head>
tag, yaitu penggunaan<link>
elemen di luar area yang Anda akses (yaitu, di situs, bukan di dalambody
tag dan ya di dalamhead
tag). Solusi ini sesuai dengan rekomendasi MDN dan w3sekolah , sebagaimana dikutip di atas, pada solusi opsi ke-2.Link
Objek baru akan dibuat.Untuk mengatasi masalah ini melalui JS, ada banyak cara tetapi pada kode berikut saya menunjukkan satu cara sederhana.
Pengujian
Saya mengujinya di sini (lingkungan desktop, pada browser) dan itu berfungsi untuk saya. Buat file
f.html
:Di dalam
script
tag:Dan kemudian pada file CSS, pada direktori yang sama, dipanggil
bar.css
(seperti pada opsi ke-2):Seperti yang sudah saya katakan: ini hanya akan terlihat mungkin jika Anda memiliki cara mengunggah file CSS di suatu tempat di sistem institusi.
Opsi ke-5: baru
<style>
aktif<head>
Gunakan style sheet internal baru pada
<head>
tag, yaitu, penggunaan<style>
elemen baru di luar area yang Anda akses (yaitu, di situs, tidak di dalambody
tag dan ya di dalamhead
tag). BaruStyle
Objek akan dibuat.Ini diselesaikan melalui JS. Satu cara sederhana ditunjukkan berikut ini.
Pengujian
Saya mengujinya di sini (lingkungan desktop, pada browser) dan itu berfungsi untuk saya. Buat file
foobar.html
:Di dalam
script
tag:Opsi 6: menggunakan yang ada
<style>
pada<head>
Gunakan lembar gaya internal yang ada pada
<head>
tag, yaitu penggunaan<style>
elemen di luar area yang Anda miliki aksesnya (yaitu, di situs, tidak di dalambody
tag dan ya di dalam taghead
tag), jika ada.Style
Objek baru akan dibuat atauCSSStyleSheet
objek akan digunakan (dalam kode solusi yang diadopsi di sini).Ini pada beberapa sudut pandang berisiko. Pertama , karena mungkin tidak ada beberapa
<style>
objek. Bergantung pada cara Anda menerapkan solusi ini, Anda mungkin akanundefined
kembali (sistem mungkin menggunakan style sheet eksternal ). Kedua , karena Anda akan mengedit karya penulis perancangan sistem (masalah kepengarangan). Ketiga , karena itu mungkin tidak diizinkan di politik keselamatan TI institusi Anda. Jadi, mintalah izin untuk melakukan ini (seperti pada solusi JS lainnya) .Seandainya, sekali lagi, izin diberikan:
Anda perlu mempertimbangkan beberapa batasan metode yang tersedia dengan cara ini:
insertRule()
. Solusi yang diajukan menggunakan skenario default, dan operasi pada awalnyastylesheet
, jika ada.Pengujian
Saya mengujinya di sini (lingkungan desktop, pada browser) dan itu berfungsi untuk saya. Buat file
foo_bar.html
:Di dalam
script
tag:Pendekatan lain untuk solusi ini menggunakan
CSSStyleDeclaration
objek (docs di w3schools dan MDN ). Tapi itu mungkin tidak menarik, mengingat risiko untuk mengesampingkan aturan yang ada pada CSS sistem.Opsi 7: CSS sebaris
Gunakan CSS sebaris . Ini menyelesaikan masalah, meskipun tergantung pada ukuran halaman (dalam baris kode), pemeliharaan (oleh penulis itu sendiri atau orang yang ditugaskan lainnya) kode bisa sangat sulit.
Tetapi tergantung pada konteks peran Anda di institusi, atau kebijakan keamanan sistem webnya, ini mungkin solusi unik yang tersedia untuk Anda.
Pengujian
Buat file
_foobar.html
:Menjawab dengan ketat pertanyaan yang diajukan oleh Gagan
(kutipan diadaptasi)
Untuk jawaban yang lebih akurat, saya sarankan Google artikel ini:
sumber
Karena ini adalah HTML yang tidak valid, tidak memiliki dampak pada hasilnya ... itu hanya berarti bahwa HTML mematuhi standar (hanya untuk tujuan organisasi). Demi menjadi valid itu bisa ditulis dengan cara ini:
Dugaan saya adalah bahwa browser menerapkan gaya terakhir yang ditemui.
sumber
Ya bisa. Saya memeriksa halaman Mozilla. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style
sumber