Hvorfor tror HTML at "chucknorris" er en farge?
Hvorfor produserer visse tilfeldige strenger farger når de legges inn som bakgrunnsfarger i HTML? For eksempel
<body bgcolor="chucknorris"> test </body>
...produserer et dokument med rød bakgrunn på tvers av alle nettlesere og plattformer.
Interessant nok produserer chucknorri
også en rød bakgrunn, mens chucknorr
produserer en gul bakgrunn.
Hva er det som skjer her?
7242
3
Det er en etterlevning fra Netscape-tiden:
Det er fra blogginnlegget A little rant about Microsoft Internet Explorer&# 39s color parsing som dekker det i detalj, inkludert varierende lengder på fargeverdier osv.
Hvis vi bruker reglene etter tur fra blogginnlegget, får vi følgende:
Erstatt alle ikke-gyldige heksadesimale tegn med 0' s
Fyll ut til neste totale antall tegn som er delelig med 3 (11 - > 12)
Deles inn i tre like store grupper, der hver komponent representerer den tilsvarende fargekomponenten i en RGB-farge:
Avkort hvert av argumentene fra høyre ned til to tegn.
Som gir følgende resultat:
Her er et eksempel som demonstrerer
bgcolor
-attributtet i aksjon, for å produsere denne " fantastiske " fargeprøven:Dette svarer også på den andre delen av spørsmålet; hvorfor produserer
bgcolor="chucknorr"
en gul farge? Vel, hvis vi bruker reglene, er strengen:Som gir en lys gul gullfarge. Ettersom strengen starter med 9 tegn, beholder vi den andre C-en denne gangen, slik at den ender opp i den endelige fargeverdien.
Jeg møtte opprinnelig dette da noen påpekte at du kunne gjøre `color="crap" og, vel, det kommer ut brunt.
De fleste nettlesere vil ganske enkelt ignorere alle IKKE-hex-verdier i fargestrengen din, og erstatte ikke-hex-sifre med nuller.
ChuCknorris
oversettes tilc00c0000000
. På dette tidspunktet vil nettleseren dele strengen inn i tre like deler, som angir verdiene Rød, Grønn og Blå:c00c 0000 0000
. Ekstra biter i hver seksjon vil bli ignorert, slik at sluttresultatet blir#c00000
, som er en rødlig farge.Merk at dette ikke gjelder for CSS-fargeanalyse, som følger CSS-standarden.
WHATWG HTML-spesifikasjonen har den nøyaktige algoritmen for å analysere en eldre fargeverdi: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Netscape Classic-koden som brukes til å analysere fargestrenger, er åpen kildekode: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Legg for eksempel merke til at hvert tegn analyseres som et heksesiffer og deretter flyttes til et 32-bits heltall uten å sjekke for overløp. Bare åtte heksesifre får plass i et 32-bits heltall, og det er derfor bare de siste 8 tegnene som tas i betraktning. Etter å ha analysert heksesifrene til 32-bits heltall, blir de deretter trunkert til 8-bits heltall ved å dele dem på 16 til de passer inn i 8-bits, noe som er grunnen til at foranstilte nuller ignoreres.
Oppdatering: denne koden samsvarer ikke nøyaktig med det som er definert i spesifikasjonen, men den eneste forskjellen er noen få linjer med kode. Jeg tror det er disse linjene som ble lagt til (i Netscape 4):