fondo - style background color html




¿Por qué HTML piensa que "chucknorris" es un color? (6)

El navegador está intentando convertir chucknorris en código de color hexadecimal, porque no es un valor válido.

  1. En chucknorris , todo excepto c no es un valor hexadecimal válido.
  2. Así se convierte a c00c00000000 .
  3. Que se convierte en # c00000 , un tono de rojo.

Esto parece ser un problema principalmente con Internet Explorer y Opera (12), ya que tanto Chrome (31) como Firefox (26) simplemente ignoran esto.

PS Los números entre paréntesis son las versiones de navegador que probé.

.

En una nota más ligera

Chuck Norris no se ajusta a los estándares web. Los estándares web se ajustan a él. # BADA55

¿Por qué ciertas cadenas aleatorias producen colores cuando se introducen 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, mientras que chucknorri produce un fondo rojo también, chucknorr produce un fondo amarillo.

¿Que está pasando aqui?


Es un remanente de los días de Netscape:

Los dígitos que faltan se tratan como 0 [...]. Un dígito incorrecto simplemente se interpreta como 0. Por ejemplo, los valores # F0F0F0, F0F0F0, F0F0F, #FxFxFx y FxFxFx son todos iguales.

Es de la publicación del blog Un poco de perorata sobre el análisis de color de Microsoft Internet Explorer que lo cubre con gran detalle, incluidas las longitudes variables de los valores de color, etc.

Si aplicamos las reglas a su vez de la publicación del blog, obtenemos lo siguiente:

  1. Reemplace todos los caracteres hexadecimales no válidos con 0

    chucknorris becomes c00c0000000
    
  2. Rellena el siguiente número total de caracteres divisibles por 3 (11 -> 12)

    c00c 0000 0000
    
  3. Dividido en tres grupos iguales, con cada componente representando el componente de color correspondiente de un color RGB:

    RGB (c00c, 0000, 0000)
    
  4. Trunca cada uno de los argumentos de la derecha a dos caracteres

Lo que da el siguiente resultado:

RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)

Aquí hay un ejemplo que demuestra el atributo bgcolor en acción, para producir esta muestra de color "increíble":

<table>
  <tr>
    <td bgcolor="chucknorris" cellpadding="8" width="100" align="center">chuck norris</td>
    <td bgcolor="mrt"         cellpadding="8" width="100" align="center" style="color:#ffffff">Mr T</td>
    <td bgcolor="ninjaturtle" cellpadding="8" width="100" align="center" style="color:#ffffff">ninjaturtle</td>
  </tr>
  <tr>
    <td bgcolor="sick"  cellpadding="8" width="100" align="center">sick</td>
    <td bgcolor="crap"  cellpadding="8" width="100" align="center">crap</td>
    <td bgcolor="grass" cellpadding="8" width="100" align="center">grass</td>
  </tr>
</table>

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:

c00c00000 => c00 c00 000 => c0 c0 00 [RGB(192, 192, 0)]

Lo que le da un color dorado amarillo claro. Como la cadena comienza con 9 caracteres, mantenemos la segunda C esta vez, por lo que termina en el valor de color final.

Originalmente me encontré con esto cuando alguien me indicó que podías hacer color="crap" y, bueno, sale marrón.


La mayoría de los navegadores simplemente ignorarán los valores no hexadecimales en su cadena de color, sustituyendo los dígitos no hexadecimales por ceros.

ChuCknorris traduce a c00c0000000 . En este punto, el navegador dividirá la cadena en tres secciones iguales, indicando los valores Rojo , Verde y Azul : c00c 0000 0000 . Los bits adicionales en cada sección se ignorarán, lo que hace que el resultado final sea #c00000 que es un color rojizo.

Tenga en cuenta que esto no se aplica al análisis de color CSS, que sigue el estándar CSS.

<p><font color='chucknorris'>Redish</font></p>
<p><font color='#c00000'>Same as above</font></p>
<p><span style="color: chucknorris">Black</span></p>


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 con c que es un carácter reconocido en hexadecimal, y también convierte todos los caracteres no reconocidos en 0 .

Entonces chucknorris en formato hexadecimal se convierte en: c00c00000000 , todos los demás caracteres se convierten en 0 c permanece donde está ...

Ahora se dividen por 3 para RGB (rojo, verde, azul) ... R: c00c, G: 0000, B:0000 ...

Pero sabemos que el hexadecimal válido para RGB tiene solo 2 caracteres, significa R: c0, G: 00, B:00

