为什么某些随机字符串在以背景颜色输入 html 时会产生颜色 ?

例如, bgcolor = "chucknorris" 产生红色背景 :

& lt; body bgcolor=" Chucknorris" & gt; 测试 & lt;/body>

反之, bgcolor = "chucknorr" 产生黄色背景 :

& lt; body bgcolor=" chucknorr" & gt; 测试 & lt;/body>

这在不同的浏览器和平台上都是如此。


当前回答

在遗留属性上分解颜色的规则涉及比现有答案中提到的步骤更多的步骤。

将所有字符全部丢弃,但最后的 8 个丢弃, 导致零 零 逐 1, 只要所有构件都有一个前零 丢弃, 所有字符除前 2 个全部丢弃

一些例子:

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

下面是算法的部分实施。它不处理错误或用户输入有效颜色的情况。

{/ / todo: 如果输入是“ ” 输入 = 输入. trim (); / / todo: 如果输入是“ 透明” / / todo: 如果输入是一个命名的颜色 / / todo: 如果输入匹配 rgb / / todo, 返回 rggb: 如果输入是“ 输入 ” , 则返回错误 rggb: 如果输入是“ 透明” / / todo : 如果输入是“ 透明” / / todo: 如果输入是“ 透明” / / todo : 返回相应的 rggb: 如果输入匹配 rgb / / todo: 返回 rggb: 如果输入匹配 rggb / / todo: 将 Unicode 代码点大于 u+ffff 替换为 00 (in. replace (/ {0- 9a- f)

其他回答

大多数浏览器将简单地忽略颜色字符串中的任何非十六进制值, 以零取代非十六进制数字 。

chucknorris 翻译为 c00c00000。 在此点, 浏览器将把字符串分隔为三个等值的区块, 显示红色、 绿色和蓝色的值 : c00c0000000。 每个区块中的额外比特将被忽略, 这使得最终结果 c00000 , 即红色的颜色 。

注意,此选项不适用于 cs 颜色分解, 它符合 cs 标准 。

& lt; p&gt; & lt; gt; 的颜色= 'chucknorris' & gt; redish&lt; /font&gt;&lt; / p&gt;; & lt; p&gt; 的颜色= 'c00000'\gt; 等於 'lt; /font&gt;;; /p&gt; &lt; / p&gt;; lt; p&gt; 的颜色='chucknorris; /fucknt&gt;; /black&lt;/span&gt; lt; /p&gt;

whatwg html 的规格有精确的算法来解析遗留颜色值 。

用于解析颜色字符串的经典代码网景为开源: 网景/ lib/ layout/ layimage. c。

例如,请注意,每个字符都以十六位数进行剖析,然后在不检查溢出的情况下转换为32位数整数。只有八个十六位数适合32位数整数,这就是为什么只考虑最后八个字符的原因。在将十六位数转换为32位数整数之后,它们会通过将其除以16,然后将其切成八位数整数,直到它们合为八位数,这就是为什么忽略了前位零。

此代码不完全匹配规格中所定义的内容, 但唯一的区别是几行代码。 我认为是添加了这些线( 在网景 4 中 ) :

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

在遗留属性上分解颜色的规则涉及比现有答案中提到的步骤更多的步骤。

将所有字符全部丢弃,但最后的 8 个丢弃, 导致零 零 逐 1, 只要所有构件都有一个前零 丢弃, 所有字符除前 2 个全部丢弃

一些例子:

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

下面是算法的部分实施。它不处理错误或用户输入有效颜色的情况。

{/ / todo: 如果输入是“ ” 输入 = 输入. trim (); / / todo: 如果输入是“ 透明” / / todo: 如果输入是一个命名的颜色 / / todo: 如果输入匹配 rgb / / todo, 返回 rggb: 如果输入是“ 输入 ” , 则返回错误 rggb: 如果输入是“ 透明” / / todo : 如果输入是“ 透明” / / todo: 如果输入是“ 透明” / / todo : 返回相应的 rggb: 如果输入匹配 rgb / / todo: 返回 rggb: 如果输入匹配 rggb / / todo: 将 Unicode 代码点大于 u+ffff 替换为 00 (in. replace (/ {0- 9a- f)

浏览器试图将 Chucknorris 转换为十六进制颜色代码, 因为它不是一个有效的值 。

在 chucknorris 中, 除c 之外的所有字符都不是有效的十六进制值 。 所以它会被转换为 c00c000000。 它被分为 3, rg b 组( 结尾处为 0, 如果不是 3 的 乘以 3 ) 。 只有两个字符被选中, 因为它是允许的 。 它最终变成 c00000 , 红色的阴影 。

这似乎主要是与互联网探险家和歌剧(12)有关的问题,因为铬(31)和firefox(26)都忽略了这一点。

p.s. 括号中的数字是i 测试的浏览器版本。

Rajnikanth(印度的chuck noris)也与黑色的阴影对立:

000000000000000 *gt; 0a0000

在一个较轻的音符上

Chuck Norris不符合网络标准。 网络标准符合他的要求。

这是对网景日的拖延:

缺失的位数被作为 0[...] 处理。 不正确的位数被简单地解释为 0。 例如, 值 f0f0f0f0f0f0、 f0f0f0f、 fxfxfxx 和 fxfxfx 都是一样的 。

博客文章对微软互联网探险家的颜色剖析略略微含糊其辞, 包括不同颜色的长度等,

如果依次运用博客文章的规则,

以 0 替换所有非合法的十六进制字符 : chucknorris 变成 c00c00000 pad 到下一个字符总数 3 (11 & 12): c00c0000000 拆分为三个相等的组, 每个部分代表 rgb 颜色的相应颜色组成部分 : rgb (c00c, 0000, 0000) 将每个参数从右下移到两个字符 。

最后,取得以下结果:

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

这里举一个例子, 展示行动中的 bgcolor 属性, 来制作这个“ 模拟” 的颜色表 :

& lt; table&gt; 宽度= 8; tr&gt; & lt; lt; tr&gt; & lt; tdbcolor= "8" 宽度= "100" 宽度="center"; Chucknorris & lt;/ td&gt; & lt; tdbt; 宽度= "8" "Tlt; ffffffff"; tr&gt; "brt; mrt&t; / tddd&gt; " clatedd=" 单元格padding=" "8" Ninjaturtle" 宽度=" 100" 宽度="center" Style="col:ffff"dbgt&gt; d; dg; dg; dg; dg; dg; dg; dg; dg; dg;

这里还回答了问题的另一部分:为什么bgcolor=“楚克诺尔”产生黄色颜色?如果我们执行规则,字符串是:

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

当字符串开始为9个字符时,我们保留第二个“c”这一次,因此它最终成为最后的颜色值。

我最初遇到这个时 有人指出 你可以做彩色="破" 和,嗯,它出来棕色。