Como certas seqüências aleatórias produzem cores quando inseridas como cores de segundo plano em HTML? Por exemplo:
<body bgcolor="chucknorris"> test </body>
... produz um documento com um fundo vermelho em todos os navegadores e plataformas.
Curiosamente, enquanto chucknorri
produz um fundo vermelho, chucknorr
produz um fundo amarelo.
O que está acontecendo aqui?
html
browser
background-color
user456584
fonte
fonte
bgcolor
. Use CSSbackground
.chucknorris
? Qual era a cor esperada?<body bgcolor="stevensegal">
teste </body> é verdeRespostas:
É uma ressaca dos dias do Netscape:
É da postagem do blog Um pouco sobre a análise de cores do Microsoft Internet Explorer, que o aborda com muitos detalhes, incluindo comprimentos variados de valores de cores, etc.
Se aplicarmos as regras à vez na postagem do blog, obteremos o seguinte:
Substitua todos os caracteres hexadecimais não válidos pelos zeros
Coloque o próximo número total de caracteres divisíveis por 3 (11 -> 12)
Divida em três grupos iguais, com cada componente representando o componente de cor correspondente de uma cor RGB:
Truncar cada um dos argumentos da direita para baixo para dois caracteres
O que fornece o seguinte resultado:
Aqui está um exemplo demonstrando o
bgcolor
atributo em ação, para produzir essa amostra de cores "incrível":Isso também responde à outra parte da pergunta; por que
bgcolor="chucknorr"
produz uma cor amarela? Bem, se aplicarmos as regras, a string será:O que dá uma cor ouro amarelo claro. À medida que a string começa com 9 caracteres, mantemos o segundo C dessa vez; portanto, ele termina no valor final da cor.
Eu encontrei isso originalmente quando alguém apontou que você poderia fazer
color="crap"
e, bem, sai marrom.fonte
0F6
torna-se#00FF66
, não#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
Você pode adicionar uma div com outro fundo ou algo parecido, para que não seja tão esteticamente chocante.bgcolor="success"
é um verde agradável. Curiosamente, é possível substituir essas cores usando seletores de atributo / valor CSS (por exemplo,td[bgcolor="chucknorris"] {...}
).Lamento discordar, mas de acordo com as regras para analisar um valor de cor herdado postado por @Yuhong Bao ,
chucknorris
NÃO equivale a#CC0000
, mas sim#C00000
, a um tom de vermelho muito semelhante, mas um pouco diferente. Usei o complemento Firefox ColorZilla para verificar isso.As regras declaram:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
Consegui usar essas regras para interpretar corretamente as seguintes seqüências de caracteres:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
ATUALIZAÇÃO: Os respondentes originais que disseram que a cor era
#CC0000
editaram suas respostas para incluir a correção.fonte
adamlevine
funciona de acordo com jsfiddle.net/LdyZ8/2959, mas as letras são bloqueadas nasada00e000e
quais é preenchida,ada00e000e00
mas depois reduzida ao valor típico de seis dígitos HEX[ad]a0[0e]00[0e]00
, tornando ad0e0e que aparece no jsfiddle acima.A maioria dos navegadores simplesmente ignora qualquer valor não hexadecimal na seqüência de cores, substituindo dígitos não hexadecimais por zeros.
ChuCknorris
traduz parac00c0000000
. Neste ponto, o navegador irá dividir a string em três partes iguais, indicando Vermelho , Verde e Azul valores:c00c 0000 0000
. Bits extras em cada seção serão ignorados, o que faz com que o resultado final#c00000
seja de uma cor avermelhada.Observe que isso não se aplica à análise de cores CSS, que segue o padrão CSS.
fonte
bgcolor
atributo obsoleto .O navegador está tentando converter
chucknorris
em código de cor hexadecimal, porque não é um valor válido.chucknorris
, tudo, excetoc
não é um valor hexadecimal válido.c00c00000000
.Esse parece ser um problema principalmente no Internet Explorer e Opera (12), pois o Chrome (31) e o Firefox (26) simplesmente ignoram isso.
PS Os números entre parênteses são as versões do navegador em que testei.
.
Em uma nota mais clara
fonte
O motivo é que o navegador não consegue entendê- lo e tenta traduzi-lo de alguma forma para o que ele pode entender e, neste caso, em um valor hexadecimal! ...
chucknorris
começa com oc
qual é reconhecido caractere em hexadecimal, também está convertendo todos os caracteres não reconhecidos em0
!Assim,
chucknorris
no formato hexadecimal torna-se:,c00c00000000
todos os outros caracteres se tornam0
ec
permanecem onde estão ...Agora eles são divididos por 3 para
RGB
(vermelho, verde, azul) ...R: c00c, G: 0000, B:0000
...Mas sabemos que o hexadecimal válido para RGB é de apenas 2 caracteres, significa
R: c0, G: 00, B:00
Portanto, o resultado real é:
Também adicionei as etapas na imagem como uma referência rápida para você:
fonte
A especificação HTML do WHATWG possui o algoritmo exato para analisar um valor de cor herdado: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
O código que o Netscape Classic usado para analisar seqüências de cores é de código aberto: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Por exemplo, observe que cada caractere é analisado como um dígito hexadecimal e, em seguida, é deslocado para um número inteiro de 32 bits sem verificar o estouro . Apenas oito dígitos hexadecimais cabem em um número inteiro de 32 bits, e é por isso que apenas os últimos 8 caracteres são considerados. Depois de analisar os dígitos hexadecimais em números inteiros de 32 bits, eles são truncados em números inteiros de 8 bits, dividindo-os por 16 até que se encaixem em 8 bits, e é por isso que os zeros à esquerda são ignorados.
Atualização: esse código não corresponde exatamente ao definido na especificação, mas a única diferença é que existem algumas linhas de código. Eu acho que foram essas linhas que foram adicionadas (no Netscape 4):
fonte
Responda:
c
é o único caractere hexadecimal válido em chucknorris , o valor se transforma em:c00c00000000
( 0 para todos os valores inválidos ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
uma cor de tom avermelhado.fonte
chucknorris começa com c , e o navegador lê em um valor hexadecimal.
O navegador é convertido
chucknorris
em um valor hexadecimal,C00C00000000
,.Em seguida, o
C00C00000000
valor hexadecimal é convertido para o formato RGB (dividido por 3):O navegador precisa de apenas dois dígitos para indicar a cor:
Por fim, mostre
bgcolor = C00000
no navegador da web.Aqui está um exemplo de demonstração:
fonte
As regras para analisar cores em atributos herdados envolvem etapas adicionais além das mencionadas nas respostas existentes. O componente truncado para a parte de 2 dígitos é descrito como:
Alguns exemplos:
Abaixo está uma implementação parcial do algoritmo. Ele não trata de erros ou casos em que o usuário insere uma cor válida.
Mostrar snippet de código
fonte