W jaki sposób niektóre losowe ciągi tworzą kolory po wprowadzeniu jako kolory tła w HTML? Na przykład:
<body bgcolor="chucknorris"> test </body>
... tworzy dokument z czerwonym tłem we wszystkich przeglądarkach i platformach.
Co ciekawe, choć chucknorri
tworzy również czerwone tło, chucknorr
wytwarza żółte tło.
Co tu się dzieje?
html
browser
background-color
użytkownik456584
źródło
źródło
bgcolor
. Użyj CSSbackground
.chucknorris
? Jaki był oczekiwany kolor?<body bgcolor="stevensegal">
test </body> jest zielonyOdpowiedzi:
Jest to pozostałość po czasach Netscape:
Pochodzi z postu na blogu . Trochę o parsowaniu kolorów w programie Microsoft Internet Explorer, który obejmuje go bardzo szczegółowo, w tym różne długości wartości kolorów itp.
Jeśli zastosujemy reguły kolejno od postu na blogu, otrzymamy:
Zamień wszystkie niepoprawne znaki szesnastkowe na 0
Wypełnij do następnej całkowitej liczby znaków podzielnych przez 3 (11 -> 12)
Podziel się na trzy równe grupy, przy czym każdy komponent reprezentuje odpowiadającą składową koloru koloru RGB:
Obetnij każdy argument od prawej do dwóch znaków
Co daje następujący wynik:
Oto przykład pokazujący
bgcolor
atrybut w akcji, aby stworzyć tę „niesamowitą” próbkę koloru:To także odpowiada na drugą część pytania; dlaczego
bgcolor="chucknorr"
wytwarza żółty kolor? Cóż, jeśli zastosujemy reguły, ciąg będzie:Co daje kolor jasnożółtego złota. Ponieważ ciąg zaczyna się od 9 znaków, tym razem utrzymujemy drugie C, więc kończy się na końcowej wartości koloru.
Po raz pierwszy zetknąłem się z tym, gdy ktoś wskazał, że możesz to zrobić,
color="crap"
i cóż, okazuje się, że jest brązowy.źródło
0F6
staje#00FF66
, nie#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
Możesz dodać div z innym tłem lub coś takiego, więc nie jest to tak szokujące z estetycznego punktu widzenia.bgcolor="success"
jest fajny zielony. Co ciekawe, można zastąpić te kolory za pomocą selektorów atrybutów / wartości CSS (nptd[bgcolor="chucknorris"] {...}
.).Przepraszam, że się nie zgadzam, ale zgodnie z zasadami analizy starszej wartości koloru opublikowanej przez @Yuhong Bao ,
chucknorris
NIE ZNACZY#CC0000
, ale raczej#C00000
bardzo podobny, ale nieco inny odcień czerwieni. Użyłem Firefox ColorZilla dodatek do sprawdzenia tego.Reguły stanowią:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
Mogłem użyć tych reguł, aby poprawnie zinterpretować następujące ciągi:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
AKTUALIZACJA: Oryginalni autorzy odpowiedzi, którzy twierdzili, że kolor był
#CC0000
od tego czasu, edytowali swoje odpowiedzi, aby uwzględnić poprawkę.źródło
adamlevine
działa jak na jsfiddle.net/LdyZ8/2959, ale litery są blokowane, wada00e000e
których są wstawiane, aleada00e000e00
następnie zmniejszane do typowej 6-cyfrowej wartości HEX,[ad]a0[0e]00[0e]00
co powoduje, że ad0e0e pojawia się w powyższym jsfiddle.Większość przeglądarek po prostu zignoruje wszelkie wartości NIE-szesnastkowe w łańcuchu kolorów, zastępując cyfry nieszesnastkowe zerami.
ChuCknorris
przekłada się nac00c0000000
. W tym momencie, przeglądarka będzie podzielić ciąg na trzy równe części, wskazując, Czerwony , Zielony i Niebieski wartości:c00c 0000 0000
. Dodatkowe bity w każdej sekcji zostaną zignorowane, co daje końcowy wynik#c00000
w kolorze czerwonawym.Uwaga: nie dotyczy to analizy kolorów CSS, która jest zgodna ze standardem CSS.
źródło
bgcolor
atrybutu.Przeglądarka próbuje przekonwertować
chucknorris
na kod koloru szesnastkowego, ponieważ nie jest to poprawna wartość.chucknorris
, wszystko opróczc
nie jest prawidłową wartością szesnastkową.c00c00000000
.Wydaje się, że jest to problem przede wszystkim w Internet Explorerze i Operze (12), ponieważ zarówno Chrome (31), jak i Firefox (26) po prostu to ignorują.
PS Liczby w nawiasach to wersje przeglądarek, na których testowałem.
.
Na lżejszej nucie
źródło
Powodem jest to, że przeglądarka nie może tego zrozumieć i spróbować w jakiś sposób przetłumaczyć go na to, co może zrozumieć, aw tym przypadku na wartość szesnastkową! ...
chucknorris
zaczyna się odc
rozpoznanego znaku w systemie szesnastkowym, a także konwertuje wszystkie nierozpoznane znaki na0
!Tak więc
chucknorris
w formacie szesnastkowym staje się:c00c00000000
wszystkie pozostałe znaki stają się0
ic
pozostają tam, gdzie się znajdują ...Teraz dzielą się przez 3 dla
RGB
(czerwony, zielony, niebieski) ...R: c00c, G: 0000, B:0000
...Ale wiemy, że poprawna wartość szesnastkowa dla RGB to tylko 2 znaki
R: c0, G: 00, B:00
Tak więc prawdziwy wynik to:
Dodałem również kroki na obrazku jako szybkie odniesienie dla Ciebie:
źródło
Specyfikacja WHATWG HTML ma dokładny algorytm parsowania starszej wartości koloru: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Kod Netscape Classic używany do analizowania ciągów kolorów jest open source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Na przykład zauważ, że każdy znak jest analizowany jako cyfra szesnastkowa, a następnie jest przenoszony do 32-bitowej liczby całkowitej bez sprawdzania przepełnienia . Tylko osiem cyfr szesnastkowych mieści się w 32-bitowej liczbie całkowitej, dlatego brane są pod uwagę tylko ostatnie 8 znaków. Po przetworzeniu cyfr szesnastkowych na 32-bitowe liczby całkowite są one następnie obcinane do 8-bitowych liczb całkowitych, dzieląc je przez 16, aż zmieszczą się w 8-bitowe, dlatego zera wiodące są ignorowane.
Aktualizacja: ten kod nie jest dokładnie zgodny z definicją w specyfikacji, ale jedyną różnicą jest kilka linii kodu. Myślę, że to te linie zostały dodane (w Netscape 4):
źródło
Odpowiedź:
c
jest to jedyny prawidłowy znak szesnastkowy w chucknorris , wartość zmienia się w:c00c00000000
( 0 dla wszystkich wartości, które były nieprawidłowe ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
której kolor jest ceglasto-czerwonawy.źródło
chucknorris zaczyna się na c , a przeglądarka odczytuje go do wartości szesnastkowej.
Przeglądarka konwertuje
chucknorris
do wartości szesnastkowymC00C00000000
.Następnie
C00C00000000
wartość szesnastkowa jest konwertowana do formatu RGB (podzielona przez 3):Przeglądarka potrzebuje tylko dwóch cyfr do wskazania koloru:
Na koniec pokaż
bgcolor = C00000
w przeglądarce internetowej.Oto przykład, który to pokazuje:
źródło
Te zasady przetwarzania kolorów atrybutów starszych wymaga dodatkowych czynności niż wymienione w istniejących odpowiedzi. Skrócony komponent do części dwucyfrowej jest opisany jako:
Kilka przykładów:
Poniżej znajduje się częściowa implementacja algorytmu. Nie obsługuje błędów ani przypadków, w których użytkownik wprowadza prawidłowy kolor.
Pokaż fragment kodu
źródło