为什么HTML认为“chucknorris”是一种颜色?

在HTML中作为背景颜色input时,某些随机string如何产生颜色? 例如:

<body bgcolor="chucknorris"> test </body> 

…在所有浏览器和平台上生成具有红色背景的文档。

有趣的是,虽然chucknorri产生了一个红色的背景, chucknorr产生一个黄色的背景。

这里发生了什么?

这是Netscape时代的延续:

丢失的数字被视为0 […]。 不正确的数字被简单地解释为0.例如,值#F0F0F0,F0F0F0,F0F0F,#FxFxFx和FxFxFx都是相同的。

它来自博客文章关于微软Internet Explorer的颜色parsing的一点咆哮 ,它详细地涵盖了它,包括不同颜色值的长度等等。

如果我们从博客文章轮stream应用规则,我们得到以下内容:

  1. 用0replace所有非有效的hex字符

     chucknorris becomes c00c0000000 
  2. 填写下一个可以被3整除的字符总数(11 – > 12)

     c00c 0000 0000 
  3. 分成三个相等的组,每个组件代表RGB颜色的相应颜色分量:

     RGB (c00c, 0000, 0000) 
  4. 将每个参数从右到下截断为两个字符

这给出了以下结果:

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

下面是一个演示bgcolor属性的例子,用来生成这个“惊人的”颜色样本:

 <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> 

我很抱歉不同意,但根据@Yuhong Bao发布的遗留颜色值的parsing规则, chucknorris并不等同于#CC0000 ,而是等同于#C00000 ,这是一个非常相似但略有不同的红色。 我使用Firefox ColorZilla插件来validation这一点。

规则说明:

  • 通过添加0来使string长度为3的倍数: chucknorris0
  • 将string分成3个等长的string: chuc knor ris0
  • 将每个string截断为2个字符: ch kn ri
  • 保持hex值,并在必要时加上0: C0 00 00

我能够使用这些规则来正确解释下列string:

  • LuckyCharms
  • Luck
  • LuckBeALady
  • LuckBeALadyTonight
  • GangnamStyle

更新: 谁说这个颜色是#CC0000的原始回答者已经编辑他们的答案,包括更正。

大多数浏览器将简单地忽略颜色string中的任何非hex值,用hex数字replace非hex数字。

ChuCknorris翻译为c00c0000000 。 此时,浏览器将string分成三个相等的部分,表示红色绿色蓝色值: c00c 0000 0000 。 在每个部分的额外位将被忽略,这使最终的结果#c00000这是一个微红的颜色。

请注意,这不适用于遵循CSS标准的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> 

浏览器试图将chucknorris转换为hex颜色代码,因为它不是一个有效的值。

  1. chucknorris ,除c之外的所有内容都不是有效的hex值。
  2. 所以它被转换为c00c00000000
  3. 其中#c00000 ,一个红色的阴影。

Chrome浏览器(31)和火狐浏览器(26)都忽略了这一点,因此这似乎成为Internet ExplorerOpera (12)的主要问题。

PS括号中的数字是我testing的浏览器版本。

在一个更轻的笔记

Chuck Norris不符合networking标准。 Web标准符合他的要求。 #BADA55

WHATWG HTML规范具有parsing遗留颜色值的确切algorithm: https : //html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value

用于parsing颜色string的代码Netscape Classic是开源的: https : //dxr.mozilla.org/classic/source/lib/layout/layimage.c#155

例如,请注意,每个字符都被parsing为一个hex数字,然后被移入一个32位整数而不检查溢出 。 只有八个hex数字符合32位整数,这就是为什么只考虑最后8个字符的原因。 在将hex数字parsing为32位整数后,将它们除以16直到它们适合8位,然后将其截断为8位整数,这就是为什么前导零被忽略。

更新:这个代码并不完全符合规范中定义的内容,但唯一的区别是有几行代码。 我认为这是添加了这些线(在Netscape 4中):

 if (bytes_per_val > 4) { bytes_per_val = 4; } 

回答:

  • 浏览器将尝试将chucknorris转换为hex值。
  • 由于cchucknorris中唯一有效的hex字符, 因此该值将变为: c00c00000000对于所有无效的值,均为0 )。
  • 浏览器然后将结果分成3个组: Red = c00cGreen = 0000Blue = 0000
  • 由于html背景的有效hex值只包含每种颜色types( rgb )的两位数字,所以最后两位数字从每个组中截去,留下rgb值c00000 ,这是一种砖红色调的颜色。

相传它有:

  • Chucknorris在任何地方都会留下血红色的背景,包括网站。

原因是浏览器无法理解它,并试图以某种方式将其翻译成它能够理解的东西,在这种情况下变成了hexadecimal值!

chucknorris以hex中被识别的字符c开始,并且将所有无法识别的字符转换为0

所以hex格式c00c00000000变成: c00c00000000 ,所有其他字符变为0c仍然在哪里…

现在它们被RGB (红色,绿色,蓝色)除以3 … R: c00c, G: 0000, B:0000

但是我们知道RGB的有效hexadecimal只有2个字符,意思是R: c0, G: 00, B:00

所以真正的结果是:

 bgcolor="#c00000"; 

我也做了一个快速参考的图像中的步骤:

为什么HTML认为“chucknorris”是一种颜色?