为什么HTML认为“chucknorris”是一种颜色?
在HTML中作为背景颜色input时,某些随机string如何产生颜色? 例如:
<body bgcolor="chucknorris"> test </body>
…在所有浏览器和平台上生成具有红色背景的文档。
有趣的是,虽然chucknorri
产生了一个红色的背景, chucknorr
产生一个黄色的背景。
这里发生了什么?
这是Netscape时代的延续:
丢失的数字被视为0 […]。 不正确的数字被简单地解释为0.例如,值#F0F0F0,F0F0F0,F0F0F,#FxFxFx和FxFxFx都是相同的。
它来自博客文章关于微软Internet Explorer的颜色parsing的一点咆哮 ,它详细地涵盖了它,包括不同颜色值的长度等等。
如果我们从博客文章轮stream应用规则,我们得到以下内容:
-
用0replace所有非有效的hex字符
chucknorris becomes c00c0000000
-
填写下一个可以被3整除的字符总数(11 – > 12)
c00c 0000 0000
-
分成三个相等的组,每个组件代表RGB颜色的相应颜色分量:
RGB (c00c, 0000, 0000)
-
将每个参数从右到下截断为两个字符
这给出了以下结果:
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颜色代码,因为它不是一个有效的值。
- 在
chucknorris
,除c
之外的所有内容都不是有效的hex值。 - 所以它被转换为
c00c00000000
。 - 其中#c00000 ,一个红色的阴影。
Chrome浏览器(31)和火狐浏览器(26)都忽略了这一点,因此这似乎成为Internet Explorer和Opera (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值。
- 由于
c
是chucknorris中唯一有效的hex字符, 因此该值将变为:c00c00000000
( 对于所有无效的值,均为0 )。 - 浏览器然后将结果分成3个组:
Red = c00c
,Green = 0000
,Blue = 0000
。 - 由于html背景的有效hex值只包含每种颜色types( r , g , b )的两位数字,所以最后两位数字从每个组中截去,留下rgb值
c00000
,这是一种砖红色调的颜色。
相传它有:
- Chucknorris在任何地方都会留下血红色的背景,包括网站。
原因是浏览器无法理解它,并试图以某种方式将其翻译成它能够理解的东西,在这种情况下变成了hexadecimal
值!
chucknorris
以hex中被识别的字符c
开始,并且将所有无法识别的字符转换为0
!
所以hex格式c00c00000000
变成: c00c00000000
,所有其他字符变为0
, c
仍然在哪里…
现在它们被RGB
(红色,绿色,蓝色)除以3 … R: c00c, G: 0000, B:0000
…
但是我们知道RGB的有效hexadecimal
只有2个字符,意思是R: c0, G: 00, B:00
所以真正的结果是:
bgcolor="#c00000";
我也做了一个快速参考的图像中的步骤: