¿Cómo es que ciertas cadenas aleatorias producen colores cuando se ingresan como colores de fondo en HTML? Por ejemplo:
<body bgcolor="chucknorris"> test </body>
... produce un documento con un fondo rojo en todos los navegadores y plataformas.
Curiosamente, aunque chucknorri
produce un fondo rojo también, chucknorr
produce un fondo amarillo.
¿Que está pasando aqui?
html
browser
background-color
usuario456584
fuente
fuente
bgcolor
. Utiliza CSSbackground
.chucknorris
? ¿Cuál fue el color esperado?<body bgcolor="stevensegal">
prueba </body> es verdeRespuestas:
Es un remanente de los días de Netscape:
Es de la publicación del blog Un pequeño comentario sobre el análisis de color de Microsoft Internet Explorer que lo cubre con gran detalle, incluyendo diferentes longitudes de valores de color, etc.
Si aplicamos las reglas a su vez desde la publicación del blog, obtenemos lo siguiente:
Reemplace todos los caracteres hexadecimales no válidos con ceros
Llegue al siguiente número total de caracteres divisibles por 3 (11 -> 12)
Divídase en tres grupos iguales, con cada componente representando el componente de color correspondiente de un color RGB:
Trunca cada uno de los argumentos de la derecha a dos caracteres.
Lo que da el siguiente resultado:
Aquí hay un ejemplo que demuestra el
bgcolor
atributo en acción, para producir esta muestra de color "sorprendente":Esto también responde a la otra parte de la pregunta; ¿Por qué
bgcolor="chucknorr"
produce un color amarillo? Bueno, si aplicamos las reglas, la cadena es:Lo que da un color dorado amarillo claro. A medida que la cadena comienza como 9 caracteres, mantenemos la segunda C esta vez, por lo tanto, termina en el valor de color final.
Originalmente me encontré con esto cuando alguien señaló que podías hacerlo
color="crap"
y, bueno, sale marrón.fuente
0F6
convierte en#00FF66
, no#000F06
.<body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>
podría agregar un div con otro fondo o algo así, por lo que no es tan estéticamente impactante.bgcolor="success"
es un bonito verde. Curiosamente, uno puede anular estos colores utilizando los selectores de atributos / valores CSS (por ejemplo,td[bgcolor="chucknorris"] {...}
).Lo siento no estar de acuerdo, pero de acuerdo con las reglas para analizar un valor de color legado Publicado por @Yuhong Bao ,
chucknorris
no equivalen a#CC0000
, sino más bien#C00000
, una tonalidad muy similar pero ligeramente diferente de rojo. He utilizado el complemento de Firefox ColorZilla para verificar esto.Las reglas establecen:
chucknorris0
chuc knor ris0
ch kn ri
C0 00 00
Pude usar estas reglas para interpretar correctamente las siguientes cadenas:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
GangnamStyle
ACTUALIZACIÓN: Los respondedores originales que dijeron que el color era
#CC0000
desde entonces han editado sus respuestas para incluir la corrección.fuente
adamlevine
funciona según jsfiddle.net/LdyZ8/2959 pero las letras se bloquean en lasada00e000e
que se rellenaada00e000e00
pero luego se reduce al valor típico de 6 dígitos HEX de[ad]a0[0e]00[0e]00
hacer así ad0e0e que aparece en el jsfiddle anterior.La mayoría de los navegadores simplemente ignorarán los valores NO hexadecimales en su cadena de color, sustituyendo los dígitos no hexadecimales con ceros.
ChuCknorris
se traduce enc00c0000000
. En este punto, el navegador va a dividir la cadena en tres secciones iguales, lo que indica Rojo , Verde y Azul valores:c00c 0000 0000
. Los bits adicionales en cada sección serán ignorados, lo que hace que el resultado final#c00000
sea de color rojizo.Tenga en cuenta que esto no se aplica al análisis de color CSS, que sigue el estándar CSS.
fuente
bgcolor
atributo en desuso .El navegador está intentando convertir
chucknorris
en código de color hexadecimal, porque no es un valor válido.chucknorris
todo, exceptoc
no es un valor hexadecimal válido.c00c00000000
.Esto parece ser un problema principalmente con Internet Explorer y Opera (12) ya que Chrome (31) y Firefox (26) simplemente ignoran esto.
PD Los números entre paréntesis son las versiones de navegador que probé.
.
En una nota más ligera
fuente
¡La razón es que el navegador no puede entenderlo e intenta traducirlo de alguna manera a lo que puede entender y, en este caso, a un valor hexadecimal! ...
chucknorris
comienza conc
el carácter reconocido en hexadecimal, también convierte todos los caracteres no reconocidos en0
!Entonces,
chucknorris
en formato hexadecimal se convierte en:c00c00000000
todos los demás caracteres se vuelven0
yc
permanecen donde están ...Ahora se dividen entre 3 para
RGB
(rojo, verde, azul) ...R: c00c, G: 0000, B:0000
...Pero sabemos que el hexadecimal válido para RGB es de solo 2 caracteres, significa
R: c0, G: 00, B:00
Entonces el resultado real es:
También agregué los pasos en la imagen como referencia rápida para usted:
fuente
La especificación HTML WHATWG tiene el algoritmo exacto para analizar un valor de color heredado: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
El código Netscape Classic utilizado para analizar cadenas de color es de código abierto: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Por ejemplo, observe que cada carácter se analiza como un dígito hexadecimal y luego se cambia a un entero de 32 bits sin verificar el desbordamiento . Solo ocho dígitos hexadecimales caben en un entero de 32 bits, por lo que solo se consideran los últimos 8 caracteres. Después de analizar los dígitos hexadecimales en enteros de 32 bits, se truncan en enteros de 8 bits dividiéndolos por 16 hasta que quepan en 8 bits, razón por la cual se ignoran los ceros iniciales.
Actualización: este código no coincide exactamente con lo que se define en la especificación, pero la única diferencia es que hay algunas líneas de código. Creo que se agregaron estas líneas (en Netscape 4):
fuente
Responder:
c
es el único carácter hexadecimal válido en chucknorris , el valor se convierte en:c00c00000000
( 0 para todos los valores que no eran válidos ).Red = c00c
,Green = 0000
,Blue = 0000
.c00000
cuyo color es un tono rojizo ladrillo.fuente
chucknorris comienza con c , y el navegador lo lee en un valor hexadecimal.
El navegador se convierte
chucknorris
en un valor hexadecimal,C00C00000000
.Luego, el
C00C00000000
valor hexadecimal se convierte al formato RGB (dividido entre 3):El navegador solo necesita dos dígitos para indicar el color:
Por último, mostrar
bgcolor = C00000
en el navegador web.Aquí hay un ejemplo que lo demuestra:
fuente
Las reglas para analizar colores en atributos heredados implica pasos adicionales a los mencionados en las respuestas existentes. El componente truncado a la parte de 2 dígitos se describe como:
Algunos ejemplos:
A continuación se muestra una implementación parcial del algoritmo. No maneja errores o casos en los que el usuario ingresa un color válido.
Mostrar fragmento de código
fuente