为什么HTML认为“;查克诺里斯”;这是一种颜色吗?

为什么HTML认为“;查克诺里斯”;这是一种颜色吗?,html,browser,background-color,Html,Browser,Background Color,为什么某些随机字符串在HTML中作为背景色输入时会产生颜色 例如: test大多数浏览器只会忽略颜色字符串中的任何非十六进制值,用零替换非十六进制数字 ChuCknorris转换为c00c0000000。此时,浏览器会将字符串分成三个相等的部分,分别表示红色、绿色和蓝色值:c00c 0000。每个部分中的额外位将被忽略,这使得最终结果为红色 注意,这不适用于遵循CSS标准的CSS颜色解析。 Redish 同上 黑色这是网景时代的遗留物: 缺少的数字被视为0[…]。不正确的数字仅解释为0。例如,

为什么某些随机字符串在HTML中作为背景色输入时会产生颜色

例如:


test
大多数浏览器只会忽略颜色字符串中的任何非十六进制值,用零替换非十六进制数字

ChuCknorris
转换为
c00c0000000
。此时,浏览器会将字符串分成三个相等的部分,分别表示红色、绿色和蓝色值:
c00c 0000
。每个部分中的额外位将被忽略,这使得最终结果为红色

注意,这不适用于遵循CSS标准的CSS颜色解析。 Redish

同上


黑色

这是网景时代的遗留物:

缺少的数字被视为0[…]。不正确的数字仅解释为0。例如,值#f0f0、f0f0、F0F0F、#fxfx和fxfx都是相同的

这是从博客文章,其中涵盖了非常详细的内容,包括不同长度的颜色值,等等

如果我们依次应用博客文章中的规则,我们会得到以下结果:

  • 将所有非有效十六进制字符替换为0:

    chucknorris becomes c00c0000000
    
  • 填充到可被3(11)整除的下一个字符总数→ 12) :

  • 分成三个相等的组,每个组分代表RGB颜色的相应颜色组分:

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

  • 最后得出以下结果:

    RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)
    
    下面的示例演示了
    bgcolor
    属性的作用,以生成此“惊人”色样:

    
    查克·诺里斯
    T先生
    忍者龟
    生病的
    废话
    草
    
    WHATWG HTML规范具有解析传统颜色值的精确算法:

    用于解析颜色字符串的Netscape Classic代码是开源的:

    例如,请注意,每个字符都被解析为十六进制数字,然后被移位为32位整数,而不检查溢出情况。一个32位整数只能包含八个十六进制数字,因此只考虑最后8个字符。在将十六进制数字解析为32位整数后,通过将其除以16,将其截断为8位整数,直到它们适合8位整数,这就是忽略前导零的原因

    更新:此代码与规范中定义的代码不完全匹配,但唯一的区别是有几行代码。我想是(在Netscape中)添加的:

    if(字节/值>4)
    {
    字节/val=4;
    }
    
    我很抱歉不同意,但是根据chucknorris发布的解析传统颜色值的规则,
    chucknorris
    并不等同于
    #CC0000
    ,而是
    #C00000
    ,一种非常相似但略有不同的红色色调。我用这个来验证这一点

    规则规定:

    • 通过添加0,使字符串的长度为3的倍数:
      chucknorris0
    • 将字符串分成3个等长字符串:
      chuc knor ris0
    • 将每个字符串截断为2个字符:
      ch kn ri
    • 保留十六进制值,必要时添加0:
      C000
    我能够使用这些规则正确解释以下字符串:

    • 幸运符
    • Luck
    • LuckBeALady
    • LuckBeALadyTonight
    • GangnamStyle


    更新:表示颜色为
    #CC0000
    的原始回答者已经编辑了他们的答案,以包含更正。

    浏览器正在尝试将chucknorris
    转换为十六进制颜色代码,因为它不是有效值

  • 在chucknorris
  • 中,除c以外的所有内容都不是有效的十六进制值
  • 因此,它被转换为
    C00C000000000
  • 它变成了一个红色的阴影
  • 这似乎是Internet Explorer和Opera的主要问题,因为Chrome(31)和Firefox(26)都忽略了这一点

    另外,括号中的数字是我测试的浏览器版本

    轻描淡写

    Chuck Norris不符合网络标准。符合Web标准 对他来说#BADA55


    回答:

    • 浏览器将尝试将chucknorris转换为十六进制值
    • 由于
      c
      chucknorris中唯一有效的十六进制字符,因此该值变为:
      C00C000000000
      0表示所有无效的值
    • 然后浏览器将结果分为3组:
      红色=c00c
      绿色=0000
      蓝色=0000
    • 由于html背景的有效十六进制值对于每种颜色类型只包含两位数字(rgb),因此从每组中截断最后两位数字,留下一个rgb值
      c00000
      ,这是砖红色调的颜色

    原因是浏览器无法理解它,并试图以某种方式将其转换为它能理解的内容,在本例中转换为十六进制值

    chucknorris
    c
    开头,这是一个十六进制的可识别字符,它还将所有无法识别的字符转换为
    0

    因此,十六进制格式的chucknorris变为:
    C00C000000000
    ,所有其他字符变为
    0
    ,而
    c
    保持不变

    现在它们被RGB(红色、绿色、蓝色)除以3<代码>R:c00c,G:0000,B:0000

    但是我们可以
    RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)
    
    bgcolor="#c00000";