Kenapa string acak tertentu menghasilkan warna saat dimasukkan sebagai warna latar belakang dalam HTML? Sebagai contoh:
<body bgcolor="chucknorris"> test </body>
... menghasilkan dokumen dengan latar belakang merah di semua browser dan platform.
Menariknya, saat chucknorri
menghasilkan latar belakang merah juga, chucknorr
menghasilkan latar belakang kuning.
Apa yang terjadi di sini?
html
browser
background-color
pengguna456584
sumber
sumber
bgcolor
. Gunakan CSSbackground
.chucknorris
? Apa warna yang diharapkan?<body bgcolor="stevensegal">
tes </body> berwarna hijauJawaban:
Ini peninggalan dari hari-hari Netscape:
Ini dari posting blog. Kata-kata kasar tentang parsing warna Microsoft Internet Explorer yang mencakupnya dengan sangat rinci, termasuk berbagai panjang nilai warna, dll.
Jika kami menerapkan aturan pada gilirannya dari posting blog, kami mendapatkan yang berikut:
Ganti semua karakter heksadesimal tidak valid dengan 0's
Pad out ke jumlah total karakter berikutnya yang dapat dibagi oleh 3 (11 -> 12)
Dibagi menjadi tiga kelompok yang sama, dengan masing-masing komponen mewakili komponen warna yang sesuai dari warna RGB:
Pangkas setiap argumen dari kanan hingga dua karakter
Yang memberikan hasil sebagai berikut:
Berikut adalah contoh yang menunjukkan
bgcolor
atribut dalam aksi, untuk menghasilkan carikan warna "luar biasa" ini:Ini juga menjawab bagian lain dari pertanyaan; mengapa
bgcolor="chucknorr"
menghasilkan warna kuning? Nah, jika kita menerapkan aturan, stringnya adalah:Yang memberi warna emas kuning muda. Ketika string dimulai sebagai 9 karakter, kami menyimpan C kedua kali ini sehingga berakhir dengan nilai warna akhir.
Saya awalnya menemukan ini ketika seseorang menunjukkan Anda bisa melakukan
color="crap"
dan, yah, itu keluar cokelat.sumber
0F6
menjadi#00FF66
, tidak#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
Anda bisa menambahkan div dengan latar belakang lain atau sesuatu seperti itu, sehingga tidak terlalu mengejutkan secara estetika.bgcolor="success"
juga berwarna hijau. Menariknya, seseorang dapat mengesampingkan warna-warna ini menggunakan atribut CSS / pemilih nilai (misalnya,td[bgcolor="chucknorris"] {...}
).Saya minta maaf untuk tidak setuju, tetapi menurut aturan untuk parsing nilai warna lama yang diposting oleh @Yuhong Bao ,
chucknorris
TIDAK menyamakan#CC0000
, tetapi lebih ke#C00000
, warna merah yang sangat mirip tetapi sedikit berbeda. Saya menggunakan add-on Firefox ColorZilla untuk memverifikasi ini.Aturan menyatakan:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
Saya dapat menggunakan aturan ini untuk menafsirkan string berikut dengan benar:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
UPDATE: Penjawab asli yang mengatakan warna
#CC0000
telah diedit jawaban mereka untuk memasukkan koreksi.sumber
adamlevine
tidak bekerja sesuai jsfiddle.net/LdyZ8/2959 tetapi huruf-huruf diblokir keada00e000e
mana diisiada00e000e00
tetapi kemudian dikurangi menjadi nilai HEX 6 digit khas[ad]a0[0e]00[0e]00
sehingga membuat ad0e0e yang muncul di jsfiddle di atas.Sebagian besar browser hanya akan mengabaikan nilai-nilai NON-hex dalam string warna Anda, menggantikan angka non-hex dengan nol.
ChuCknorris
diterjemahkan menjadic00c0000000
. Pada titik ini, browser akan membagi string menjadi tiga bagian yang sama, menunjukkan Merah , Hijau dan Biru nilai-nilai:c00c 0000 0000
. Bit tambahan di setiap bagian akan diabaikan, yang membuat hasil akhir#c00000
yang merupakan warna kemerahan.Catatan, ini tidak berlaku untuk parsing warna CSS, yang mengikuti standar CSS.
sumber
bgcolor
atribut yang sudah usang .Peramban mencoba mengonversi
chucknorris
menjadi kode warna hex, karena itu bukan nilai yang valid.chucknorris
, semuanya kecualic
bukan nilai hex yang valid.c00c00000000
.Ini tampaknya menjadi masalah terutama dengan Internet Explorer dan Opera (12) karena Chrome (31) dan Firefox (26) mengabaikannya.
PS Angka dalam kurung adalah versi browser yang saya uji.
.
Pada nada yang lebih ringan
sumber
Alasannya adalah browser tidak dapat memahaminya dan mencoba menerjemahkannya entah bagaimana ke apa yang dapat dimengerti dan dalam hal ini menjadi nilai heksadesimal! ...
chucknorris
dimulai denganc
karakter yang dikenali dalam heksadesimal, juga itu mengkonversi semua karakter yang tidak dikenal menjadi0
!Jadi
chucknorris
dalam format heksadesimal menjadi:,c00c00000000
semua karakter lain menjadi0
danc
tetap berada di tempat mereka ...Sekarang mereka dibagi 3 untuk
RGB
(merah, hijau, biru) ...R: c00c, G: 0000, B:0000
...Tapi kita tahu heksadesimal yang valid untuk RGB hanya 2 karakter, artinya
R: c0, G: 00, B:00
Jadi hasil sebenarnya adalah:
Saya juga menambahkan langkah-langkah pada gambar sebagai referensi cepat untuk Anda:
sumber
WHATWG HTML spec memiliki algoritma yang tepat untuk mem-parsing nilai warna yang lama: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Kode Netscape Classic yang digunakan untuk parsing string warna adalah open source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Misalnya, perhatikan bahwa setiap karakter diuraikan sebagai digit hex dan kemudian digeser menjadi integer 32-bit tanpa memeriksa overflow . Hanya delapan digit hex yang masuk ke dalam integer 32-bit, itulah sebabnya hanya 8 karakter terakhir yang dipertimbangkan. Setelah menguraikan digit hex menjadi bilangan bulat 32-bit, mereka kemudian dipotong menjadi bilangan bulat 8-bit dengan membaginya dengan 16 sampai mereka masuk ke dalam 8-bit, itulah sebabnya nol di depan diabaikan.
Pembaruan: kode ini tidak sama persis dengan apa yang didefinisikan dalam spesifikasi, tetapi satu-satunya perbedaan ada beberapa baris kode. Saya pikir ini adalah baris-baris ini yang ditambahkan (dalam Netscape 4):
sumber
Menjawab:
c
hanya karakter hex yang valid di chucknorris , nilainya berubah menjadi:c00c00000000
( 0 untuk semua nilai yang tidak valid ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
yang merupakan warna kencang bata-kemerahan.sumber
chucknorris dimulai dengan c , dan browser membacanya menjadi nilai heksadesimal.
Browser mengonversi
chucknorris
ke nilai heksadesimalC00C00000000
,.Kemudian nilai
C00C00000000
heksadesimal dikonversi ke format RGB (dibagi 3):Browser hanya membutuhkan dua digit untuk menunjukkan warnanya:
Akhirnya, tunjukkan
bgcolor = C00000
di browser web.Berikut ini contoh yang menunjukkan:
sumber
The aturan untuk parsing warna pada atribut warisan melibatkan langkah-langkah tambahan selain yang disebut dalam jawaban yang ada. Komponen terpotong untuk bagian 2 digit dijelaskan sebagai:
Beberapa contoh:
Di bawah ini adalah implementasi sebagian dari algoritma. Itu tidak menangani kesalahan atau kasus di mana pengguna memasukkan warna yang valid.
Tampilkan cuplikan kode
sumber