Entonces el resultado real es:

bgcolor="#c00000";

También agregué los pasos en la imagen como una referencia rápida:


Las reglas para analizar colores en atributos heredados involucran pasos adicionales a los mencionados en las respuestas existentes. La parte truncada del componente a 2 dígitos se describe como:

  1. Descartar todos los personajes excepto los últimos 8
  2. Descarte los ceros iniciales uno por uno siempre que todos los componentes tengan un cero inicial
  3. Desecha todos los personajes excepto los 2 primeros.

Algunos ejemplos:

oooFoooFoooF
000F 000F 000F                <- replace, pad and chunk
0F 0F 0F                      <- leading zeros truncated
0F 0F 0F                      <- truncated to 2 characters from right

oooFooFFoFFF
000F 00FF 0FFF                <- replace, pad and chunk
00F 0FF FFF                   <- leading zeros truncated
00 0F FF                      <- truncated to 2 characters from right

ABCooooooABCooooooABCoooooo
ABC000000 ABC000000 ABC000000 <- replace, pad and chunk
BC000000 BC000000 BC000000    <- truncated to 8 characters from left
BC BC BC                      <- truncated to 2 characters from right

AoCooooooAoCooooooAoCoooooo
A0C000000 A0C000000 A0C000000 <- replace, pad and chunk
0C000000 0C000000 0C000000    <- truncated to 8 characters from left
C000000 C000000 C000000       <- leading zeros truncated
C0 C0 C0                      <- truncated to 2 characters from right

A continuación se muestra una implementación parcial del algoritmo. No maneja errores o casos donde el usuario ingresa un color válido.

function parseColor(input) {
  // todo: return error if input is ""
  input = input.trim();
  // todo: return error if input is "transparent"
  // todo: return corresponding #rrggbb if input is a named color
  // todo: return #rrggbb if input matches #rgb
  // todo: replace unicode code points greater than U+FFFF with 00
  if (input.length > 128) {
    input = input.slice(0, 128);
  }
  if (input.charAt(0) === "#") {
    input = input.slice(1);
  }
  input = input.replace(/[^0-9A-Fa-f]/g, "0");
  while (input.length === 0 || input.length % 3 > 0) {
    input += "0";
  }
  var r = input.slice(0, input.length / 3);
  var g = input.slice(input.length / 3, input.length * 2 / 3);
  var b = input.slice(input.length * 2 / 3);
  if (r.length > 8) {
    r = r.slice(-8);
    g = g.slice(-8);
    b = b.slice(-8);
  }
  while (r.length > 2 && r.charAt(0) === "0" && g.charAt(0) === "0" && b.charAt(0) === "0") {
    r = r.slice(1);
    g = g.slice(1);
    b = b.slice(1);
  }
  if (r.length > 2) {
    r = r.slice(0, 2);
    g = g.slice(0, 2);
    b = b.slice(0, 2);
  }
  return "#" + r.padStart(2, "0") + g.padStart(2, "0") + b.padStart(2, "0");
}

$(function() {
  $("#input").on("change", function() {
    var input = $(this).val();
    var color = parseColor(input);
    var $cells = $("#result tbody td");
    $cells.eq(0).attr("bgcolor", input);
    $cells.eq(1).attr("bgcolor", color);

    var color1 = $cells.eq(0).css("background-color");
    var color2 = $cells.eq(1).css("background-color");
    $cells.eq(2).empty().append("bgcolor: " + input, "<br>", "getComputedStyle: " + color1);
    $cells.eq(3).empty().append("bgcolor: " + color, "<br>", "getComputedStyle: " + color2);
  });
});
body { font: medium monospace; }
input { width: 20em; }
table { table-layout: fixed; width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<p><input id="input" placeholder="Enter color e.g. chucknorris"></p>
<table id="result">
  <thead>
    <tr>
      <th>Left Color</th>
      <th>Right Color</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
  </tbody>
</table>


Responder:

  • El navegador intentará convertir chucknorris en un valor hexadecimal.
  • Como 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 ).
  • Luego el navegador divide el resultado en 3 grupos: Red = c00c , Green = 0000 , Blue = 0000 .
  • Dado que los valores hexadecimales válidos para fondos html solo contienen 2 dígitos para cada tipo de color ( r , g , b ), los últimos 2 dígitos se truncan de cada grupo, dejando un valor rgb de c00000 que es un color de tono rojizo.




background-color