Wie kommt es, dass bestimmte zufällige Zeichenfolgen Farben erzeugen, wenn sie in HTML als Hintergrundfarben eingegeben werden? Zum Beispiel:
<body bgcolor="chucknorris"> test </body>
... erstellt ein Dokument mit rotem Hintergrund für alle Browser und Plattformen.
Interessanterweise wird zwar auch chucknorri
ein roter Hintergrund chucknorr
erzeugt, aber ein gelber Hintergrund.
Was ist denn hier los?
html
browser
background-color
user456584
quelle
quelle
bgcolor
. Verwenden Sie CSSbackground
.chucknorris
? Was war die erwartete Farbe?<body bgcolor="stevensegal">
Test </ body> ist grünAntworten:
Es ist ein Überbleibsel aus den Netscape-Tagen:
Es ist aus dem Blog-Beitrag. Ein wenig über die Farbanalyse von Microsoft Internet Explorer, die es ausführlich behandelt, einschließlich unterschiedlicher Längen von Farbwerten usw.
Wenn wir die Regeln der Reihe nach aus dem Blog-Beitrag anwenden, erhalten wir Folgendes:
Ersetzen Sie alle nicht gültigen hexadezimalen Zeichen durch Nullen
Füllen Sie die nächste Gesamtzahl der durch 3 teilbaren Zeichen aus (11 -> 12).
In drei gleiche Gruppen aufgeteilt, wobei jede Komponente die entsprechende Farbkomponente einer RGB-Farbe darstellt:
Schneiden Sie jedes der Argumente von rechts auf zwei Zeichen ab
Welches ergibt das folgende Ergebnis:
Hier ist ein Beispiel, das das
bgcolor
Attribut in Aktion demonstriert , um dieses "erstaunliche" Farbfeld zu erzeugen:Dies beantwortet auch den anderen Teil der Frage; Warum entsteht
bgcolor="chucknorr"
eine gelbe Farbe? Wenn wir die Regeln anwenden, lautet die Zeichenfolge:Das ergibt eine hellgelbe Goldfarbe. Da die Zeichenfolge mit 9 Zeichen beginnt, behalten wir diesmal das zweite C bei, sodass es im endgültigen Farbwert endet.
Ich bin ursprünglich darauf gestoßen, als jemand darauf hingewiesen hat, dass Sie es tun könnten,
color="crap"
und nun, es kommt braun heraus.quelle
0F6
wird#00FF66
, nicht#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
Sie könnten ein Div mit einem anderen Hintergrund oder ähnlichem hinzufügen, so dass es nicht so ästhetisch schockierend ist.bgcolor="success"
ist auch ein schönes Grün. Interessanterweise kann man diese Farben mit CSS-Attribut- / Werteselektoren (ztd[bgcolor="chucknorris"] {...}
. B. ) überschreiben .Es tut mir leid, dass ich nicht einverstanden bin, aber gemäß den Regeln für das Parsen eines von @Yuhong Bao veröffentlichten Legacy-Farbwerts entspricht
chucknorris
dies NICHT einem sehr ähnlichen, aber etwas anderen Rotton#CC0000
, sondern#C00000
einem sehr ähnlichen. Ich habe das Firefox ColorZilla-Add-On verwendet , um dies zu überprüfen.Die Regeln besagen:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
Ich konnte diese Regeln verwenden, um die folgenden Zeichenfolgen richtig zu interpretieren:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
UPDATE: Die ursprünglichen Antwortenden, die sagten, die Farbe sei,
#CC0000
haben ihre Antworten seitdem so bearbeitet, dass sie die Korrektur enthalten.quelle
adamlevine
funktioniert gemäß jsfiddle.net/LdyZ8/2959, aber die Buchstaben sind blockiert, inada00e000e
die aufgefüllt,ada00e000e00
aber dann auf den typischen 6-stelligen HEX-Wert reduziert wird,[ad]a0[0e]00[0e]00
um ad0e0e zu erstellen, der in der obigen jsfiddle erscheint.Die meisten Browser ignorieren einfach alle NICHT-Hex-Werte in Ihrer Farbzeichenfolge und ersetzen Nicht-Hex-Ziffern durch Nullen.
ChuCknorris
übersetzt inc00c0000000
. Zu diesem Zeitpunkt teilt der Browser die Zeichenfolge in drei gleiche Abschnitte auf Werte Rot , Grün und Blau :c00c 0000 0000
. Zusätzliche Bits in jedem Abschnitt werden ignoriert, wodurch das Endergebnis#c00000
eine rötliche Farbe erhält.Beachten Sie, dass dies nicht für die CSS-Farbanalyse gilt, die dem CSS-Standard folgt.
quelle
bgcolor
Attribut.Der Browser versucht zu konvertieren
chucknorris
in Hex-Farbcode , da dies kein gültiger Wert ist.chucknorris
, alles außerc
kein gültiger Hex-Wert.c00c00000000
.Dies scheint vor allem bei Internet Explorer und Opera ein Problem zu sein (12) da sowohl Chrome (31) als auch Firefox (26) dies einfach ignorieren.
PS Die Zahlen in Klammern sind die Browserversionen, mit denen ich getestet habe.
.
Leichter gesagt
quelle
Der Grund ist, dass der Browser es nicht verstehen kann und versucht, es irgendwie in das zu übersetzen, was er verstehen kann, und in diesem Fall in einen hexadezimalen Wert! ...
chucknorris
Beginnt damit,c
welches Zeichen hexadezimal erkannt wird, und konvertiert auch alle nicht erkannten Zeichen in0
!So
chucknorris
hexadezimal wird:c00c00000000
, alle anderen Zeichen werden0
undc
bleibt , wo sie sind ...Jetzt werden sie durch 3 geteilt für
RGB
(rot, grün, blau) ...R: c00c, G: 0000, B:0000
...Wir wissen jedoch, dass eine gültige Hexadezimalzahl für RGB nur 2 Zeichen beträgt
R: c0, G: 00, B:00
Das eigentliche Ergebnis ist also:
Ich habe auch die Schritte im Bild als Kurzreferenz für Sie hinzugefügt:
quelle
Die WHATWG-HTML-Spezifikation enthält den genauen Algorithmus zum Parsen eines alten Farbwerts: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Der zum Parsen von Farbzeichenfolgen verwendete Code Netscape Classic ist Open Source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Beachten Sie beispielsweise, dass jedes Zeichen als Hex-Ziffer analysiert und dann in eine 32-Bit-Ganzzahl verschoben wird, ohne auf Überlauf zu prüfen . Nur acht hexadezimale Ziffern passen in eine 32-Bit-Ganzzahl, weshalb nur die letzten 8 Zeichen berücksichtigt werden. Nach dem Parsen der Hex-Ziffern in 32-Bit-Ganzzahlen werden sie in 8-Bit-Ganzzahlen abgeschnitten, indem sie durch 16 geteilt werden, bis sie in 8-Bit passen, weshalb führende Nullen ignoriert werden.
Update: Dieser Code stimmt nicht genau mit dem überein, was in der Spezifikation definiert ist, aber der einzige Unterschied besteht in einigen Codezeilen. Ich denke, es sind diese Zeilen, die hinzugefügt wurden (in Netscape 4):
quelle
Antworten:
c
das einzige gültige Hex-Zeichen in Chucknorris ist , wird der Wert zu:c00c00000000
( 0 für alle ungültigen Werte ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
eine ziegelrot getönte Farbe bleibt.quelle
chucknorris beginnt mit c und der Browser liest es in einen hexadezimalen Wert.
Der Browser konvertiert
chucknorris
in einen HexadezimalwertC00C00000000
.Dann wird der
C00C00000000
Hexadezimalwert in das RGB- Format konvertiert (geteilt durch 3):Der Browser benötigt nur zwei Ziffern, um die Farbe anzuzeigen:
Zum Schluss
bgcolor = C00000
im Webbrowser anzeigen.Hier ist ein Beispiel, das dies demonstriert:
quelle
Die Regeln zum Parsen von Farben für Legacy-Attribute umfassen zusätzliche Schritte als die in vorhandenen Antworten genannten. Die auf zwei Ziffern abgeschnittene Komponente wird wie folgt beschrieben:
Einige Beispiele:
Nachfolgend finden Sie eine teilweise Implementierung des Algorithmus. Es werden keine Fehler oder Fälle behandelt, in denen der Benutzer eine gültige Farbe eingibt.
Code-Snippet anzeigen
quelle